用Python写一个五子棋小游戏
off999 2024-12-04 14:37 18 浏览 0 评论
在这篇文章中,我将带你一步步实现一个简单的五子棋小游戏。我们将使用Python来编写游戏的逻辑,并在控制台中进行对弈。通过这个项目,你可以学习到如何使用Python处理二维数组、循环控制以及基本的游戏逻辑设计。
五子棋游戏简介
五子棋是一个经典的两人棋类游戏。玩家轮流在棋盘上放置黑白棋子,先在横、竖、或对角线上形成连续五个棋子的一方获胜。我们将通过Python来实现这一游戏,并允许两个玩家在控制台中进行对弈。
项目概述
我们将实现以下功能:
- 棋盘初始化:创建一个空的棋盘。
- 棋子放置:允许玩家在棋盘上选择位置放置棋子。
- 胜负判断:每次放置棋子后判断当前玩家是否获胜。
- 棋盘展示:实时更新并展示棋盘状态。
- 游戏主循环:控制游戏流程,使两个玩家轮流下棋。
步骤一:棋盘初始化
首先,我们需要一个空的棋盘。我们可以用一个二维列表来表示这个棋盘。一个简单的5x5棋盘可以这样表示:
def create_board(size=5): return [[' ' for _ in range(size)] for _ in range(size)]步骤二:棋子放置
接下来,玩家需要选择一个位置放置棋子。我们可以通过坐标来选择位置,然后更新棋盘。
def place_piece(board, row, col, piece): if board[row][col] == ' ': board[row][col] = piece return True return False步骤三:胜负判断
为了判断当前玩家是否获胜,我们需要检查最近放置的棋子所在行、列和对角线上的五子是否连成一线。
def check_winner(board, piece): size = len(board)
# 检查行
for row in board: if piece * 5 in ''.join(row): return True
# 检查列
for col in range(size): if piece * 5 in ''.join(board[row][col] for row in range(size)): return True
# 检查对角线 for d in range(-size + 1, size): if piece * 5 in ''.join(board[row][col] for row, col in enumerate(range(d, d + size)) if 0 <= row < size and 0 <= col < size): return True if piece * 5 in ''.join(board[row][col] for row, col in enumerate(range(size - 1 - d, size - 1 - d - size, -1)) if 0 <= row < size and 0 <= col < size): return True return False步骤四:棋盘展示
每次玩家下棋后,我们都需要展示当前的棋盘状态。
def print_board(board): size = len(board) print(' ' + ' '.join(str(i) for i in range(size))) for i, row in enumerate(board): print(f"{i} " + '|'.join(row)) if i < size - 1: print(' ' + '-' * (size * 2 - 1))步骤五:游戏主循环
最后,我们将所有部分整合在一起,形成游戏的主循环,控制两个玩家的交替下棋。
def play_game(): board = create_board(10) current_piece = 'X' while True: print_board(board) print(f"Player {current_piece}'s turn") row = int(input("Enter row: ")) col = int(input("Enter col: ")) if place_piece(board, row, col, current_piece): if check_winner(board, current_piece): print_board(board) print(f"Player {current_piece} wins!") break current_piece = 'O' if current_piece == 'X' else 'X' else: print("Invalid move. Try again.")总结
在这篇文章中,我们使用Python实现了一个简单的五子棋小游戏。通过这个项目,你不仅可以体验到游戏开发的乐趣,还能学习到如何处理二维数组、实现简单的算法以及控制程序流程。如果你感兴趣,可以继续扩展这个项目,例如增加AI对手、优化胜负判断算法、或者将其改造成图形化界面游戏。
希望这篇文章对你有所帮助,欢迎你在评论区分享你的实现以及任何疑问!完整代码如下:
import tkinter as tk
from tkinter import messagebox
class GomokuGame:
def __init__(self, root, board_size=10, win_length=5):
self.root = root
self.root.title("五子棋")
self.board_size = board_size
self.win_length = win_length
self.board = [[' ' for _ in range(board_size)] for _ in range(board_size)]
self.current_piece = 'X'
self.buttons = []
self.create_widgets()
def create_widgets(self):
"""创建棋盘按钮。"""
for r in range(self.board_size):
row = []
for c in range(self.board_size):
button = tk.Button(self.root, text=" ", width=4, height=2,
command=lambda r=r, c=c: self.on_button_click(r, c))
button.grid(row=r, column=c)
row.append(button)
self.buttons.append(row)
def on_button_click(self, row, col):
"""当棋盘按钮被点击时的处理函数。"""
if self.board[row][col] == ' ':
self.board[row][col] = self.current_piece
self.buttons[row][col].config(text=self.current_piece)
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", f"玩家 {self.current_piece} 获胜!")
self.reset_game()
else:
self.current_piece = 'O' if self.current_piece == 'X' else 'X'
else:
messagebox.showwarning("无效操作", "该位置已经有棋子了,请选择其他位置。")
def check_winner(self, row, col):
"""检查是否有玩家获胜。"""
directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
for dr, dc in directions:
count = 1
for i in range(1, self.win_length):
r, c = row + dr * i, col + dc * i
if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_piece:
count += 1
else:
break
for i in range(1, self.win_length):
r, c = row - dr * i, col - dc * i
if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_piece:
count += 1
else:
break
if count >= self.win_length:
return True
return False
def reset_game(self):
"""重置游戏状态。"""
self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
self.current_piece = 'X'
for r in range(self.board_size):
for c in range(self.board_size):
self.buttons[r][c].config(text=" ")
if __name__ == "__main__":
root = tk.Tk()
game = GomokuGame(root)
root.mainloop()
相关推荐
- xp系统永久激活密钥2020年(xp系统激活秘钥)
-
windowsxp产品密钥大全YBVJB-YV2JW-7FHPT-6D8XG-RT83GHRXTR-FKTCV-X8QCH-D7PTH-KYYPBJF8MD-XB4Y4-HHB28-Q3G2K-QW...
- 手写中文输入法下载安装(中文手写输入器)
-
1、首先第一步就是打开手机主界面,然后依次打开“设置”、“通用”、“键盘”,2、跳转的页面再点击“键盘”,3、勾选自己喜欢的中文手写模式,最后点击设定即可。仅参考先打开手机设置,然后点击一个语言和输入...
- office2007的产品密钥(office 产品密钥)
-
下载一个kms软件关闭杀毒软件大概三十秒就会完成相应的注册然后就可以正常的使用了
- 十大杀毒app排行(知名杀毒软件)
-
360安全卫士今天就为您推荐杀毒软件排行榜第一的免费软件——360安全卫士,首创即扫即清功能,操作流程更简单,而且在用户使用过程当中还能有效拦截病毒的侵入,提供强力守护。状元:BitDefender ...
- 笔记本怎么关闭防火墙(笔记本怎么关掉防火墙)
-
Win10教育版关闭防火墙设置方法 步骤1、在Win10桌面这台电脑图标上右键,然后选择“属性”。 步骤2、进入这台电脑属性之后,再点击左上角的“控制面板主页”。 步骤3、进入Win10控制面板...
- 32g内存还需要虚拟内存吗(32g内存还需要虚拟内存吗 知乎)
-
还需要的。虚拟内存是一定要的。就算你32G内存也是需要一个虚拟的转换空间。这个可以自己手动设置7000M左右就可以了,不用设置太大,没有用。虚拟内存是一定要的。就算你32G内存也是需要一个虚拟的...
- windows补丁怎么更新(windows 补丁更新)
-
windowsserver系统补丁升级的方法,1.打开WindowsServer系统运行对话框;2.在对话框中输入“control”;3.系统控制面板窗口自动打开;4.点击“Systemand...
- 电脑打不开了怎么重装系统(电脑打不开怎么重装系统不用u盘)
-
1、在可用电脑上制作好U盘启动盘,将下载的电脑系统iso文件直接复制到U盘的GHO目录下;2、在开不了机的电脑上插入U盘,重启后不停按F12或F11或Esc等快捷键打开启动菜单,选择U盘选项回车,比如...
- 一键清理垃圾下载(一键清除垃圾软件下载)
-
手机弹出广告是因为手机上的软件自动推送广告,可以在手机设置里关闭应用的消息通知,方法如下:1、找到手机设置,点击进入2、找到应用和通知,点击进入3、点击通知管理,点击进入4、我们可以看到自己开启消息通...
- ghost下载中文版官网(ghost8.0下载)
-
如果你下载的ghostwin7文件如果是用于系统安装。是不是映像文件要符合以下要求:1,压缩包完好无损。2,减压后的映像文件后缀名为ISO或者GHO.3,文件要在硬盘根目录才便于识别。4,映像文件后缀...
- win10最新版本是多少2025(win10最新版本是20h2吗)
-
1、打开软件,选择需要安装的win10系统。(4g以上内存选择64位系统)2、接着我们耐心等待下载重装资源。3、资源下载完成后,等待环境部署完毕重启即可。4、进入到pe系统后,打开小白工具,选择安装的...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
