用 Python 的 tkinter 模块编写一个好看又强大的中国象棋

news2024/11/20 20:34:44

        继上次我的第一版的《中国象棋》程序之后,我又编写了第二版的《中国象棋》程序,关注我的粉丝知道,我在第一篇《中国象棋》的文章末尾说了,我会出第二版的,对第一版感兴趣的朋友们,可以去看看,也是非常好的一个程序,就是有些地方美中不足,但是这次我弥补了这些缺陷。

这是第一版《中国象棋》的链接(文章里有源码及程序可以下载):Tkinter模块GUI图形化编程实战(八)——中国象棋(含超详解及完整源码、完整程序免费下载链接)_tkinter 象棋_小康2022的博客-CSDN博客https://xiaokang2022.blog.csdn.net/article/details/125796786提前说明

在第二版的《中国象棋》中:

  • 没有使用任何第三方模块
  • 没有使用任何图片文件
  • 程序含有音频文件,有走棋、吃棋、“将军”音效,按钮被按下也会产生音效
  • 程序中的棋子、棋盘均为 Canvas 绘制而成
  • 棋子的移动、提示框的浮动等的动画效果都是使用我自制的模块 tkintertools 而成
  • 程序有兼容不同 DPI 的功能,清晰度大为提高
  • 绘制的图形暂时没有抗锯齿的功能

正片开始

下面是这次版本的效果(程序也在文章末尾可下载):

棋盘

棋盘和经典的象棋棋盘一样,没有什么区别,但是棋盘中央有个计时的显示,它会显示当前是哪一方在思考,并给出当前该方思考花费的时间。没有选择游戏模式的时候,就是上方那个样子。

基本模式

打开程序的时候,会自动弹出这个选择模式的窗口,也可以手动在窗口菜单栏内的“新游戏”按钮打开,或者按下快捷键“Ctrl+N”来打开这个窗口。窗口里显示了三种基本的模式,点击即可选择对应的模式,并进行一些游戏规则上的设定,比如让子、先手的设定等。鼠标停留在模式选择按钮上时,下面的信息的显示栏(上面显示“请选择游戏模式”的地方)内会显示一些提示信息。模式选择按钮被按下时,会有音效。

游戏说明

游戏说明窗口,可通过窗口菜单栏中“帮助(H)”中找到游戏说明选项,点击即可看到上面的窗口,也可通过按下快捷键“Ctrl+H”来快速打开该窗口。该窗口会读取程序同级目录下的 help.md 文件,并对其进行简单的分析。经过分析后,会产生对应页数的内容,上面就是12页。点击上下页按钮可切换页面,当然,这个按钮也有音效。游戏说明里面介绍了《中国象棋》基本的玩法规则(大部分是从百度百科里复制来的)。

模式介绍

游戏说明里的最后一页介绍了这个程序的所有模式,这里放出来给大家看一下。

统计数据

字面意思,程序的统计信息,统计信息存储在程序同级目录下的 statistic.json 文件中,上面的这些数据是我在编写程序时干出来的(调试)。

游戏设置

游戏设置可在菜单栏选项的列表中找到,目前的可设置项还比较少。窗口缩放系数决定了窗口的大小,当然,上面的系数 0.9 是我手动设置的,因为那样在我电脑上看起来比较清晰,也可以设置窗口自动缩放的值为 True 来让其自动寻找最佳的缩放值。这个和棋判定回合数嘛,是指的和棋中的一种情况,就是双方在 N 个回合内均没有吃子时就认为此局和棋,默认是 60,可以自行更改为其他值。AI最大搜索深度就不用我说了,关于棋子可走显示时什么意思,看下面就知道了。

棋子的可走显示

当上面提到的选项被设置为 True 时,这个位置显示和敌方标红就会出现,当然,这并不会影响到选中棋子时的标绿。另外,这里说一点,鼠标停留在棋子上方的时候,棋子会高亮,鼠标样式会变成可点击的那个样式。顺便一提,鼠标点击的位置判定,不是个矩形框,而是个圆!

所有选项

打开是为了载入残局而设定的,实际上,不一定是残局,只要是符合我设定的象棋文件格式,程序就能识别,另存为就是把当前棋局以一定的格式保存下来,而这个格式也很简单,如下:

〇〇〇〇车将〇〇〇
〇〇〇兵〇〇〇〇〇
〇〇〇〇象兵〇〇〇
〇〇〇〇〇〇〇〇〇
〇〇〇〇〇〇〇〇〇
〇〇〇〇〇〇〇〇兵
〇〇〇〇〇〇〇〇〇
〇卒〇〇卒〇〇砲〇
〇〇〇卒〇卒〇〇〇
〇〇〇〇帥〇車車〇

上面是位于程序同级目录下 chess 文件夹中的第一个残局文件:七星聚会.chess

虽然文件扩展名为 .chess,但实际上就是文本文件罢了。这上面的格式要注意一个问题,黑方棋子名称必须为“将士象马车炮卒”,而红方必须是“帥仕相馬車砲兵”,以保证程序可以区分两边。

撤销和恢复功能就是悔棋和撤销悔棋功能,在人机对战模式和双人对弈模式下支持,前者一次悔棋两步,后者一次悔棋一步,撤销悔棋功能也是如此。

让子设定

这个选择功能在人机对战模式、双人对弈模式、联机模式下支持,其他的不用我多说了吧。

主动连接方式

这是联机模式内的一种,主动连接方式,还有一种是被动连接方式,联机模式支持局域网联机,要求被连接方需采用被动连接方式,也就是作为服务器连接,连接方采用主动连接方式,相当于客户端。当然,为了方便用户不用手动输入IP地址,程序会自动搜索可识别的连接,用户只需要在搜索完后在列表中选择即可。

被动连接方式

就是上面讲的被动连接方式,单次等待时间为 60 秒,在这段时间内检测尝试连接的用户。

浮动提示框

上面图片中左上角就是浮动提示框,它会从左边滑出并播放系统提示音,停留 3000 毫秒后收回。在进入新的游戏模式时,会有提示框,不可悔棋、撤销悔棋时执行这两功能,也会给予提示。

七星聚会

展示就到这里了,更多功能大家自己去探索吧,上面流一张“七星聚会”的残局图片给大家。最后提一嘴 AI 的功能,我的评价是,还行,凑合着用,毕竟我不太会这方面的知识,自己尝试写的一个搜索算法并给出最佳走法,在搜索深度为 3 层时,单次移动计算最长大概花费 8 秒钟,效果勉勉强强。

程序文件

这里不多说了,文章底部可以看到和我细聊的方式,看文件下载链接吧:

Chess.ziphttps://wwc.lanzoum.com/ipuRE0mfpwxi

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

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

相关文章

VueJS 之样式冲突与样式穿透

文章目录参考描述样式冲突现象scoped原理样式穿透深度选择器使用原理顶层元素局限性参考 项目描述搜索引擎Bing哔哩哔哩黑马程序员 描述 项目描述Edge109.0.1518.70 (正式版本) (64 位)操作系统Windows 10 专业版vue/cli5.0.8npm8.19.3VueJS2.6.14 样式冲突 在使用 Vue 进行…

大文件上传/下载

一、前言 大文件上传下载一直以来是前端常用且常考的热门话题。本文将分别介绍大文件上传/下载的思路和前端实现代码。 二、分片上传 整体流程 对文件做切片,选择文件后,对获取到的file对象使用slice方法可以将其按照制定的大小进行切片,…

使用matplotlib,pylab进行python绘图

一提到python绘图,matplotlib是不得不提的python最著名的绘图库,它里面包含了类似matlab的一整套绘图的API。因此,作为想要学习python绘图的童鞋们就得在自己的python环境中安装matplotlib库了,安装方式这里就不多讲,方…

openmmlab学习打卡1

openmmlab学习打卡1通用视觉框架 OpenMMLab通过 conda 安装通用视觉框架 OpenMMLab 基于pytorch实现 其中: 分类算法在 mmclassification 模块下 目标检测在 mmdetection 模块下 分割模型在 mmsegmentation 模块下(openmmlab 2.0 版本中加入&#xff09…

洛谷P1885 Moo —— 搜索

This way 题意: 奶牛 Bessie 最近在学习字符串操作,它用如下的规则逐一的构造出新的字符串: S(0)S(0) S(0) moo S(1)S(0)S(1) S(0) S(1)S(0) m ooo S(0) S(0) S(0) moo m ooo moo moomooomoo S(2)S(1)S(2) S(1) S(2)S(1) m oooo S(…

无js实现拖拽边框改变大小的笔记

前言 最近刷抖音看到一款游戏"拣爱",看到这个人手动拖动的很有意思,就想着能不能前端实现,来学习学习,虽然说最终的效果没有gif图片那么好,但是也算实现了,吧… 具体原理 利用resize属性所出现的小拖拽条 再配合::-webkit-scrollbar设置拖拽区域宽度,高度,结合opac…

手动签发证书配置nginx

openssl和ssh基本用法 通过OpenSSL工具生成证书 创建私钥 openssl genrsa -des3 -out server.key 2048 注意,centos版本如果是CentOS Linux release 8.0.1905 (Core)版本,私钥长度不能设置成1024位,必须2048位。不然再最后启动nginx时会出…

java之数组模块

数组定义格式1.1数组概述一次性声明大量的用于存储数据的变量要存储的数据通常都是同类型数据,例如:考试成绩1.2什么是数组数组(array)是一种用于存储多个相同类型数据的存储模型1.3数组的定义格式格式一:数据类型[] 变量名范例: …

h5实现相机

什么是取景器 取景器是什么?取景器是相机的一个专业术语,在前端就是扫描拍照 取景器的实现原理 请求手机的一个媒体类型的视频轨道,利用一个div或者图片作为上层蒙层,然后在利用canvas绘制视频中某一帧的画面绘制为图片。 前期…

HTML基础知识

一个网站由两部分组成:前端和后端。前端主流语言目前是HTML、CSS、JS等。HTML只是描述了页面的内容(骨架),CSS才是描述了页面的样式。HTML结构HTML标签HTML代码是由“标签”构成的,HTML描述了页面上有什么东西&#xf…

数字化转型导师坚鹏:银行数字化转型为什么需要融合王阳明心学

在BLM银行数字化转型方法论中,我之所以融合BLM模型与王阳明心学,作为一个工科背景并拥有多年软硬件产品研发经验的人来说,深刻地知道很多人利用了科技的力量做了大量的恶事,而不是善事,如黑客大量盗取、泄漏、贩卖客户…

ESLint 的一些理解

ESLint ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误。 为什么要使用ESLint 有的可以帮我们避免错误;有的可以帮我们写出最佳实践的代码;有的可以帮我们规范变量的使用方式&a…

Docker入门之使用Dockerfile 构建镜像(七)

文章目录1. 前言2. Docker file 核心要点2.1 注意事项2.2 Docker file 执行流程2.3 Docker Image、Docker file、Docker Container区别2.4 Dockerfile常用保留字指令2.4.1 FROM2.4.2 MAINTAINER2.4.3 RUN2.4.4 EXPOSE2.4.5 WORKDIR2.4.6 USER2.4.7 ENV2.4.8 ADD2.4.9 COPY2.4.1…

ansible 简单使用

运行过程 1.加载自己的配置文件,默认/etc/ansible/ansible.cfg; 2.查找对应的主机配置文件,找到要执行的主机或者组; 3.加载自己对应的模块文件,如 command; 4.通过ansible将模块或命令生成对应的临时py文…

OpenMMLab 实战营打卡 - 第 一 课

OpenMMLab 实战营打卡 - 第 一 课 复习下总忘的基础知识 卷积的通道数变化 前一层特征纬度(通道数)决定核的通道数 当前层输出的特征纬度,由核的数量决定 图像尺寸变化 padding 公式:H′H−K12pH^{\prime}H-K12 pH′H−K12p…

电源技术中的安森美 单通道电压电平转换器件FXLP34P5X 适合便携式应用方案

电源技术中的安森美 单通道电压电平转换器件FXLP34P5X 适合便携式应用方案 :输入转换器电源电压为VCC1,输出转换器电源电压为VCC。 该器件使用1.0V至3.6V的VCC值运行,主要用于要求超低功耗的便携式应用。内部电路由最小量的缓冲器级组成&…

普通大学生自学 JAVA 怎样才能进大厂?

前言 可以看一下现在大厂对于Java方面的要求 阿里 百度 腾讯 从上面可以看出,无论是阿里、百度亦或是腾讯对于Java方面的要求是比较高的,可以说要求的是一个全面,所以想要进入大厂,不能操之过急,需要先从基础做起&am…

php报错SERVER SENT CHARSET (255) UNKNOWN

配置文件PHP.ini修改打开; extension_dir "ext",修改成; extension_dir "./" ; On windows: extension_dir "自己php的存放路径\ext"2.打开extensionmsql.dll; For example, on Windows: ;extensionmsql.dll3.修改配置&#xff08…

五、Linux 用户管理常用命令

一、用户管理命令 - useradd 命令名称:useradd 命令所在路径:/usr/sbin/useradd 执行权限:root 功能描述:添加新用户 语法:useradd 用户名 二、用户管理命令 - userdel 命令名称:userdel 命令所在路…

创业青年张继群

中央广播电视总台 -专访-张继群简介: 张继群,1995年10月生,男,临沂大学硕士研究生在读,现临沂城投思索信息技术有限公司智慧城市事业部员工,作为农业专班成员主要从事网络安全、大数据等新一代信息技术的科…