前言:
只是个matlab初学者,本意是记录一下自己matlab学习之余搞的小玩意,所以代码技术含量不高,计算复杂效率低下,也欢迎大家讨论、指导。
实现:
用plot绘制一个棋盘
代码:
hold on
for i=1:15 %绘制15条横线,作为棋盘的横线
heng(i,:)=linspace(i,i,15);
plot(x,heng(i,:),'k-')
end
shu=linspace(15,15,15); %定义好绘制竖线需要的数组
stem(x,shu,'- . k',"MarkerSize",0.001); %用stem火柴绘制棋盘的竖线
axis([1,15,1,15]) %限制坐标轴显示范围
axis square; %使坐标轴显示为正方形
思路:
hold on后用plot和stem分别绘制棋盘的横线和竖线
效果图:![](https://img-blog.csdnimg.cn/direct/ffc9a8efd24f43a2902f15a48cffd1b8.png)
落棋与判定:
代码:
for n=1:255 %棋盘能落255个棋子
[a,b]=ginput(1); %获取鼠标点击的坐标
if mod(n,2)==1 %判断n是否奇数来判定是否是玩家1落子
p1=p1+1; %玩家1落子数加1
p1x(p1)=round(a); %落子横坐标为鼠标点击横坐标最接近的整数
p1y(p1)=round(b); %落子纵坐标为鼠标点击纵坐标最接近的整数
if p2>=1 %如果玩家2落过子,则判断此次落子是否与玩家2的棋子重合
for i=1:p2 %遍历
if p1x(p1)==p2x(i)&&p1y(p1)==p2y(i) %判断是否重合
[a,b]=ginput(1); %重新输入
p1x(p1)=round(a); %重新落子
p1y(p1)=round(b); %重新落子
break
else %不重合则不操作
end
end
else %玩家2没落过子,则不操作
end
if p1>=2 %如果玩家1落过子,则判断此次落子是否与以前的棋子重合
for j=1:p1-1 %遍历
if p1x(p1)==p1x(j)&&p1y(p1)==p1y(j) %判断是否重合
[a,b]=ginput(1); %重新输入
p1x(p1)=round(a); %重新落子
p1y(p1)=round(b); %重新落子
break
else %不重合则不操作
end
end
else %玩家1没落过子,则不操作
end
plot(p1x,p1y,'r.',"MarkerSize",30) %绘制玩家1的棋子
else %n不是奇数则玩家2落子
p2=p2+1; %玩家2落子数加1
p2x(p2)=round(a); %落子横坐标为鼠标点击横坐标最接近的整数
p2y(p2)=round(b); %落子纵坐标为鼠标点击纵坐标最接近的整数
for i=1:p1 %遍历
if p2x(p2)==p1x(i)&&p2y(p2)==p1y(i) %判断是否与玩家1的棋子重合
[a,b]=ginput(1); %重新输入
p2x(p2)=round(a); %重新落子
p2y(p2)=round(b); %重新落子
break
else %不重合则不操作
end
end
for j=1:p2-1 %遍历
if p2x(p2)==p2x(j)&&p2y(p2)==p2y(j) %%判断是否与玩家2以前的棋子重合
[a,b]=ginput(1); %重新输入
p2x(p2)=round(a); %重新落子
p2y(p2)=round(b); %重新落子
break
else %不重合则不操作
end
end
plot(p2x,p2y,'b.',"MarkerSize",30) %绘制玩家2的棋子
end
if n>=9 %开启胜负判定
for x1=1:p1 %遍历玩家1棋子
for x2=1:p1
for x3=1:p1
for x4=1:p1
for x5=1:p1
%对棋子左上右下。左下右上,垂直,水平四个连子的方向判定
if ((p1x(x5)+4)==(p1x(x4)+3)&&(p1x(x4)+3)==(p1x(x3)+2)&&(p1x(x3)+2)==(p1x(x2)+1)&&(p1x(x2)+1)==(p1x(x1))&&(p1y(x5)+4)==(p1y(x4)+3)&&(p1y(x4)+3)==(p1y(x3)+2)&&(p1y(x3)+2)==(p1y(x2)+1)&&(p1y(x2)+1)==p1y(x1))||((p1x(x5)+4)==(p1x(x4)+3)&&(p1x(x4)+3)==(p1x(x3)+2)&&(p1x(x3)+2)==(p1x(x2)+1)&&(p1x(x2)+1)==(p1x(x1))&&(p1y(x5)-4)==(p1y(x4)-3)&&(p1y(x4)-3)==(p1y(x3)-2)&&(p1y(x3)-2)==(p1y(x2)-1)&&(p1y(x2)-1)==(p1y(x1)))||(p1x(x5)==p1x(x4)&&p1x(x4)==p1x(x3)&&p1x(x3)==p1x(x2)&&p1x(x2)==p1x(x1)&&(p1y(x5)+4)==(p1y(x4)+3)&&(p1y(x4)+3)==(p1y(x3)+2)&&(p1y(x3)+2)==(p1y(x2)+1)&&(p1y(x2)+1)==p1y(x1))||((p1x(x5)-4)==(p1x(x4)-3)&&(p1x(x4)-3)==(p1x(x3)-2)&&(p1x(x3)-2)==(p1x(x2)-1)&&(p1x(x2)-1)==(p1x(x1))&&p1y(x5)==p1y(x4)&&p1y(x4)==p1y(x3)&&p1y(x3)==p1y(x2)&&p1y(x2)==p1y(x1))
return %如果连子则停止程序
else
continue %如果没连子则继续
end
end
end
end
end
end
for x1=1:p2 %遍历玩家2棋子
for x2=1:p2
for x3=1:p2
for x4=1:p2
for x5=1:p2
%对棋子左上右下。左下右上,垂直,水平四个连子的方向判定
if ((p2x(x5)+4)==(p2x(x4)+3)&&(p2x(x4)+3)==(p2x(x3)+2)&&(p2x(x3)+2)==(p2x(x2)+1)&&(p2x(x2)+1)==(p2x(x1))&&(p2y(x5)+4)==(p2y(x4)+3)&&(p2y(x4)+3)==(p2y(x3)+2)&&(p2y(x3)+2)==(p2y(x2)+1)&&(p2y(x2)+1)==p2y(x1))||((p2x(x5)+4)==(p2x(x4)+3)&&(p2x(x4)+3)==(p2x(x3)+2)&&(p2x(x3)+2)==(p2x(x2)+1)&&(p2x(x2)+1)==(p2x(x1))&&(p2y(x5)-4)==(p2y(x4)-3)&&(p2y(x4)-3)==(p2y(x3)-2)&&(p2y(x3)-2)==(p2y(x2)-1)&&(p2y(x2)-1)==(p2y(x1)))||(p2x(x5)==p2x(x4)&&p2x(x4)==p2x(x3)&&p2x(x3)==p2x(x2)&&p2x(x2)==p2x(x1)&&(p2y(x5)+4)==(p2y(x4)+3)&&(p2y(x4)+3)==(p2y(x3)+2)&&(p2y(x3)+2)==(p2y(x2)+1)&&(p2y(x2)+1)==p2y(x1))||((p2x(x5)-4)==(p2x(x4)-3)&&(p2x(x4)-3)==(p2x(x3)-2)&&(p2x(x3)-2)==(p2x(x2)-1)&&(p2x(x2)-1)==(p2x(x1))&&p2y(x5)==p2y(x4)&&p2y(x4)==p2y(x3)&&p2y(x3)==p2y(x2)&&p2y(x2)==p2y(x1))
return %如果连子则停止程序
else
continue %如果没连子则继续
end
end
end
end
end
end
end
end
思路:
用ginput函数获取鼠标点击坐标
判定落子是否与以前落下的棋子重合
在下了第9颗棋子后开始遍历两个玩家的棋子判断是否五连子
效果:
后记:
如果落子与以前的棋子重合,只有一次重新落子机会,如果第二次落子仍然重合,则视为放弃,让对方玩家落子(其实是没写出来一直检测重合),后面有时间试着把一直检测重合和胜利结算页面补上