想把以前写过的小游戏出一款详细教程呀 这两天发现五子棋有个简单的写法 虽然说有点弊端但这个程序真的很简单呀 一共只有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 的周期性变化啦,也就是轮流下黑子白子
end
case 'backspace'
co=0;
if control==0&&~isempty(black),black(end,:)=[];co=1;end
if control==1&&~isempty(white),white(end,:)=[];co=1;end
if co==1,control=mod(control+1,2);end
end
wuziqigame()每次按完键后重新画一遍图,这里wuziqigame负责画图和显示输赢
end
第五步:不断重新绘制棋盘
function wuziqigame(~,~)
postion(postion>9)=-9;%如果红叉坐标太大即超出界面,我们将它坐标减小移回界面内
postion(postion9)=-9;
postion(postion
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?