基于MATLAB的中国象棋对弈系统实现

一、项目简介

我的MATLAB图形设计功能应用实例,包含MATLAB播放音乐,界面设计,鼠标点击检测,计时,保存图片,excel读写等功能,适合任何阶段的MATLAB学习者参考使用。利用Matlab实现人人对弈(PVP)的象棋游戏,要求在实现中国象棋的规则的基础上,尽量美化游戏界面,丰富功能。中国象棋的棋盘是紧密排列的9*10方格状棋盘,因而共有90个交叉点,棋子就摆放和活动在这些交叉点上。中国象棋共有32枚棋子,分为黑红两方。每方开局各执16枚棋子,每方各有一帅(将)两仕(士)两相(象)两马两车两炮五兵(卒)。对局开始时按固定位置在界河两边摆好棋子,红方先走,然后轮流下子。每种棋子的走法不同,活动范围也不尽相同。率先把对方的帅(将)“将死”的一方获胜,不分胜负则为和棋。本游戏使用Matlab R2020a(version 9.8.0.1323502)编写,使用对应版本号的Matlab Runtime实现程序的封装。

如果出现乱码问题,是由于MATLAB版本过低,编码方式与新版本不同导致的!!!!!可以复制到记事本中后,再复制到MATLAB的脚本中运行解决。

1.基本内容

利用Matlab实现人人对弈(PVP)的象棋游戏,要求在实现中国象棋的规则的基础上,尽量美化游戏界面,丰富功能。中国象棋的棋盘是紧密排列的9*10方格状棋盘,因而共有90个交叉点,棋子就摆放和活动在这些交叉点上。中国象棋共有32枚棋子,分为黑红两方。每方开局各执16枚棋子,每方各有一帅(将)两仕(士)两相(象)两马两车两炮五兵(卒)。对局开始时按固定位置在界河两边摆好棋子,红方先走,然后轮流下子。每种棋子的走法不同,活动范围也不尽相同。率先把对方的帅(将)“将死”的一方获胜,不分胜负则为和棋。本游戏使用Matlab R2020a(version 9.8.0.1323502)编写,使用对应版本号的Matlab Runtime实现程序的封装。

2. 基本功能

1. 游戏界面:棋盘和棋子的GUI实现的基础上,使用背景贴图美化棋盘。

  2. 功能按钮:包括开始游戏、认输和关闭按钮,方便用户使用。

  3. 子菜单:子菜单实现了保存图片,帮助以及设置(打开关闭和选择)游戏背景音乐。

  4. 背景音乐:游戏在开始和打开界面时会自动播放音乐,并且在游戏胜利时会播放胜利音乐。

  5. 游戏计时:对单局游戏的总共用时和单步用时的计时。

  6. 余子记录:对游戏中双方剩余字数的实时记录。

  7. 走子记录:对游戏中双方走子的记录。

  8. 对局标题:开局时会任意引用象棋有关的名言作为标题,对局开始后会显示执棋方。

  9. 提示弹窗:对错误操作做出提醒。

  10. 彩蛋按钮:在游戏界面中隐藏了彩蛋按钮,按下以后会播放特定音乐,改变对局标题和水印颜色。

二、设计方案和原理简介

1. 设计方案

对局设计的流程图如下,通过一系列的逻辑判断实现人人对弈的中国象棋:


   图1 对局设计流程图
 


2. 原理简介

利用矩阵保存棋盘的基本信息,32个棋子分别表示为数字1到32。没有棋子的位置使用0表示。对局的更新通过对矩阵元素的增减实现,当将和帅对应的棋子被“吃掉”、认输或“照白脸”时判断游戏结束。

棋盘的方格使用line和plot绘制直线,并用xticks和yticks界定坐标轴间隔,使每个方格尽量匀称。棋子的图形是先用plot绘制红色和黑色的实心圆,再在对应的位置用text显示对应的2*7的细胞数组保存的文字实现。同时用两个1*16的数组,保存绘制图像的句柄。“吃子”通过设定对应句柄的消失实现,“选中棋子”通过设置对应棋子文字为蓝色实现。

三、主要模块介绍

1. 对局功能(game_on.m)

点击“开始”按钮后开始对局,开始对局后程序会重新绘制棋盘并绘制开局时的棋子。对局开始后,会在棋盘上方显示对局信息,通过get(gca,'CurrentPoint')在while循环内实时获取用户鼠标点击位置。如果点击位置在棋盘内,则给点击的坐标赋值。如果点击位置有己方棋子,则选中对应的棋子,并将文字设置成蓝色。

  象棋每一方共有7种棋子,用数字1~7保存棋子类型,通过switch-case和if实现对是否能走子的判断。如果能够走子,那么判断是否能“吃子”。若是“将军”就认定己方获胜,否则判断是否“照白脸”。若是“照白脸”就认定地方获胜,否则换手,并更新对局信息,对局界面如下图。


   图2 对局界面
 


2. 计时功能(game_on.m)

点击开始游戏后会用datetime记录开始游戏时的时间,在while循环内用datetime不断更新当前的时间信息。用fix(初始秒减去当前秒)计算秒,消除小数点后面的位数。用初始分钟减去当前分钟,计算分钟。若当前秒和分钟小于初始秒和分钟时,分别用60加上原计数计算秒和分钟。当换手时,单步计时重新获取起始时间,从而实现总计时和单步计时。

3. 认输功能(gjxq.m)

使用全局变量check作为胜负判断的标志,当点击认输时给check赋值为1,从而实现认输的判断。

4. 背景音乐(playmusic.m)

只能实现播放一次,尝试循环列表播放没有找到合适的方法。如果要在跳出函数的前提下实现计时,需要设置较多的关于时间的全局变量。而且关于时间的逻辑判断与实时运行的程序之间不能完美契合,在不同的函数之间很难做到以秒为单位的准确计时。音乐的播放使用audioread获取音乐的基本音频数据和采样频率,用sound以每样本8位的位深度播放双声道音频。

并且用户可以通过子菜单设定自己想听的音乐和关闭打开背景音乐,这项通过给全局变量music_off和i赋值实现。当游戏胜利时,通过判断全局变量check的值播放胜利音乐。

5. 保存图片(gjxq.m)

保存图片时会在指定images文件夹下将当前图形窗口内容保存为png格式图片,且图片按照当前的时间(命名格式:xxxx(年).xx(月).xx(日)_xx时xx分xx秒.png)命名。在保存成功后程序会弹窗提示保存成功,这项功能让记录结果更加方便高效。


   图3 保存图片
 


6. 彩蛋功能(gjxq.m)

在游戏界面中隐藏了彩蛋按钮,按下以后会播放特定音乐,改变对局标题和水印颜色。彩蛋按钮使用和棋盘相同的背景色,不易被发现。播放特定音乐利用修改全局变量i的值来实现,利用randi随机生成水印的三基色和引用语句的编号,从而达到变换水印颜色和对局标题的功能,彩蛋按钮在下图所示的箭头所指位置。


   图4 彩蛋按钮
 


四、运行结果及分析

通过多次测试和修改,本游戏目前可以对象棋的规则实现准确判断。并且对于特殊情况,如照白脸,相不能过河,卒过河后可以左右走,蹩马腿,塞象眼都能正确实现。

因而最终结果符合设计要求,并且在设计在此基础上增加了播放背景音乐,游戏计时等功能,美化了游戏界面。


   图5 程序运行结果
 

如果出现乱码问题,是由于MATLAB版本过低,编码方式与新版本不同导致的!!!!!可以复制到记事本中后,再复制到MATLAB的脚本中运行解决。

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空