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…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
