Python写一个创意五子棋游戏

news/2024/5/9 16:07:47/文章来源:https://blog.csdn.net/SUEJESDA/article/details/132390225

前言

在本教程中,我们将使用Python写一个创意五子棋游戏

b1691e6f246947eeb06ee06469621bc2.gif

 

 

📝个人主页→数据挖掘博主ZTLJQ的主页

个人推荐python学习系列:

☄️爬虫JS逆向系列专栏 - 爬虫逆向教学

☄️python系列专栏 - 从零开始学python


首先

GomokuGame 类的构造函数 __init__ 初始化游戏。board_size 参数默认为 15,表示棋盘大小。board 是一个二维列表,代表棋盘上的状态。current_player 记录当前玩家,初始为 'X'。winner 记录胜利者,初始为 None。

class GomokuGame:def __init__(self, board_size=15):self.board_size = board_sizeself.board = [[' ' for _ in range(board_size)] for _ in range(board_size)]self.current_player = 'X'self.winner = None

print_board 方法用于打印当前棋盘的状态。首先,它打印列索引。然后,遍历每一行打印出当前行的棋子状态。

    def print_board(self):print("  " + " ".join(str(i) for i in range(self.board_size)))for i in range(self.board_size):print(str(i) + " " + " ".join(self.board[i]))print()

make_move 方法用于玩家落子。如果指定位置为空,将当前玩家的标记放置在该位置。然后调用 check_winner 方法检查是否有胜利者。最后,切换当前玩家。

    def make_move(self, row, col):if self.board[row][col] == ' ':self.board[row][col] = self.current_playerif self.check_winner(row, col):self.winner = self.current_playerself.current_player = 'X' if self.current_player == 'O' else 'O'return Truereturn False

check_winner 方法用于检查是否有玩家获胜。它通过检查当前位置的四个方向来判断是否有五个连续相同的棋子。如果存在,则返回 True,表示有玩家获胜。

    def check_winner(self, row, col):directions = [(0, 1), (1, 0), (1, 1), (1, -1)]for dr, dc in directions:count = 1for i in range(1, 5):r, c = row + i * dr, col + i * dcif 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:count += 1else:breakfor i in range(1, 5):r, c = row - i * dr, col - i * dcif 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:count += 1else:breakif count >= 5:return Truereturn False

play 方法是游戏的主循环。它持续运行直到有玩家获胜。在每一轮中,它打印当前棋盘,然后获取玩家输入的行和列,进行落子操作。如果落子无效,则要求玩家重新输入。如果有玩家获胜,则打印胜利信息并结束游戏。

    def play(self):while not self.winner:self.print_board()try:row = int(input("玩家{}的回合,请输入你要下的行数: ".format(self.current_player)))col = int(input("请输入你要下的列数: "))if 0 <= row < self.board_size and 0 <= col < self.board_size:if self.make_move(row, col):if self.winner:self.print_board()print("玩家{},你赢了".format(self.winner))breakelse:print("无效移动。再试一次。")else:print("输入无效。再试一次。")except ValueError:print("输入无效。输入一个数字。")

在代码的末尾,通过这个条件判断,确保仅在直接运行该脚本时才会执行创建游戏对象并开始游戏。

if __name__ == "__main__":game = GomokuGame()game.play()

下面是完全代码,可以直接复制运行

class GomokuGame:def __init__(self, board_size=15):self.board_size = board_sizeself.board = [[' ' for _ in range(board_size)] for _ in range(board_size)]self.current_player = 'X'self.winner = Nonedef print_board(self):print("  " + " ".join(str(i) for i in range(self.board_size)))for i in range(self.board_size):print(str(i) + " " + " ".join(self.board[i]))print()def make_move(self, row, col):if self.board[row][col] == ' ':self.board[row][col] = self.current_playerif self.check_winner(row, col):self.winner = self.current_playerself.current_player = 'X' if self.current_player == 'O' else 'O'return Truereturn Falsedef check_winner(self, row, col):directions = [(0, 1), (1, 0), (1, 1), (1, -1)]for dr, dc in directions:count = 1for i in range(1, 5):r, c = row + i * dr, col + i * dcif 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:count += 1else:breakfor i in range(1, 5):r, c = row - i * dr, col - i * dcif 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:count += 1else:breakif count >= 5:return Truereturn Falsedef play(self):while not self.winner:self.print_board()try:row = int(input("玩家{}的回合,请输入你要下的行数: ".format(self.current_player)))col = int(input("请输入你要下的列数: "))if 0 <= row < self.board_size and 0 <= col < self.board_size:if self.make_move(row, col):if self.winner:self.print_board()print("玩家{},你赢了".format(self.winner))breakelse:print("无效移动。再试一次。")else:print("输入无效。再试一次。")except ValueError:print("输入无效。输入一个数字。")if __name__ == "__main__":game = GomokuGame()game.play()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_159123.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件上传xxx

本地保存文件 将文件保存到服务器本地硬盘中 max-request-size 多个文件总大小不能大于100M PostMapping("/upload")public Result upload(String username,Integer age,MultipartFile image) throws IOException {log.info("用户名:{},牛叔&#xff1a;{},文件…

【机器学习实战】朴素贝叶斯:过滤垃圾邮件

【机器学习实战】朴素贝叶斯&#xff1a;过滤垃圾邮件 0.收集数据 这里采用的数据集是《机器学习实战》提供的邮件文件&#xff0c;该文件有ham 和 spam 两个文件夹&#xff0c;每个文件夹中各有25条邮件&#xff0c;分别代表着 正常邮件 和 垃圾邮件。 这里需要注意的是需要…

蓝牙 - BLE SPP的设计策略(Serial over BLE strategy)

在开发 BLE 连接产品的过程中&#xff0c;你可能会有这样的疑问&#xff1a;"Serial profile在哪里&#xff1f;也许你以为你在蓝牙技术联盟网站上滚动浏览长长的profile列表时错过了它。又或者&#xff0c;你根本就没去看&#xff0c;而是准备选择更快的方法&#xff0c;…

人脸识别技术在社会安全与便利中的应用

引言&#xff1a;随着人工智能的快速发展&#xff0c;人脸识别技术已经成为一种实时、高效的身份验证和安全监控手段。它的广泛应用可以帮助识别犯罪嫌疑人、寻找失踪人口等&#xff0c;为社会安全和公共利益做出了重要贡献。本文将详细探讨人脸识别技术的原理、应用&#xff0…

【高级IO】- 五种 IO 模型 | 多路转接 - select

IO的基本概念 I/O&#xff08;Input / output&#xff09;就是输入和输出&#xff0c;在冯诺依曼体系中&#xff0c;将数据从输入设备拷贝到内存叫做输入&#xff0c;将数据从内存拷贝到输出设备叫做输出。 对文件进行的读写操作本质就是一种IO&#xff0c;文件IO对应的外设就…

Linux命令200例:clock的具体应用,设置系统的时钟时间、硬件时钟和定时器等相关信息

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

前端对文件转换处理的一些常用方法

文章目录 0&#xff0c;前言1&#xff0c;将图片的url网络链接(http://) 转为base64格式2&#xff0c;将base64的图片数据转换为file文件3&#xff0c;将以base64的图片数据转换为Blob4&#xff0c;将file文件转化为base645&#xff0c;将file文件转换为Blob6&#xff0c;获取文…

微信公众平台发布小程序流程

最近因为部署小程序&#xff0c;学习了下如何部署小程序 1. 取消不检验合法域名并上传小程序 建议在小程序上传之前&#xff0c;先取消不校验合法域名并真机调试下。 2. 登录微信公众平台 登录微信公众平台 3. 设置服务器域名 在开放->开发管理->开发设置找到服务器…

三维重建_基于图像的三维重建_面片/光度一致性

参考: 深蓝学院 基于图像的三维重建 1. 三维重建的流程回顾 基于深度图的三维重建:从无序图像获取稀疏点云和位姿,然后进行多视角立体重建。 多视角立体重建包含:(输入稀疏点云、各个图像位姿、图像)先进行立体对(3D-2D,2D-2D)的选择,然后计算深度图,接着进行深度图…

【C语言】C语言用数组算平均数,并输出大于平均数的数

题目 让用户输入一系列的正整数&#xff0c;最后输入“-1”表示输入结束&#xff0c;然后程序计算出这些数的平均数&#xff0c;最后输出输入数字的个数和平均数以及大于平均数的数 代码 #include<stdio.h> int main() {int x;double sum 0;int cnt 0;int number[100…

使用 AI 将绘画和照片转换为动画

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 华盛顿大学和Facebook的研究人员最近发表了一篇论文&#xff0c;展示了一种基于深度学习的系统&#xff0c;可以将静止图像和绘画转换为动画。称为照片唤醒的算法使用卷积神经网络从单个静止图像以 …

WPF入门到精通:1.新建项目及项目结构

WPF&#xff08;Windows Presentation Foundation&#xff09;是一种用于创建 Windows 应用程序的技术&#xff0c;它可以通过 XAML&#xff08;Extensible Application Markup Language&#xff09;和 C# 或其他 .NET 语言来实现。WPF 提供了许多强大的 UI 控件和样式&#xf…

如何找到一个数的所有质因数,以及如何快速判断一个数是不是质数

前情介绍 今天遇到一个需求&#xff1a;找到一个数所有的质因数。 初步解决 先定义一个判断质数的函数&#xff1a; def is_Prime(number):i 2count 0while i < number:if number % i 0 :count 1i 1if count > 0:return Falseelse:return True 接着定义一个寻找质…

Java-图书登录系统的实现

实现效果 它将面对 管理员 和 普通用户 两种用户来提供服务&#xff0c;并且各自的服务并不相同。 实现思路 一般写项目&#xff0c;每个独立的功能都会写成一个类&#xff0c;而有关联的功能&#xff0c;都会将多个类存放在一个包中&#xff0c;此项目我们将用 3 个包来体现我…

链表之第三回

欢迎来到我的&#xff1a;世界 该文章收入栏目&#xff1a;链表 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言第一题&#xff1a;判断是否为环形链表第二题&#xff1a;找到两条链表的相交点第三题&#xff1a;返回…

P17~P18 电路定理 电路中难得的精彩到极致的电路理论

特勒根定理、互易定理、对偶定理比较难&#xff0c;非常重要&#xff0c;因为他们可以解决其他定理无法解决的问题。 1、特勒根定理1——个人感觉像能量守恒 特勒根定理与基尔霍夫定理齐名&#xff0c;与拓扑结构有关。都适用于任何线性非线性&#xff0c;时变的非时变的元件…

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 目录 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式&#xff1a; …

网站老域名跳转到新域名有哪些方法?内网穿透内网主机让外网访问

在网站服务器变更及本地主机搭建时&#xff0c;我们经常会遇到老域名地址跳转到新URL的配置&#xff0c;一些朋友还会面对无公网IP让外网访问的问题。今天我们来了解下网站老域名跳转到新域名有哪些方法&#xff0c;以及如何通过内网穿透实现内网主机让外网访问。 网站老域名跳…

Mac上传项目源代码到GitHub的修改更新

Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github&#xff0c;不得不说&#xff0c;真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先&#xff0c;在本地终端命令行打开至项目文件下第一步&#xff1a;查看当前的git仓库状态&#xff0c;可以使用git…

线上异常的处理

一、线上问题的排查 进程ID 简称为PID free -m 查看内存使用情况 iostat 查看磁盘读写活动情况 netstat 查看网络连接情况 df -h 查看磁盘空间使用情况 du -sh 查看文件大小情况 1.1、top 命令查看CPU占用情况 top -n num 查看CPU占用最高的num个进程top -Hp PID 或 top -H -p…