Unity 五子棋游戏设计和简单AI(2)

上文我们实现了基本五子棋的下棋的基本功能,这次我们来判断五子棋的胜负条件。逻辑是这样的:每次下棋后之后对这个棋子进行8个方向的检测,如果有相同类型的棋子则沿着棋子继续判断直到5个为止。介绍完基本思路,以下来讲讲如何实现。

1首先是检查一行的代码:设置一个偏移量为offset,两个循环分别检测每个店的正方向和负方向的棋子。当num=5时,停止游戏,宣布游戏结束。在循环中要注意设,x,y分别pos加上offset偏移量。循环条件为x,y均要小于15且大于0。每次循环加一个偏移量。(偏移量=向某一方向移动一格)

 public void CheckOneLine(int[]pos, int[] offset)
    {
        int Num = 1;
        for (int x = pos[0] + offset[0], y = pos[1] + offset[1]; (x<15&&x>0&&y<15&&y>0); x += offset[0], y += offset[1])
        {
            if (grid[x, y] == (int)turn)
            {
                Num += 1;
            }
            else break;
        }
        for (int x = pos[0] - offset[0], y = pos[1] - offset[1]; (x < 15 && x > 0 && y < 15 && y > 0); x -= offset[0], y -= offset[1])

        {
            if (grid[x, y] == (int)turn)
            {
                Num += 1;
            }
            else break;
        }
        
        if (Num == 5)
        {
            GameStart = false;
            Debug.Log("游戏结束");
        }

    }

 2以下代码是对于一个棋子8个方向的检测,由于每次检测已经包含了正负2个方向,那么只需要检测四个方向(左,上,斜右上方,斜左上方)就可以了。

public void CheckWinner(int[] pos)
    {
        CheckOneLine(pos, new int[2] { 0, 1 });
        CheckOneLine(pos, new int[2] { 1, 0 });
        CheckOneLine(pos, new int[2] { 1, 1 });
        CheckOneLine(pos, new int[2] { 1, -1 });
    }

 3将checkWinner方法放到玩家下棋的方法中,注意放的位置,要等grid先被被赋值后再进行棋子的检测。

 public  void  Play(int[] pos)
    {
       
        if (grid[pos[0], pos[1]]!=0||GameStart==false)return;
        if (turn == ChessType.Black) 
        {
            Instantiate(prefabs[0], new Vector3(pos[0], pos[1], 0), Quaternion.identity);
           
            grid[pos[0], pos[1]] = (int)ChessType.Black;
            CheckWinner(pos);
            turn = ChessType.White;
        }
        else if (turn == ChessType.White)
        {
            Instantiate(prefabs[1], new Vector3(pos[0], pos[1], 0), Quaternion.identity);
          
            grid[pos[0], pos[1]] = (int)ChessType.White;
            CheckWinner(pos);
            turn = ChessType.Black;

        }

4 如下图所示,这样我们就完成了基本的unity五子棋胜利判定的逻辑了。 

 5 悔棋的思路:我们可以再新建一个栈,保存每次下棋的位置,当每次想要悔棋的时候可以直接将上次的棋子出栈,并且销毁。代码就不在此贴出了,有兴趣的读者可以自行尝试完成悔棋的功能。

如果有别的想法也欢迎讨论交流,本文用到的东西其实不多,非常简单。在最后我会把完整工程的源代码发布出来,以供读者参考。

五子棋起源于中国,竞技项目之一,是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。

上文链接:Unity五子棋功能 和简单AI实现(1)

https://blog.csdn.net/makise2333/article/details/126069263​​​​​​​

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值