python游戏开发之五子棋游戏制作
五子棋是一种源自中国的传统棋类游戏,起源可以追溯到古代。它是一种两人对弈的游戏,使用棋盘和棋子进行。棋盘通常是一个 15×15 的网格,棋子分为黑白两色,双方轮流在棋盘上落子。游戏的目标是通过在棋盘上落子,使自己的五个棋子在横向、纵向或斜向形成连续的线路,从而获胜。
五子棋被认为是一种智力游戏,它要求玩家在竞技中思考对手的走法并制定自己的策略。由于规则简单、易于上手,五子棋在中国以及世界各地都很受欢迎,并且有许多不同的变种和玩法。笔者选择了一个最原始最简易的一个简易五子棋的程序,采用文本界面操作。
源码获取:


主要源代码展示
`
# 检查水平方向
count = 0
for i in range(max(0, col - 4), min(15, col + 5)):if board[row][i] == player:count += 1if count == 5:return Trueelse:count = 0# 检查垂直方向
count = 0
for i in range(max(0, row - 4), min(15, row + 5)):if board[i][col] == player:count += 1if count == 5:return Trueelse:count = 0# 检查斜向(\)方向
count = 0
for i in range(-4, 5):r = row + ic = col + iif r < 0 or r >= 15 or c < 0 or c >= 15:continueif board[r][c] == player:count += 1if count == 5:return Trueelse:count = 0# 检查斜向(/)方向
count = 0
for i in range(-4, 5):r = row + ic = col - iif r < 0 or r >= 15 or c < 0 or c >= 15:continueif board[r][c] == player:count += 1if count == 5:return Trueelse:count = 0return Falseboard = [["." for _ in range(15)] for _ in range(15)]
players = ["X", "O"]
current_player = 0
print_board(board)while True:print(f"Player {players[current_player]}'s turn:")try:row = int(input("Enter row (0-14): "))col = int(input("Enter col (0-14): "))if row < 0 or row >= 15 or col < 0 or col >= 15 or board[row][col] != ".":raise ValueErrorexcept ValueError:print("Invalid input. Try again.")continueboard[row][col] = players[current_player]print_board(board)if check_win(board, row, col, players[current_player]):print(f"Player {players[current_player]} wins!")breakcurrent_player = (current_player + 1) % 2
通过改进,新增了可使用鼠标交互的效果,相比较于原始的代码,大大提高了游戏体验性,并且使游戏界面更加易于操作,在游戏体验上大大增加也玩性。
原始代码
`import pygame
import sys
游戏设置
CELL_SIZE = 40
BOARD_SIZE = 15
WINDOW_WIDTH = CELL_SIZE * BOARD_SIZE
WINDOW_HEIGHT = CELL_SIZE * BOARD_SIZE
LINE_COLOR = (0, 0, 0)
BG_COLOR = (139, 69, 19) # 棕色背景
初始化游戏
pygame.init()
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption(“五子棋”)
clock = pygame.time.Clock()
board = [[’ ’ for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = ‘X’
game_over = False
def draw_board():
screen.fill(BG_COLOR)
for i in range(BOARD_SIZE):
pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE),
(WINDOW_WIDTH - CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE))
pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2 + i * CELL_SIZE, CELL_SIZE // 2),
(CELL_SIZE // 2 + i * CELL_SIZE, WINDOW_HEIGHT - CELL_SIZE // 2))
def draw_piece(row, col, player):
x = col * CELL_SIZE + CELL_SIZE // 2
y = row * CELL_SIZE + CELL_SIZE // 2
if player == ‘X’:
pygame.draw.circle(screen, (0, 0, 0), (x, y), CELL_SIZE // 3)
else:
pygame.draw.circle(screen, (255, 255, 255), (x, y), CELL_SIZE // 3)
def check_win(row, col):
directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
for d in directions:
count = 1
for i in range(1, 5):
if 0 <= row + i * d[0] < BOARD_SIZE and 0 <= col + i * d[1] < BOARD_SIZE and
board[row + i * d[0]][col + i * d[1]] == current_player:
count += 1
else:
break
for i in range(1, 5):
if 0 <= row - i * d[0] < BOARD_SIZE and 0 <= col - i * d[1] < BOARD_SIZE and
board[row - i * d[0]][col - i * d[1]] == current_player:
count += 1
else:
break
if count >= 5:
return True
return False
def display_winner(player):
font = pygame.font.Font(None, 36)
if player == ‘X’:
text = font.render(“Black wins!”, True, (255, 0, 0))
else:
text = font.render(“White wins!”, True, (255, 0, 0))
text_rect = text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2))
screen.blit(text, text_rect)
游戏循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:
x, y = event.pos
col = x // CELL_SIZE
row = y // CELL_SIZE
if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == ’ ':
board[row][col] = current_player
draw_piece(row, col, current_player)
if check_win(row, col):
print(f"Player {current_player} wins!")game_over = Truecurrent_player = 'O' if current_player == 'X' else 'X'draw_board()
for row in range(BOARD_SIZE):for col in range(BOARD_SIZE):if board[row][col] != ' ':draw_piece(row, col, board[row][col])if game_over:display_winner(current_player)pygame.display.flip()
clock.tick(30)
`import pygame
import sys
游戏设置
CELL_SIZE = 40
BOARD_SIZE = 15
WINDOW_WIDTH = CELL_SIZE * BOARD_SIZE
WINDOW_HEIGHT = CELL_SIZE * BOARD_SIZE
LINE_COLOR = (0, 0, 0)
BG_COLOR = (139, 69, 19) # 棕色背景
初始化游戏
pygame.init()
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption(“五子棋”)
clock = pygame.time.Clock()
board = [[’ ’ for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = ‘X’
game_over = False
def draw_board():
screen.fill(BG_COLOR)
for i in range(BOARD_SIZE):
pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE),
(WINDOW_WIDTH - CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE))
pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2 + i * CELL_SIZE, CELL_SIZE // 2),
(CELL_SIZE // 2 + i * CELL_SIZE, WINDOW_HEIGHT - CELL_SIZE // 2))
def draw_piece(row, col, player):
x = col * CELL_SIZE + CELL_SIZE // 2
y = row * CELL_SIZE + CELL_SIZE // 2
if player == ‘X’:
pygame.draw.circle(screen, (0, 0, 0), (x, y), CELL_SIZE // 3)
else:
pygame.draw.circle(screen, (255, 255, 255), (x, y), CELL_SIZE // 3)
def check_win(row, col):
directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
for d in directions:
count = 1
for i in range(1, 5):
if 0 <= row + i * d[0] < BOARD_SIZE and 0 <= col + i * d[1] < BOARD_SIZE and
board[row + i * d[0]][col + i * d[1]] == current_player:
count += 1
else:
break
for i in range(1, 5):
if 0 <= row - i * d[0] < BOARD_SIZE and 0 <= col - i * d[1] < BOARD_SIZE and
board[row - i * d[0]][col - i * d[1]] == current_player:
count += 1
else:
break
if count >= 5:
return True
return False
def display_winner(player):
font = pygame.font.Font(None, 36)
if player == ‘X’:
text = font.render(“Black wins!”, True, (255, 0, 0))
else:
text = font.render(“White wins!”, True, (255, 0, 0))
text_rect = text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2))
screen.blit(text, text_rect)
游戏循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:
x, y = event.pos
col = x // CELL_SIZE
row = y // CELL_SIZE
if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == ’ ':
board[row][col] = current_player
draw_piece(row, col, current_player)
if check_win(row, col):
print(f"Player {current_player} wins!")
game_over = True
current_player = ‘O’ if current_player == ‘X’ else ‘X’
draw_board()
for row in range(BOARD_SIZE):for col in range(BOARD_SIZE):if board[row][col] != ' ':draw_piece(row, col, board[row][col])if game_over:display_winner(current_player)pygame.display.flip()
clock.tick(30)



结语:
它通过简洁明了的语法和逻辑结构,提高了代码的可读性和可维护性。通过引入交互性更强的用户输入方式,使得玩家可以更直观地参与游戏,增强了游戏的可玩性和用户体验。总的来说,这段 Python 在保持游戏逻辑不变的情况下,提升了代码的质量和可玩性,为开发者和玩家带来了更好的体验。
如有侵权,请联系删除。
相关文章:
python游戏开发之五子棋游戏制作
五子棋是一种源自中国的传统棋类游戏,起源可以追溯到古代。它是一种两人对弈的游戏,使用棋盘和棋子进行。棋盘通常是一个 1515 的网格,棋子分为黑白两色,双方轮流在棋盘上落子。游戏的目标是通过在棋盘上落子,使自己的…...
文件上传绕过最新版安全狗
本文来源无问社区,更多实战内容,渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/9960.html http分块传输绕过 http分块传输⼀直是⼀个很经典的绕过⽅式,只是在近⼏年分块传输⼀直被卡的很死,很多waf都开始加 …...
常用API_2:应用程序编程接口:ArrayList
文章目录 ArrayList常用方法 案例 :上菜 ArrayList 常用方法 来自黑马程序员学习视频 案例 :上菜 待完善...
【Linux操作系统】进程的基本概念(PCB对象)详解
目录 一、进程的基本概念二、进程的描述组织(PCB对象)1.PCB的基本概念2.为什么要有PCB对象(操作系统对进程的组织管理)3.PCB对象的内部属性(tast_struct结构体) 三、查看进程1.ps指令2.top指令3.通过 /proc…...
曙光宁畅中科可控所有服务器机型出厂默认IPMI用户密码
机型 默认IP 用户名/密码 通用 SG机型 DHCP admin/admin 通用 KK机型 DHCP admin/admin 通用 NC 机型 DHCP Admin/Admin5000 I420-G10、I620-G15、I650-G15、I840-GS、I840-G10、I840-G25、I980-G10、A420r-G、A620r-G、A840-G10、TC4600刀片、TC46…...
mysql查线上数据注意数据库的隔离级别
数据库的隔离级别定义了一个事务可能对其他并发事务的可见性,以及它们可能对数据库的影响。隔离级别的选择影响着并发性能和数据的一致性,不同的隔离级别能够防止不同程度的并发问题,如脏读(Dirty Reads)、不可重复读&…...
【专业解析】移动硬盘能识别却打不开:数据恢复实战指南
在数字化时代,移动硬盘作为我们存储重要数据的主要工具之一,其稳定性和安全性直接关系到信息的完整与便捷访问。然而,不少用户会遇到一个令人头疼的问题:移动硬盘能被电脑识别,但尝试打开时却遭遇失败,这往…...
系统 hap
sdk\toolchains\lib\UnsgnedReleasedProfileTemplate.json 各个权限需要的等级 OpenAtom OpenHarmony { "version-name":"2.0.0", "version-code":2, "app-distribution-type":"os_integration", "…...
【Material-UI】按钮与第三方路由库的集成详解
文章目录 一、ButtonBase 组件简介二、与第三方路由库的集成1. React Router示例代码 2. Next.js示例代码 三、客户端导航的优势四、其他自定义集成1. 使用自定义组件示例代码 五、总结 在现代前端开发中,单页应用(SPA)变得越来越普遍。这种应…...
Python获取Excel内容
Python获取Excel内容 目录 Python获取Excel内容1.读取Excel并登陆2.下载Excel中图片 数据存储到列表3.上传到接口 需求:获取xlsx files目录下的所有Excel信息,并将数据打包成字典格式上传到接口 示例数据: 1.读取Excel并登陆 import os impo…...
python实现小游戏随机猜数
1、脚本练习 import random# 初始化剩余的猜测次数 counts 3 # 生成一个1到10之间的随机整数 numb random.randint(1, 10)# 循环直到猜测次数用完 while counts > 0:tmp input("请输入小鱼手里的数字 (你还剩下 {} 次机会): ".format(counts))guess int(tmp)…...
YOLOv5与YOLOv8 训练准备工作(不包含环境搭建)
前言:我发现除了安装环境需要耗费大量时间以外,对于训练前的准备工作也要琢磨一段时间,所以本篇主要讲一下训练前需要准备的工作(主要是XML格式换为txt,以及划分数据集验证集,和训练参数的设置)…...
字节跳动发Seed-TTS语音合成模型,可模仿任意人的声音,效果逼真
前期我们介绍过很多语音合成的模型,比如ChatTTS,微软语音合成大模型等,随着大模型的不断进步,其合成的声音基本跟真人没有多大的区别。本期介绍的是字节跳动自家发布的语音合成模型Seed-TTS。 Seed-TTS 推理包含四个功能模块&…...
微信小程序教程011-3:京西购物商城实战之Home页实现
文章目录 3、首页3.0 创建home分支3.1 配置网络请求3.2 轮播图区域3.2.1 请求轮播图的数据3.2.2 渲染轮播图的UI结构3.2.3 配置小程序分包3.2.4 点击轮播图跳转到商品详情页3.2.5 封装 uni.$showMsg() 方法3.3 分类导航区域3.3.1 获取分类导航的数据3.3.2 渲染分类导航的UI结构…...
使用 Manim 创建一个二维坐标平面【NumberPlane】
NumberPlane 是 Manim 中用于创建一个二维坐标平面的类。它可以帮助用户在场景中可视化坐标轴、网格线以及其他数学概念。具体来说,它的功能包括: 坐标轴:NumberPlane 提供了 x 轴和 y 轴,通常是中心对称的,允许用户清…...
Android.mk(TODO)
Android.mk 文件是 Android 构建系统(基于 GNU Make)的一个核心部分,用于定义如何构建项目中的模块。在 Android 中,Android.mk 文件主要用于描述本地模块(如库、可执行文件等)的构建信息。以下是 Android.…...
WPF datagrid 选中某一行后让第一列的checkbox选中
在 WPF 中的 DataGrid 中,如果希望在选中某一行后让该行的第一列中的 CheckBox 选中,可以通过绑定和事件处理来实现。以下是具体的步骤: 绑定数据:确保 DataGrid 的数据源绑定到一个支持 INotifyPropertyChanged 接口的集合。模板…...
洛谷 P1347 排序(福建省历届夏令营)(图论:拓扑排序)
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列 A,B,C,D表示 A<B,B<C,C<D。在这道题中,我们将给你一系列形如 A<B的关系,并要求你判断是否能够根据这些关系确定这个…...
Redis 缓存击穿、穿透、雪崩
1. 缓存击穿 问题描述: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又都去数据库去取数据,引起数据库压力瞬间增大…...
使用开源RustDesk部署远程控制服务
使用开源RustDesk部署远程控制服务 文档编写时间:2024/8/1 一、部署环境 操作系统:Ubuntu 2204 LTS IP地址:192.168.108.115 开源软件项目地址:rustdesk/rustdesk-server: RustDesk Server Program (github.com) 参考文档&a…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
uniapp获取当前位置和经纬度信息
1.1. 获取当前位置和经纬度信息(需要配置高的SDK) 调用uni-app官方API中的uni.chooseLocation(),即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...
【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级
概述 在历经半个月的间歇性开发后,RagflowPlus再次迎来一轮升级,正式发布v0.4.0。 开源地址:https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码: git clone https://github.com/zstar1003/ragflow-plus.…...
