设计一个matlab的app是我们期末的答辩内容,我做的这个五子棋主要参考了b站up主唤醒手腕的代码和教程,然后在matlab窗口实现的改到app里实现。最后答辩的实验成绩好像是90+http://【【手把手教程】Matlab棋类游戏超详细的制作教程:如何用Matlab制作棋类游戏,井字棋,五子棋,双人模式,人机模式。】https://www.bilibili.com/video/BV1sB4y1g734?vd_source=a9e3519d86ff64b3c059efea3e631fc2这个app的mlapp文件放在文章最后了,需要自取
一、功能展示
基本的功能悔棋,清盘是有的,不过没有禁手,计时功能。
二、思路
1、创建坐标区
拖一个坐标区进来,然后设置好棋盘,设置的时候刻度值x和y轴这里都设置为0到14的正方形,为了不显示坐标轴旁边的数组我的思路是XTickLabel那一列不填数字,然后设置好棋盘颜色,背景颜色啥的
2、回调函数
点击棋盘右键,进入回调
首先我想获取我鼠标进行点击的坐标值,所以
Matlab
pt = get(app.UIAxes, 'CurrentPoint');
x = round(pt(1,1));
y = round(pt(1,2));
然后想要在上面画上黑棋和白棋,用的是
Matlab
h=scatter(app.UIAxes, x, y, app.chessSize, 'ok', 'filled'); % 绘制黑子
h=scatter(app.UIAxes, x, y, app.chessSize, 'ow', 'filled'); % 绘制白子
但是我现在想要绘制 黑棋后就换成白棋再绘制,这时候可以设置一个属性count,在这个函数里进行每次下一颗棋,我们count就加一,通过模运算来判断下黑棋还是白棋
Matlab
% 判断轮次是黑棋还是白棋
if mod(app.count, 2) == 1
% 黑棋 (1)
h=scatter(app.UIAxes, x, y, app.chessSize, 'ok', 'filled'); % 绘制黑子
app.matrix(y, x) = 1; % 更新棋盘状态为黑棋
app.moveHandles{end+1} = h;
end
if mod(app.count, 2) == 0
% 白棋 (2)
h=scatter(app.UIAxes, x, y, app.chessSize, 'ow', 'filled'); % 绘制白子
app.matrix(y, x) = 2; % 更新棋盘状态为白棋
app.moveHandles{end+1} = h;
end
% 更新轮次
app.count = app.count + 1;
然后我们现在已经可以黑白棋交错下了,需要设置5颗棋相连的时候就要结束游戏。
我们可以定义一个判断函数,思路是每下一颗就调用一次这个函数判断是否相连这个函数的代码如下
Matlab
function winner = WhoIsWinner1(app, matrix)
winner = 0;
[m, n] = size(matrix); % 获取棋盘大小
% 遍历每个位置
for i = 1:m
for j = 1:n
if matrix(i, j) == 0
continue;
end
% 水平检查
if j <= n - 4 && all(matrix(i, j:j+4) == matrix(i, j))
winner = matrix(i, j);
return;
end
% 垂直检查
if i <= m - 4 && all(matrix(i:i+4, j) == matrix(i, j))
winner = matrix(i, j);
return;
end
% 主对角线检查
if i <= m - 4 && j <= n - 4 && all(diag(matrix(i:i+4, j:j+4)) == matrix(i, j))
winner = matrix(i, j);
return;
end
% 副对角线检查
if i <= m - 4 && j >= 5 && all(diag(flipud(matrix(i:i+4, j-4:j))) == matrix(i, j))
winner = matrix(i, j);
return;
end
end
end
end
然后我们再调用这个函数像这样
Matlab
winner = app.WhoIsWinner1(app.matrix);
if winner == 1
% 黑棋胜利
pause(0.1)
choice = questdlg('黑棋赢了!再来一局还是退出?', ...
'游戏结束', ...
'再来一局', '退出', '再来一局');
if strcmp(choice, '再来一局')
resetGame(app);
else
close(app.UIFigure);
end
elseif winner == 2
% 白棋胜利
pause(0.1)
choice = questdlg('白棋赢了!再来一局还是退出?', ...
'游戏结束', ...
'再来一局', '退出', '再来一局');
if strcmp(choice, '再来一局')
resetGame(app);
else
close(app.UIFigure);
end
end
主要实现我觉得就这些,欢迎大家去增加功能
mlapp文件:
https://pan.baidu.com/s/1QxWqNzrdfZ2jRI0HlyE-cw?pwd=738m 提取码: 738m