想把以前写过的小游戏出一款详细教程呀
这两天发现五子棋有个简单的写法
虽然说有点弊端但这个程序真的很简单呀
一共只有70多行
相信大家就算没有基础多查多看也能学会吧嗯哒
第一步:界面设置
axis equal%让横竖坐标比例相等
axis([-10,10,-10,10])%坐标轴范围设置为X,Y轴都是-10到10
set(gca,‘xtick’,[],‘ytick’,[],‘xcolor’,‘w’,‘ycolor’,‘w’)
%用xtick,ytick删除掉坐标轴刻度,并将坐标轴颜色设置为white
set(gca,‘color’,[0.8392,0.7216,0.3804])
%将背景的颜色设置为棕色,这里的三个数字表示的是红蓝绿的比例
hold on%保持界面不关闭
第二步:绘制棋盘
这里直接用散点图scatter和折线图plot 进行绘制,直接暴力取点绘制
x1=[-9,-9,-8,-8,-7,-7,-6,-6,-5,-5,-4,-4,-3,-3,-2,-2,-1,-1,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9];
y1=[-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9];
x2=[-9,9,9,-9,-9];y2=[9,9,-9,-9,9];x3=[-9.2,9.2,9.2,-9.2,-9.2];y3=[9.2,9.2,-9.2,-9.2,9.2];x4=[-6,-6,-6,0,0,0,6,6,6];y4=[6,0,-6,6,0,-6,6,0,-6];
plot(x1,y1,‘k’)
plot(y1,x1,‘k’)
plot(x2,y2,‘k’,‘LineWidth’,2)
plot(x3,y3,‘k’)
scatter(gca,x4,y4,30,‘k’,‘filled’)

第三步:基础设置
row=19;col=19;%棋盘矩阵大小为19x19这里的矩阵大小画图使用不到的但是后期运算可以用到;
win=0;%这是判断输赢的一个参数
control=1;%这是判断下子颜色的一个参数,1为黑子,0为白子
postion=[0 0];%这是那个红叉的坐标就是下棋位置,这里的下棋方法为上下左右加空格键下棋
black=[20,20];white=[-20,-20];%随便取两个棋子的初始坐标
black(1,:)=[];white(1,:)=[];%把那两个初始坐标删掉
%这里取初始坐标又删掉是为了使这两个点集是两列的空矩阵
plotblack=scatter(gca,black(:,1),black(:,2),150,‘k’,‘filled’);
plotwhite=scatter(gca,white(:,1),white(:,2),150,‘w’,‘filled’);
plotpostion=scatter(gca,postion(1,1),postion(1,2),150,‘rx’);
设置绘图的初始数据
第四步:按键设置

set(gcf, 'KeyPressFcn', @key) %设置有任何按键动作时,调用key这个函数function key(~,event)%定义函数key,其中event是按键动作switch event.Key%将按键动作转换case 'uparrow'%上下左右这四个都是一样的这里只挑一个进行解释%将按键 uparrow即上箭头,转化为将postion坐标上移postion=postion+[0,1];case 'downarrow'postion=postion+[0,-1];case 'leftarrow'postion=postion+[-1,0];case 'rightarrow'postion=postion+[1,0];   case 'c'%将按键c转化为按下按键红叉回到画面最中央postion=[0,0];case 'space'%空格键if sum(ismember([black(:,1:2);white(:,1:2)],postion(1,1:2),'rows'))==0%这句话用来判断下棋的点上有没有棋子%这里解释一下%这个小程序里棋子的坐标储存方法是这样的%例如black=[x1,y1;x2,y2]就是指在(x1,y1),(x2,y2)坐标上两个点是黑棋%其他的白棋和红叉同理%然后解释一下ismember就是判断前面的集合的项在后面的集合中存不存在%因为我们每行代表一个点,我们这里加上‘rows'表示判断前面的点在后面存不存在%用法ismember(A,B,'rows')%当然也可以用效果差不多的intersect来判断%这里用sum有一点使懒,算是一种小bug的写法,最好还是用isempty判断if control==1,black=[black;postion];end%如果control=1那么在红叉位置下黑子if control==0,white=[white;postion];end%同上control=mod(control+1,2);%mod是求余函数呀这里就是求control+1除以2的余数%这样的话control就能1 0 1 0 1 0 的周期性变化啦,也就是轮流下黑子白子 endcase 'backspace'co=0;if control==0&&~isempty(black),black(end,:)=[];co=1;endif control==1&&~isempty(white),white(end,:)=[];co=1;endif co==1,control=mod(control+1,2);endendwuziqigame()每次按完键后重新画一遍图,这里wuziqigame负责画图和显示输赢end

第五步:不断重新绘制棋盘

    function wuziqigame(~,~)postion(postion>9)=-9;%如果红叉坐标太大即超出界面,我们将它坐标减小移回界面内postion(postion<-9)=9;%和上面差不多panding()%这是一个胜负判断程序,后面会讲 set(plotblack,'XData',black(:,1),'YData',black(:,2))%还好scatter有Data功能,即可以不用删除上一幅图更新新的图片,非常好用set(plotwhite,'XData',white(:,1),'YData',white(:,2))set(plotpostion,'XData',postion(1,1),'YData',postion(1,2))if win==1%这个是一方赢事弹出窗口的程序,比较简单就不讲了buttonName1=questdlg('black win. What do you mean to do?','black win','close','restart','close');if isempty(buttonName1)buttonName1='end'endif strcmp(buttonName1,'restart')clfwuziqi()else if strcmp(buttonName1,'close'),closeendendendif win==-1buttonName1=questdlg('white win. What do you mean to do?','white win','close','restart','close');if isempty(buttonName1)buttonName1='end'endif strcmp(buttonName1,'restart')clfwuziqi()else if strcmp(buttonName1,'close')closeendendendend

第六步:判断输赢的核心算法
核心算法真的短的吓人呀
不过感觉可能不是很好理解
至少要能熟练地运用
这样写很简单还有一个写法就是相对于最后下的一步棋(因为形成的五子连珠必定是由于新棋子的加入,不然它在下新子之前就已经赢了)进行的链式搜索,可以以后再讲。

    function panding(~,~)mat=zeros(row+4,col+4);%创建一个比棋盘大四行四列的全零矩阵x=3:(row+2);y=3:(col+2);%设置x,y是中间row行col列qipan=zeros(row,col);%设置棋盘是row行col列的全零矩阵blackpos=black(:,1)+10+(black(:,2)+10-1)*row;whitepos=white(:,1)+10+(white(:,2)+10-1)*row;%将双参数索引转化为单参数索引%例如对19X19的矩阵来说它的第(1,2)个数,即第一行第二列对应其第20个数%这里加上10是因为棋子的坐标是从-9开始的qipan(blackpos)=1;%棋盘矩阵中黑子的位置设置数值为1qipan(whitepos)=-1;%棋盘矩阵中黑子的位置设置数值为-1mat(x,y)=qipan;%将棋盘矩阵放在比棋盘矩阵大两圈的矩阵的正中间mat1=mat(x,y)+mat(x+1,y)+mat(x+2,y)+mat(x-1,y)+mat(x-2,y);%每一个位置的数值和它左侧坐标,左左侧坐标,右侧坐标,右右侧坐标相加mat2=mat(x,y)+mat(x,y+1)+mat(x,y+2)+mat(x,y-1)+mat(x,y-2);%每一个位置的数值和它上侧坐标,上上侧坐标,下侧坐标,下下侧坐标相加mat3=mat(x,y)+mat(x+1,y+1)+mat(x+2,y+2)+mat(x-1,y-1)+mat(x-2,y-2);%与前面类似mat4=mat(x,y)+mat(x+1,y-1)+mat(x+2,y-2)+mat(x-1,y+1)+mat(x-2,y+2);con=[mat1;mat2;mat3;mat4];con1=con==5;con2=con==-5;%判断mat1到mat4中有没有数值为5或者负五的点if (sum(sum(con1)))~=0,win=1;end%如果有值为5的点黑色赢 if (sum(sum(con2)))~=0,win=-1;end%如果有值为-5的点白色赢       end

第七部:将各部分连接在一起
完整代码
这里因为代码太长会在手机上显示不全,所以分成了两个代码片
将其复制在同一个m文件就可以用啦

function wuziqiaxis equalaxis([-10,10,-10,10])set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w')set(gca,'color',[0.8392,0.7216,0.3804])hold onrow=19;col=19;x1=[-9,-9,-8,-8,-7,-7,-6,-6,-5,-5,-4,-4,-3,-3,-2,-2,-1,-1,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9];y1=[-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9,9,-9,-9,9];x2=[-9,9,9,-9,-9];y2=[9,9,-9,-9,9];x3=[-9.2,9.2,9.2,-9.2,-9.2];y3=[9.2,9.2,-9.2,-9.2,9.2];x4=[-6,-6,-6,0,0,0,6,6,6];y4=[6,0,-6,6,0,-6,6,0,-6];plot(x1,y1,'k'),plot(y1,x1,'k'),plot(x2,y2,'k','LineWidth',2),plot(x3,y3,'k'),scatter(gca,x4,y4,30,'k','filled')win=0;control=1;postion=[0 0];black=[20,20];white=[-20,-20];black(1,:)=[];white(1,:)=[];plotblack=scatter(gca,black(:,1),black(:,2),150,'k','filled');plotwhite=scatter(gca,white(:,1),white(:,2),150,'w','filled');plotpostion=scatter(gca,postion(1,1),postion(1,2),150,'rx');set(gcf, 'KeyPressFcn', @key)  function wuziqigame(~,~)postion(postion>9)=-9;postion(postion<-9)=9;panding()set(plotblack,'XData',black(:,1),'YData',black(:,2))set(plotwhite,'XData',white(:,1),'YData',white(:,2))set(plotpostion,'XData',postion(1,1),'YData',postion(1,2))if win==1buttonName1=questdlg('black win. What do you mean to do?','black win','close','restart','close');if isempty(buttonName1),buttonName1='end';endif strcmp(buttonName1,'restart'),clf;wuziqi();else if strcmp(buttonName1,'close'),close;endendendif win==-1buttonName1=questdlg('white win. What do you mean to do?','white win','close','restart','close');if isempty(buttonName1),buttonName1='end';endif strcmp(buttonName1,'restart'),clf;wuziqi();else if strcmp(buttonName1,'close'),close;endendendendfunction panding(~,~)mat=zeros(row+4,col+4);x=3:(row+2);y=3:(col+2);qipan=zeros(row,col);blackpos=black(:,1)+10+(black(:,2)+10-1)*row;whitepos=white(:,1)+10+(white(:,2)+10-1)*row;qipan(blackpos)=1;qipan(whitepos)=-1;mat(x,y)=qipan;mat1=mat(x,y)+mat(x+1,y)+mat(x+2,y)+mat(x-1,y)+mat(x-2,y);mat2=mat(x,y)+mat(x,y+1)+mat(x,y+2)+mat(x,y-1)+mat(x,y-2);mat3=mat(x,y)+mat(x+1,y+1)+mat(x+2,y+2)+mat(x-1,y-1)+mat(x-2,y-2);mat4=mat(x,y)+mat(x+1,y-1)+mat(x+2,y-2)+mat(x-1,y+1)+mat(x-2,y+2);con=[mat1;mat2;mat3;mat4];con1=con==5;con2=con==-5;if (sum(sum(con1)))~=0,win=1;endif (sum(sum(con2)))~=0,win=-1;end      end
    function key(~,event)switch event.Keycase 'uparrow',postion=postion+[0,1];case 'downarrow',postion=postion+[0,-1];case 'leftarrow',postion=postion+[-1,0];case 'rightarrow',postion=postion+[1,0];   case 'c',postion=[0,0];case 'space'if sum(ismember([black(:,1:2);white(:,1:2)],postion(1,1:2),'rows'))==0if control==1,black=[black;postion];endif control==0,white=[white;postion];endcontrol=mod(control+1,2);endcase 'backspace'co=0;if control==0&&~isempty(black),black(end,:)=[];co=1;endif control==1&&~isempty(white),white(end,:)=[];co=1;endif co==1,control=mod(control+1,2);endendwuziqigame()end
end

matlab 手把手教你制作五子棋小游戏相关推荐

  1. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  2. GEC6818开发板制作五子棋小游戏

    利用GEC6818开发板制作五子棋小游戏 软件及版本:Ubuntu18.04.4,SecureCRT,Source Insight4.0,VMware Workstation Pro. 主要代码: m ...

  3. 手把手教你作出扫雷小游戏

    前言 先解释下扫雷的玩法,随机点一个方块(这个是有运气成分在的),显示以这个方块为中心,3x3的格子里雷的总个数,玩家通过这个个数判断雷的位置,继续点击下一个方块,直到找到所有雷的位置,才算成功,中途 ...

  4. python实现2048小游戏_python—手把手教你实现2048小游戏

    相信2048这个游戏对大家来说一定不陌生,下面这篇文章就主要给大家介绍了怎么用Python实现2048小游戏,文中通过注释与示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的 ...

  5. 手把手教你制作微信小程序,开源、免费、快速搞定

    最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...

  6. C++制作五子棋小游戏

    文章目录 前言 代码部分 不靠谱的结束语 前言 熟悉的味道,游戏,它又回来了······ 主要是看游戏这个专栏很火,所以今天再来写一篇关于游戏的博客吧. 来看一下运行截图(瞎下的): 代码也是基于ea ...

  7. 表白小游戏教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦)

    大家好哇~ 欢迎翻开波波和阿菌的长篇故事~ 不过捏,今天我们不讲故事,今天将由阿菌和大家分享一个小教程:教大家制作一个小游戏,可以用来送给喜欢的人.无须任何计算机专业基础,只要能操作电脑,并在初一的数 ...

  8. python语言编写五子棋小游戏

    摘要 这是我基于pygame库做个一个五子棋小游戏,通过上网学习pygame库内的具体函数,以及一些前辈的指导.在这里我们需要绘画棋盘,棋子.棋盘直接调用pygame库中的draw.lines()函数 ...

  9. python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

最新文章

  1. Struts框架核心技术小小班
  2. Lockey的沙雕低错集锦(未完待续~自己提升用)
  3. python 类继承和组合_python3--类与继承和组合
  4. boost::hana::overload用法的测试程序
  5. android studio 入门比较好的书籍
  6. 中科院分区 2020_2020中科院期刊分区出炉!文末附2020年中科院期刊分区基础版(全)...
  7. Android之HandlerThread
  8. xilinx spartan-3a iob
  9. 求N!二进制中末尾1的位置(类似于求N!中有多少个5的问题)
  10. php移动文件的函数 move_uploaded_file()和copy
  11. 1.2Sakura语法基础篇
  12. LED背光源优势的表现
  13. 大数据告诉你,中国今年最火打卡圣地竟然是它!
  14. 《虎胆龙威4》观后感
  15. 【课程全解】-UML软件建模设计
  16. VSCode常用插件汇总
  17. 编解码学习笔记(七) 微软Windows Media系列
  18. 我是小交易所老板,我现在很慌
  19. 进博抢先看 | 辉瑞、默沙东、强生、GSK、西门子医疗、蔡司、霍尼韦尔、江森自控、阿迪达斯、迪卡侬、乐高等将亮相第五届进博会...
  20. JAVA 淘宝扫码登陆以及下单流程

热门文章

  1. SQL考试练习题及全部答案2
  2. mysql中db的名词解释_数据库原理名词解释
  3. HTML+CSS+JS网页设计期末课程大作业(家居网)
  4. maven jpa mysql_Maven 版 JPA 最佳实践
  5. 图神经网络-图与图学习笔记-1
  6. 利用计算思维解决问题人和计算机都能完成,对计算思维能力养成与大学计算机基础课程改革的思考...
  7. ​Au 入门系列之三:波形编辑器操作基础
  8. 2021年线上线下融合会议需求增长,Hilton EventReady Hybrid Solutions将启动
  9. VS2015实现bmp格式图片的读取
  10. lv双肩包尺寸对照表_2016最有人气MONOGRAM LV双肩包有哪些颜色与尺寸-美丽包包网...