MATLAB初学日记:五子棋实现

前言:

只是个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分别绘制棋盘的横线和竖线

效果图:

落棋与判定:

代码:

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颗棋子后开始遍历两个玩家的棋子判断是否五连子

效果:

后记:

如果落子与以前的棋子重合,只有一次重新落子机会,如果第二次落子仍然重合,则视为放弃,让对方玩家落子(其实是没写出来一直检测重合),后面有时间试着把一直检测重合和胜利结算页面补上

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值