三子棋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];

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

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>