一、项目简介
我的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 对局设计流程图
利用矩阵保存棋盘的基本信息,32个棋子分别表示为数字1到32。没有棋子的位置使用0表示。对局的更新通过对矩阵元素的增减实现,当将和帅对应的棋子被“吃掉”、认输或“照白脸”时判断游戏结束。
棋盘的方格使用line和plot绘制直线,并用xticks和yticks界定坐标轴间隔,使每个方格尽量匀称。棋子的图形是先用plot绘制红色和黑色的实心圆,再在对应的位置用text显示对应的2*7的细胞数组保存的文字实现。同时用两个1*16的数组,保存绘制图像的句柄。“吃子”通过设定对应句柄的消失实现,“选中棋子”通过设置对应棋子文字为蓝色实现。
点击“开始”按钮后开始对局,开始对局后程序会重新绘制棋盘并绘制开局时的棋子。对局开始后,会在棋盘上方显示对局信息,通过get(gca,'CurrentPoint')在while循环内实时获取用户鼠标点击位置。如果点击位置在棋盘内,则给点击的坐标赋值。如果点击位置有己方棋子,则选中对应的棋子,并将文字设置成蓝色。
象棋每一方共有7种棋子,用数字1~7保存棋子类型,通过switch-case和if实现对是否能走子的判断。如果能够走子,那么判断是否能“吃子”。若是“将军”就认定己方获胜,否则判断是否“照白脸”。若是“照白脸”就认定地方获胜,否则换手,并更新对局信息,对局界面如下图。
图2 对局界面
点击开始游戏后会用datetime记录开始游戏时的时间,在while循环内用datetime不断更新当前的时间信息。用fix(初始秒减去当前秒)计算秒,消除小数点后面的位数。用初始分钟减去当前分钟,计算分钟。若当前秒和分钟小于初始秒和分钟时,分别用60加上原计数计算秒和分钟。当换手时,单步计时重新获取起始时间,从而实现总计时和单步计时。
使用全局变量check作为胜负判断的标志,当点击认输时给check赋值为1,从而实现认输的判断。
只能实现播放一次,尝试循环列表播放没有找到合适的方法。如果要在跳出函数的前提下实现计时,需要设置较多的关于时间的全局变量。而且关于时间的逻辑判断与实时运行的程序之间不能完美契合,在不同的函数之间很难做到以秒为单位的准确计时。音乐的播放使用audioread获取音乐的基本音频数据和采样频率,用sound以每样本8位的位深度播放双声道音频。
并且用户可以通过子菜单设定自己想听的音乐和关闭打开背景音乐,这项通过给全局变量music_off和i赋值实现。当游戏胜利时,通过判断全局变量check的值播放胜利音乐。
保存图片时会在指定images文件夹下将当前图形窗口内容保存为png格式图片,且图片按照当前的时间(命名格式:xxxx(年).xx(月).xx(日)_xx时xx分xx秒.png)命名。在保存成功后程序会弹窗提示保存成功,这项功能让记录结果更加方便高效。
图3 保存图片
在游戏界面中隐藏了彩蛋按钮,按下以后会播放特定音乐,改变对局标题和水印颜色。彩蛋按钮使用和棋盘相同的背景色,不易被发现。播放特定音乐利用修改全局变量i的值来实现,利用randi随机生成水印的三基色和引用语句的编号,从而达到变换水印颜色和对局标题的功能,彩蛋按钮在下图所示的箭头所指位置。
图4 彩蛋按钮
通过多次测试和修改,本游戏目前可以对象棋的规则实现准确判断。并且对于特殊情况,如照白脸,相不能过河,卒过河后可以左右走,蹩马腿,塞象眼都能正确实现。
因而最终结果符合设计要求,并且在设计在此基础上增加了播放背景音乐,游戏计时等功能,美化了游戏界面。
图5 程序运行结果
如果出现乱码问题,是由于MATLAB版本过低,编码方式与新版本不同导致的!!!!!可以复制到记事本中后,再复制到MATLAB的脚本中运行解决。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删