最近看到一个新闻,8月11日第16届世界五子棋锦标赛的决赛战场上,两名中国棋手分别取得了决赛组和女子组的冠军。

毕竟是两年一届的世界最高水平的五子棋比赛,这样的成绩可以说是很优秀了。

看完后,会长也是抖了个机灵,想着把之前用matlab写过的五子棋游戏程序润色一把,拿来做了珍贵的一篇推送~

五子棋,是一种逻辑非常简单的棋盘游戏,入手容易,但想要技法精湛却非常困难。

图片来自电影《五子棋少女(2018)》片段

本篇应用实例就是一个简单的双人对战五子棋游戏,而且想在编程实现游戏的同时加深大家对Matlab的while、if、for等逻辑分支和判断语句的掌握。

写在前面

概要地讲,这样一个五子棋程序的难点在于如何获取用户鼠标点击事件的信息,鼠标点击事件是五子棋游戏以及大多数电脑游戏人机信息交互的桥梁。

我们这里使用ginput函数的改版ginput1函数获取鼠标点击的位置信息(ginput()函数能获取指定点坐标值,大家可以将ginput1改为ginput观看替换前的效果)。

程序逻辑框架图 及 代码

1、首先,新建five.m文件,画出一个棋盘

figure('numbertitle','off','name','数学建模公会原创');%棋盘的坐标范围是横坐标0-22,纵坐标0-16axis([0 22 0 16]);

注意,要将横纵坐标的单位尺度一致化,否则可能会得到一个扁扁的棋盘

axis equal;

在棋盘上画上15条交织的直线,形成棋盘轮廓

for i=1:15    line([1 15],[i i]);    line([i i],[1 15]);end

下面是在棋盘上方和右端加入游戏状态:

gonggao=text(8,15.5,'正在进行游戏...');text(1,15.5,'公众号:数学建模公会');Player1=text(17,12,'Player1');Player2=text(17,8,'Player2');time1=text(17,10,'0');handles.time1=time1;time2=text(17,6,'0');handles.time2=time2;t1=0;%记录选手耗时t2=0;handles.gonggao=gonggao;

2、记录棋盘状态数据,1代表第一人在此处下棋,2代表第二人在此处下棋,0代表没人在此处下棋;
使用flag用来记录当前正在下棋的人

qipan=zeros(15);flag=1;

while 1    time11=clock;     [x,y]=ginput1(1);%为了将ginput1将原始的ginput的十字光标改为其他形状    xx=round(x);    yy=round(y);while xx>15||xx<1||yy>15||yy<1||qipan(xx,yy)~=0  %在棋盘之外或者已经有棋子的位置都是非法位置!记住,先判断在棋盘之内,因为判断是否有棋子需要在棋盘内    set(handles.gonggao,'string','非法位置');    pause(1);    set(handles.gonggao,'string','正在进行游戏...');    [x,y]=ginput1(1);    xx=round(x);    yy=round(y);endtime22=clock;dt=(time22(4:6)-time11(4:6))*[3600 60 1]';if flag==1    line(xx,yy,'marker','.','markersize',30,'color','r');    qipan(xx,yy)=1;    t1=t1+dt;    set(handles.time1,'string',num2str(t1));    flag=2;else    line(xx,yy,'marker','.','markersize',30,'color','b');    qipan(xx,yy)=2;    t2=t2+dt;    set(handles.time2,'string',num2str(t2));    flag=1;end

3、判断当前走完棋盘的选手有没有获胜,依据qipandata中记录的数据
判断选手1是否获胜:

 if flag==2     a=0;     for i=1:15         for j=1:15             if (j+4<16)&&(sum([qipan(i,j),qipan(i,j+1),qipan(i,j+2),...                     qipan(i,j+3),qipan(i,j+4)]==ones(1,5))==5)                 a=1;                 break                   end             if (i+4<16)&&(j+4<16)&&(sum([qipan(i,j),qipan(i+1,j+1),...                     qipan(i+2,j+2),qipan(i+3,j+3),qipan(i+4,j+4)]==ones(1,5))==5)                 a=1;                 break             end             if (i+4<16)&&(sum([qipan(i,j),qipan(i+1,j),qipan(i+2,j),...                     qipan(i+3,j),qipan(i+4,j)]==ones(1,5))==5)                 a=1;                 break             end             if (i+4<16)&&(j-4>0)&&(sum([qipan(i,j),qipan(i+1,j-1),...                     qipan(i+2,j-2),qipan(i+3,j-3),qipan(i+4,j-4)]==ones(1,5))==5)                 a=1;                 break             end             if (j-4>0)&&(sum([qipan(i,j),qipan(i,j-1),qipan(i,j-2),...                     qipan(i,j-3),qipan(i,j-4)]==ones(1,5))==5)                 a=1;                 break             end             if (i-4>0)&&(j-4>0)&&(sum([qipan(i,j),qipan(i-1,j-1),...                     qipan(i-2,j-2),qipan(i-3,j-3),qipan(i-4,j-4)]==ones(1,5))==5)                 a=1;                 break             end             if (i-4>0)&&(sum([qipan(i,j),qipan(i-1,j),qipan(i-2,j),...                     qipan(i-3,j),qipan(i-4,j)]==ones(1,5))==5)                 a=1;                 break             end             if (i-4>0)&&(j+4<16)&&(sum([qipan(i,j),qipan(i-1,j+1),...                     qipan(i-2,j+2),qipan(i-3,j+3),qipan(i-4,j+4)]==ones(1,5))==5)                 a=1;                 break             end         end         if a==1             break         end             end      if a==1             set(handles.gonggao,'string','选手1获胜');             break                   end end

判断选手2是否获胜:

if flag==1     a=0;     for i=1:15         for j=1:15             if (j+4<16)&&(qipan(i,j)+qipan(i,j+1)+qipan(i,j+2)+...                     qipan(i,j+3)+qipan(i,j+4)==10)                 a=1;                 break             end             if (i+4<16)&&(j+4<16)&&(qipan(i,j)+qipan(i+1,j+1)+...                     qipan(i+2,j+2)+qipan(i+3,j+3)+qipan(i+4,j+4)==10)                 a=1;                 break             end             if (i+4<16)&&(qipan(i,j)+qipan(i+1,j)+qipan(i+2,j)+...                     qipan(i+3,j)+qipan(i+4,j)==10)                 a=1;                 break             end             if (i+4<16)&&(j-4>0)&&(qipan(i,j)+qipan(i+1,j-1)+...                     qipan(i+2,j-2)+qipan(i+3,j-3)+qipan(i+4,j-4)==10)                 a=1;                 break             end             if (j-4>0)&&(qipan(i,j)+qipan(i,j-1)+qipan(i,j-2)+...                     qipan(i,j-3)+qipan(i,j-4)==10)                 a=1;                 break             end             if (i-4>0)&&(j-4>0)&&(qipan(i,j)+qipan(i-1,j-1)+...                     qipan(i-2,j-2)+qipan(i-3,j-3)+qipan(i-4,j-4)==10)                 a=1;                 break             end             if (i-4>0)&&(qipan(i,j)+qipan(i-1,j)+qipan(i-2,j)+...                     qipan(i-3,j)+qipan(i-4,j)==10)                 a=1;                 break             end             if (i-4>0)&&(j+4<16)&&(qipan(i,j)+qipan(i-1,j+1)+...                     qipan(i-2,j+2)+qipan(i-3,j+3)+qipan(i-4,j+4)==10)                 a=1;                 break             end         end         if a==1             break         end    end      if a==1       set(handles.gonggao,'string','选手2获胜');       break       endend 

end %while 1

以上就是五子棋游戏的程序设计,最终效果如下:

最终,会在窗口顶部显示获胜者信息:

基本本篇或者数学建模相关的其他课题,欢迎大家在公众号留言讨论或者加入数学建模交流qq群(309426503)里与我们切磋交流、经验分享。

(点击文章结尾“阅读原文”,输入提取码“wrui”获取源码文件链接)

有奖互动

最激动人心的环节到了...本期有奖互动题目是:

(1)将15子棋盘替换成25子棋盘,并修改相应的棋谱范围和逻辑规则;

(2)将五子连珠规则改为“水平方向四子连珠,其它方向五子连珠”。

第一个将改好的程序发送到qq群(309426503)中的号友可获取30元红包奖励。此活动截止日期为2019年8月19日晚10点

马上九月份即将来临的——

全国大学生数学建模竞赛(国赛)、研究生数学建模竞赛(研赛)

不知道大家都报名了没有,

公会有整理好的建模资料,回复“资料”即可获取哦

图片来自电影《五子棋少女(2018)》片段。

撰文:HCLO4

编辑:花毛     

觉得有用,不妨“在看”。

matlab五子棋_应用 | 五子棋游戏——没人能在我的程序里打败我相关推荐

  1. 如何在html里加入验证码_如何把crc校验加入到对应的程序里?看高手怎么做

    我们现在已经搞清楚了crc校验的算法,本文我就向大家具体讲解一下如何把crc校验加入到我们的程序里. 1 .crc校验使用原理 crc校验在程序中运行的原理主要可以分为以下几步. 第一步:主站发送数据 ...

  2. inventor2五子棋游戏apk_五子棋大师2中文版游戏

    五子棋大师2中文版是一款经典好玩的五子棋游戏,计有世界比赛和区域比赛两种形态.无论何种比赛形态,玩家均必须和电脑控制的几位对手进行比赛,求取最佳名次,以打入排行榜.电脑控制的对手棋力和棋风各有不同,但 ...

  3. java android五子棋_基于android实现五子棋开发

    基于Android的五子棋的开发,供大家参考,具体内容如下 需求分析 1 棋盘和棋子绘制 2 按照五子棋的规则制定游戏胜负规则 3 鼠标响应 在对战中 需要通过鼠标点击下棋 进行游戏的基本操作 4 游 ...

  4. Java程序验证五子棋先手必胜,五子棋怎样下最厉害_五子棋先手必胜开局图

    五子棋是很好的益智游戏,那么五子棋怎样下才是最厉害的呢?小编整理了五子棋的先手必胜开局图,希望可以帮助大家! 五子棋先手必胜开局图 五子棋阵法(一)八卦阵1 五子棋玩儿家们经常提到"八卦阵& ...

  5. java人际对战五子棋_系统框图如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输...

    展开全部 一.实验题目 五子棋游戏e69da5e6ba9062616964757a686964616f31333365633835. 二.问题分析 五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策 ...

  6. easyx游戏编程:五子棋(C语言游戏开发)

    easyx游戏编程:五子棋(C语言游戏开发) 五子棋: 本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接: https://easyx.cn/downloads/. 下方有源 ...

  7. 《有限与无限的游戏》第二章 没人能独自玩游戏:经典摘抄(1)

    没有人能独自一人玩游戏.一个人不成其为人,没有群体,便没有自我.我们并不是作为我们本身与他人有关系,相反,我们是与他人有关系的我们. 只有能够变化的,才能够持续下去,这是无限游戏的参与者所遵循的原则. ...

  8. 《有限与无限的游戏》第二章 没人能独自玩游戏:经典摘抄(3)

    将社会视为文化的一种,并不等同于要推翻甚至或改变社会,而只是去消除它感知的必要性.无限游戏的参与者有他们的规则,他们只是不忘记这一点:规则是对一致同意的一种表达,并不是对一致同意的要求. 社会由其边界 ...

  9. C++毕业设计——基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏

    基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现,文章末尾附有本毕业设 ...

最新文章

  1. 优秀的代码都是如何分层的?
  2. Makefile的补充学习
  3. 字符串阵列分别输出元素的索引,原值和长度
  4. 给文本框添加模糊搜索功能(“我记录”MVC框架下实现)
  5. 安装-consul服务发现集群
  6. 双11成交多少和我无关,但这个魔性MV真的让我笑喷!
  7. 编写数据访问代码测试–单元测试是浪费
  8. HTML5基础一:常用布局标签
  9. jenkins 拉取git源码超时
  10. javascript中的字符串编码、字符串方法详解
  11. FCKeditor配置和使用(转)
  12. 学界还是业界?当 IT 女孩们面临未来选择
  13. swt中关于Text.setSelection()的记录
  14. Linux下安装并启动MongoDB
  15. R语言-聚类分析(系统聚类)
  16. 使用matplotlib画对数函数图像
  17. Java初学01:学习路线,springcloud视频下载
  18. CSS3选择器(选择符)
  19. PG数据库:分组后取每组第一条数据
  20. 一页PPT证明黎曼猜想?Michael Atiyah的正式演讲炸了锅

热门文章

  1. How is account image maintained in CRM rendered in Fiori
  2. 从产品展示页面谈谈Hybris系列之三:Hybris Service层介绍
  3. mysql 事务 myisam,InnoDB和MyISAM的差别(mysql事务处理)
  4. 服务器内提取文件,linux命令如何提取文件夹内特定文件路径
  5. proxy connect abort处理方法_Java代理设计模式(Proxy)的几种具体实现
  6. php截取数组中的字符串,PHP 中使用explode()函数切割字符串为数组的示例
  7. android js 弹窗,Android WebView 不能弹出alert的对话框
  8. JAVA复习(CharSequence接口、RunTime类、System类、object类中的finalize())
  9. Notepad++远程连接Linux系统
  10. mysql包导入之后idea仍然报错_IDEA连接MySQL报错怎么弄?