相信各位小比特对三子棋的代码已经很熟悉了,各位懒得看相同的代码,我也懒得将每一个函数都解释一遍,所以这篇博客只会详细解释改进后的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种结果,输入上去太繁琐。要让电脑智能,也就是我们所说的人工智能,是我们所追求的东西,我们一起学习,共同进步,实现我们的梦想!
小比特,大梦想!以此篇记梦想。
版权归原作者 ly@눈_눈 所有, 如有侵权,请联系我们删除。