【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

相关推荐
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
程序喵大人13 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)14 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的14 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质15 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄62315 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857215 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
临床数据科学和人工智能兴趣组16 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1