0


三子棋is_win函数改进

相信各位小比特对三子棋的代码已经很熟悉了,各位懒得看相同的代码,我也懒得将每一个函数都解释一遍,所以这篇博客只会详细解释改进后的is_win函数。

//判断每行是否相等
    for (i = 0; i < row; i++, ret = 0)
    {
        for (j = 0; j < col - 1; j++)
        {
            if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
                ret++;
        }
        if (ret == col - 1)
            return board[i][j - 1];
    }

首先,大家都知道在二维数组中,i控制行,j控制列,i和j可以控制二维数组中的一个值。所以当i=0保持不变时,j从0循环到col,可以将二维数组中的第一行表示出来;i从0循环到row,j从0循环到col-1,就可以将二位数组每行表示出来。

然后判断每行是否相同,n*n的二维数组中判断一行是否相同只需判断n-1次。

再之引入一个变量ret,循环一次,一行相邻的两个元素如果相同,则给ret++,最后只需要判断相同的次数(ret)与判断的次数(n-1)是否相同即可。

每行判断完,重新给变量ret赋值为0。

为什么return board[i][j-1]?因为最后跳出循环时,j多加了1。

引入变量的作用:还记得鹏哥讲的怎么判断素数

  int i = 0, n = 0;
  scanf("%d", &n);
  for(i = 2; i < n; i++)
      if(n % i == 0) 
          break;
  if(i == n)
      printf("%d是素数", n);
  else
      printf("%d不是素数", n);
  return 0;

这里i的作用类似于那个ret,您品......

然后判断每列相同,交叉相同都是一个道理。

//判断每列是否相等
    for (j = 0; j < col; j++, ret = 0)
    {
        for (i = 0; i < row - 1; i++)
        {
            if (board[i][j] == board[i + 1][j] && board[i][j] != ' ')
                ret++;
        }
        if (ret == col - 1)
            return board[i - 1][j];
    }
    //判断主对角线是否相等
    for (ret = 0, i = 0, j = 0; ret < row; ret++)
    {
        if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ')
        {
            i++;
            j++;
        }
    }
    if (i == row - 1)
        return board[i][j];
    //判断逆对角线是否相等
    for (ret = 0, i = row - 1, j = 0; ret < row; ret++)
    {
        if (board[i][j] == board[i - 1][j + 1] && board[i][j] != ' ')
        {
            i--;
            j++;
        }
    }
    if (j == row - 1)
        return board[i][j];

总结: 当解题时,引入一个变量就可以达到我们想要的结果。

这个三子棋不足的地方就是电脑下的棋太随机,不智能,而想要电脑智能,那就需要大量的算法。对于一个简单的三子棋来说,电脑有864*2=384种结果,输入上去太繁琐。要让电脑智能,也就是我们所说的人工智能,是我们所追求的东西,我们一起学习,共同进步,实现我们的梦想!

小比特,大梦想!以此篇记梦想。

标签: c#

本文转载自: https://blog.csdn.net/weixin_68278653/article/details/126356625
版权归原作者 ly@눈_눈 所有, 如有侵权,请联系我们删除。

“三子棋is_win函数改进”的评论:

还没有评论