Python五子棋程序实现详解

Python五子棋程序实现详解

    • 引言
    • 功能实现
      • 显示棋盘
      • 点击落子
      • 判断胜负
      • 游戏结束判断
      • 交替落子
    • 运行结果
    • 完整代码
    • 总结

引言

五子棋是一种广泛传播的策略棋类游戏,两人对弈,通过在棋盘上落子,以先形成连续的相同颜色的五子棋为胜利条件。本文将介绍如何使用Python编写一个简单的五子棋程序,实现了五子棋游戏的基本功能。

功能实现

显示棋盘

首先,我们需要在程序中显示一个19x19的五子棋棋盘。使用tkinter库可以快速实现可视化界面的搭建。

# 定义常量
ROWS = 19
COLS = 19
PADDING = 30
GRID_SIZE = 20# 创建棋盘
board = [[0] * COLS for _ in range(ROWS)]# 创建窗口
window = tk.Tk()
window.title("五子棋")
window.geometry(str(COLS * GRID_SIZE + PADDING * 2) + "x" + str(ROWS * GRID_SIZE + PADDING * 2 + 40))# 创建画布
canvas = tk.Canvas(window, width=COLS * GRID_SIZE + PADDING * 2, height=ROWS * GRID_SIZE + PADDING * 2, bg="burlywood")
canvas.place(x=0, y=PADDING)# 绘制棋盘线
for i in range(ROWS):canvas.create_line(PADDING, i * GRID_SIZE + PADDING, COLS * GRID_SIZE + PADDING - GRID_SIZE, i * GRID_SIZE + PADDING)
for i in range(COLS):canvas.create_line(i * GRID_SIZE + PADDING, PADDING, i * GRID_SIZE + PADDING, ROWS * GRID_SIZE + PADDING - GRID_SIZE)# 绘制黑点
for i in range(3, ROWS, 6):for j in range(3, COLS, 6):canvas.create_oval(j * GRID_SIZE + PADDING - 3, i * GRID_SIZE + PADDING - 3,j * GRID_SIZE + PADDING + 3, i * GRID_SIZE + PADDING + 3, fill="black")

以上代码使用tkinter库创建了一个窗口,并在窗口内创建了一个棋盘。我们使用了Canvas组件来绘制棋盘上的线条和黑点。

点击落子

接下来,我们需要实现在棋盘上点击鼠标落子的功能。

def on_click(event):# 处理鼠标点击事件row = round((event.y - PADDING) / GRID_SIZE)col = round((event.x - PADDING) / GRID_SIZE)if row < 0 or row >= ROWS or col < 0 or col >= COLS:# 落子在棋盘外侧messagebox.showinfo("提示", "不可以落子在棋盘外哦!")returnif not is_valid_move(row, col):# 提示落子位置已有棋子messagebox.showinfo("提示", "此处已有棋子,不可重复落子")returnglobal current_playerif current_player == 1:  # 蓝方玩家color = "blue"label.config(text="红方玩家的回合")else:  # 红方玩家color = "red"label.config(text="蓝方玩家的回合")board[row][col] = current_playerx = col * GRID_SIZE + PADDINGy = row * GRID_SIZE + PADDINGcanvas.create_oval(x - GRID_SIZE // 2, y - GRID_SIZE // 2, x + GRID_SIZE // 2, y + GRID_SIZE // 2, fill=color)if is_winner(current_player):if current_player == 1:messagebox.showinfo("游戏结束", "蓝方玩家获胜")else:messagebox.showinfo("游戏结束", "红方玩家获胜")window.quit()else:current_player = 2 if current_player == 1 else 1# 绑定鼠标点击事件
canvas.bind("<Button-1>", on_click)  # 左键点击
canvas.bind("<Button-3>", on_click)  # 右键点击

以上代码定义了一个on_click函数来处理鼠标点击事件。函数首先根据点击的位置计算出对应的行列索引,然后检查是否落子在有效位置上。如果位置无效(落子在棋盘外侧或已有棋子),则弹出提示信息。如果位置有效,根据当前玩家的不同,设置棋子的颜色,并绘制出棋子。然后检查是否有玩家获得胜利,如果有,则弹出提示信息并退出游戏。如果没有胜利,切换当前玩家。

判断胜负

接下来,我们需要编写一个函数来判断当前是否有玩家已经胜利。

def is_winner(player):# 检查玩家是否胜利for row in range(ROWS):for col in range(COLS):if board[row][col] == player:# 检查水平方向if col + 4 < COLS and all(board[row][col + i] == player for i in range(5)):return True# 检查垂直方向if row + 4 < ROWS and all(board[row + i][col] == player for i in range(5)):return True# 检查对角线方向(左上到右下)if row + 4 < ROWS and col + 4 < COLS and all(board[row + i][col + i] == player for i in range(5)):return True# 检查对角线方向(右上到左下)if row + 4 < ROWS and col - 4 >= 0 and all(board[row + i][col - i] == player for i in range(5)):return Truereturn False

以上代码定义了一个is_winner函数来判断指定玩家是否获胜。函数首先遍历棋盘上的每个位置,如果该位置的棋子颜色与指定玩家相同,则进行进一步检查。检查水平方向、垂直方向以及两个对角线方向上是否有连续的五个相同颜色的棋子,如果有,则返回True表示获胜,否则返回False表示未获胜。

游戏结束判断

on_click函数中,每当有玩家落子后,会检查是否有玩家获胜,如果有,则弹出提示信息并退出游戏。

交替落子

on_click函数中,每当有玩家落子后,会切换当前玩家。这通过全局变量current_player实现,初始值为1(蓝方玩家),当某一方落子后,将current_player的值切换为另一方(2表示红方玩家)。

运行结果

通过以上的代码实现,我们可以得到一个能够实现基本五子棋功能的程序。

程序运行时,会弹出一个窗口,窗口中显示了一个19x19的五子棋棋盘。玩家可以通过鼠标左键或右键点击棋盘上的格子进行落子。每当有玩家落子后,程序会自动判断是否有玩家获胜,并在弹出提示信息后结束游戏。

在程序运行过程中,程序会在窗口底部显示当前是哪一方玩家的回合,玩家可以根据该提示进行操作,避免出现误操作。同时,程序还会对一些错误的操作给出相应的提示,提高了游戏的友好度。

在这里插入图片描述

在这里插入图片描述

完整代码

import tkinter as tk
from tkinter import messagebox# 定义常量
ROWS = 19
COLS = 19
PADDING = 30
GRID_SIZE = 20# 创建棋盘
board = [[0] * COLS for _ in range(ROWS)]def is_valid_move(row, col):# 检查落子是否有效return board[row][col] == 0def is_winner(player):# 检查玩家是否胜利for row in range(ROWS):for col in range(COLS):if board[row][col] == player:# 检查水平方向if col + 4 < COLS and all(board[row][col + i] == player for i in range(5)):return True# 检查垂直方向if row + 4 < ROWS and all(board[row + i][col] == player for i in range(5)):return True# 检查对角线方向(左上到右下)if row + 4 < ROWS and col + 4 < COLS and all(board[row + i][col + i] == player for i in range(5)):return True# 检查对角线方向(右上到左下)if row + 4 < ROWS and col - 4 >= 0 and all(board[row + i][col - i] == player for i in range(5)):return Truereturn Falsedef on_click(event):# 处理鼠标点击事件row = round((event.y - PADDING) / GRID_SIZE)col = round((event.x - PADDING) / GRID_SIZE)if row < 0 or row >= ROWS or col < 0 or col >= COLS:# 落子在棋盘外侧messagebox.showinfo("提示", "不可以落子在棋盘外哦!")returnif not is_valid_move(row, col):# 提示落子位置已有棋子messagebox.showinfo("提示", "此处已有棋子,不可重复落子")returnglobal current_playerif current_player == 1:  # 蓝方玩家color = "blue"label.config(text="红方玩家的回合")else:  # 红方玩家color = "red"label.config(text="蓝方玩家的回合")board[row][col] = current_playerx = col * GRID_SIZE + PADDINGy = row * GRID_SIZE + PADDINGcanvas.create_oval(x - GRID_SIZE // 2, y - GRID_SIZE // 2, x + GRID_SIZE // 2, y + GRID_SIZE // 2, fill=color)if is_winner(current_player):if current_player == 1:messagebox.showinfo("游戏结束", "蓝方玩家获胜")else:messagebox.showinfo("游戏结束", "红方玩家获胜")window.quit()else:current_player = 2 if current_player == 1 else 1# 创建窗口
window = tk.Tk()
window.title("五子棋")
window.geometry(str(COLS * GRID_SIZE + PADDING * 2) + "x" + str(ROWS * GRID_SIZE + PADDING * 2 + 40))# 创建画布
canvas = tk.Canvas(window, width=COLS * GRID_SIZE + PADDING * 2, height=ROWS * GRID_SIZE + PADDING * 2, bg="burlywood")
canvas.place(x=0, y=PADDING)# 绘制棋盘线
for i in range(ROWS):canvas.create_line(PADDING, i * GRID_SIZE + PADDING, COLS * GRID_SIZE + PADDING - GRID_SIZE, i * GRID_SIZE + PADDING)
for i in range(COLS):canvas.create_line(i * GRID_SIZE + PADDING, PADDING, i * GRID_SIZE + PADDING, ROWS * GRID_SIZE + PADDING - GRID_SIZE)# 绘制黑点
for i in range(3, ROWS, 6):for j in range(3, COLS, 6):canvas.create_oval(j * GRID_SIZE + PADDING - 3, i * GRID_SIZE + PADDING - 3,j * GRID_SIZE + PADDING + 3, i * GRID_SIZE + PADDING + 3, fill="black")# 绑定鼠标点击事件
canvas.bind("<Button-1>", on_click)  # 左键点击
canvas.bind("<Button-3>", on_click)  # 右键点击# 创建游戏信息标签
label = tk.Label(window, text="蓝方玩家的回合", font=("宋体", 14))
label.place(x=PADDING, y=PADDING * 2 + ROWS * GRID_SIZE + 10)# 初始化当前玩家为蓝方玩家
current_player = 1# 运行窗口的主循环
window.mainloop()

总结

本文通过使用Python编写了一个简单的五子棋程序,实现了五子棋游戏的基本功能。通过tkinter库创建了一个可视化界面,实现了显示棋盘和点击落子的功能。通过编写相应的函数实现了胜负判断和游戏结束判断的功能。整个游戏流程简洁明了,代码结构清晰。通过本文的学习,相信读者们已经掌握了使用Python编写简单游戏的基本方法。希望本文的内容对读者们有所帮助,谢谢阅读!

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

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

相关文章

生存分析序章2——生存分析之Python篇:lifelines库入门

目录 写在开头1. 介绍 lifelines 库1.1 lifelines库简介1.2 安装与环境配置 2. 数据准备2.1 数据格式与结构2.2 处理缺失数据2.3 对异常值的处理 3. Kaplan-Meier 曲线3.1 使用 lifelines 绘制生存曲线3.2 曲线解读3.3 额外补充 4. Cox 比例风险模型4.1 lifelines 中的 Cox 模型…

K-means 算法 简介

聚类算法是无监督学习算法. 无监督就是事先并不需要知道数据的类别标签&#xff0c;而只是根据数据特征去学习&#xff0c;找到相似数据的特征&#xff0c;然后把已知的数据集划分成不同的类别。 K-means 算法 对于n个样本点来说&#xff0c;根据距离公式&#xff08;如欧式…

7+非肿瘤+线粒体+PPI+机器学习+实验,多套路搭配干湿结合

今天给同学们分享一篇生信文章“Identification of mitochondrial related signature associated with immune microenvironment in Alzheimers disease”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.4。 结果解读&#xff1a; 在ND和AD样本中鉴定差…

vscode调用HTML文件

vscode实现对HTML文件调用 创建html文件下载拓展内容点击拓展查找需要的拓展 导入html代码设置默认打开浏览器运行结果参考文献 做数据库课设的内容,尝试一些自己没有接触过的东西,了解如何创建一个网站以及数据库的一个应用 创建html文件 创建一个html的文件,加入后缀名 下…

Hive04_DDL操作

Hive DDL操作 1 DDL 数据定义 1.1 创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)];[IF NOT EXISTS] &#xff1a;判断是否存在 [COMMENT database_c…

手写一个vuex?

前言 vuex是一种专为Vue.js应用程序开发的状态管理模式&#xff0c;挂载在全局中&#xff0c;具有响应式特性 vuex的实现原理主要包括以下几个方面&#xff1a; 是一个对象&#xff0c;vuex有两个属性&#xff0c;一个是Store类&#xff0c;一个是install方法。Store类&#x…

procise纯PL流程点灯记录

procise纯PL流程点灯记录 一、概述 此篇记录使用procise工具构造JFMQL15T 纯PL工程&#xff0c;显示PL_LED闪烁&#xff1b; 硬件说明如下&#xff1a; 时钟引脚 Pl_CLK: U2 ,IO_L14P_T2_SRCC_34 PL_LED1 : E2, IO_L17P_T2_AD5P_35 PL_LED2: D6, IO_L2N_T0_AD8N_35 PL_LED3 :…

.NET CORE 无法调试 当前不会命中断点

多个项目直接可以设置项目的属性->生成->输出的配置文件输出地址 然后路径统一输入该项目的bib/debug/.netcorex.x就可以了

【JAVA】黑马MybatisPlus 学习笔记【终】【插件功能】

4.插件功能 MybatisPlus提供了很多的插件功能&#xff0c;进一步拓展其功能。目前已有的插件有&#xff1a; PaginationInnerInterceptor&#xff1a;自动分页TenantLineInnerInterceptor&#xff1a;多租户DynamicTableNameInnerInterceptor&#xff1a;动态表名OptimisticL…

197. 上升的温度

197. 上升的温度 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 该表包含特定日期的温度信息 编写解决方案…

【Linux】生产者消费者模型(阻塞队列与环形队列)和POSIX信号量

文章目录 一、生产者消费者模型二、基于BlockingQueue的生产者消费者模型1.BlockQueue.hpp2.Task.hpp3.main.cc 三、POSIX信号量四、基于环形队列的生产消费模型1.RingQueue.hpp2.Task.hpp3.main.cc 一、生产者消费者模型 我们这里举一个例子&#xff0c;来解释生产者消费者模…

【数据结构和算法】寻找数组的中心下标

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

雷盛红酒和云仓酒庄的优势

多国家采购、多葡萄酒品种、多价位区间的全系列整体品牌形式的雷盛&#xff08;LEESON&#xff09;红酒云仓酒庄&#xff0c;具有以下优势&#xff1a; 1.明星代言。雷盛&#xff08;LEESON&#xff09;品牌系列葡萄酒有幸邀请著名导演张纪中先生担任品牌代言人&#xff0c;为…

什么是天线OTA,怎么通过OTA数据评估产品射频环境情况

1.1 验证项目 产品的器件布局、走线是否合理、电源输入输出设计、纹波控制&#xff0c;铺地回流设计等是否合理. 通过验证产品的天线OTA_TIS项目来作为评估当前的设计是否合理之一&#xff0c;重点验证低频部分&#xff0c;如Band8段数据. 1.2 什么是天线OTA 是指某无线产品…

Vue3使用的Compostion Api和Vue2使用的Options Api有什么不同?

我们介绍Compostion Api和Options Api的区别之前&#xff0c;先来说一下为什么会推出来Composition Api&#xff0c;解决了什么问题&#xff1f; Vue2开发项目使用Options Api存在的问题 代码的可读性和维护性随着组件的变大业务的增多而变得差代码的共享和重用性存在缺点不支…

【Linux】进程查看|fork函数|进程状态

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

H.264宏块(Macroblock)概念(运动估计、变换编码、环路滤波)

参考文章&#xff1a;音视频高手课系列5-h264编码基础(宏块原理) 参考文章&#xff1a;切片slice与宏块&#xff0c;运动矢量 文章目录 使用videoEye分析视频宏块示例H.264宏块概念1. 宏块的定义2. 运动估计3. 变换编码4. 环路滤波5. 注意&#xff1a;宏块的概念既适用于帧内编…

基于Java Swing的图书管理系统

一、项目总体架构 本项目基于Java Swing框架&#xff0c;数据库采用的是MySQL。项目文件夹如下&#xff1a; 二、项目截图 1.登录和注册界面 2.用户界面 3.管理员管理图书类别 4.管理员管理书籍 5.管理员管理用户 项目总体包括源代码和课程论文&#xff0c;需要源码的…

Go语言实现KV存储系统:前言

文章目录 前言前提条件持久索引并发总结 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近想做一些存储方面的东西玩玩&#xff0c;我第一时间就想到了能不能自己开发一个保存键值对的存储系统 我找了些资料&#xff0c;准备使用Go语言实现一下&#xff0c;想着有想法咱就…

通过MobaXterm远程连接Anolis

目录 前言&#xff1a; 一.设置ip 二.远程连接 前言&#xff1a; 小编已经阐述了如何安装Anolis系统&#xff0c;如果有不了解的小伙伴可以查看这一篇博客Anolis安装 这篇博客将会讲述如何远程连接Anolis系统。各位看官拿好板凳&#xff01; 一.设置ip 打开网卡所在位…