【MATLAB课设五子棋教程】(附源码)

设计一个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

相关推荐
是娇娇公主~2 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene2 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
xuxie993 小时前
N11 ARM-irq
java·开发语言
wefly20174 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509804 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默5 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
kyriewen115 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
娇娇yyyyyy6 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt
豆豆的java之旅6 小时前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构
sthnyph6 小时前
QT开发:事件循环与处理机制的概念和流程概括性总结
开发语言·qt