总体的三子棋游戏代码可以参考b站比特鹏哥。
这里只优化其中电脑下棋的算法。比特鹏哥的原本部分算法如下所示,其采用的是通过给随机坐标来下棋,这样下棋玩家胜出的几率很大。
void computer_move(char arr[ROW][COL], int row, int col)
{
printf("电脑下:\n");
while (1)
{
int i = 0, j = 0;
//得到电脑随机下时的坐标
int x = rand() % row;
int y = rand() % col;
//下棋位置没有被下过
if (arr[x][y] == ' ')
{
//电脑下棋的位置用X表示
arr[x][y] = 'X';
break;
}
}
}
本文让电脑下棋的思路如下:
1、电脑下棋时判断有没有机会胜利,若有,则下到相应的位置。
2、若电脑没有胜利的机会,则判断玩家有没有胜利的机会,若有,则下到玩家即将胜利的位置(即堵棋)
3、若以上两种情况都没有,电脑随机下。
电脑下棋函数的总代码如下所示:
void computer_move(char arr[ROW][COL], int row, int col)
{
printf("电脑下:\n");
while (1)
{
int i = 0, j = 0;
//电脑是否已经下完棋的标志
int flag = 0;
//电脑根据是否可以获胜来下棋
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
arr[i][j] = 'X';
if (game_over(arr, ROW, COL) == 'X')
{
arr[i][j] = 'X';
flag = 1;
break;
}
else
arr[i][j] = ' ';
}
}
if (flag == 1)
{
break;
}
}
//不能获胜时优先选择堵棋
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (flag == 0)
{
if (arr[i][j] == ' ')
{
arr[i][j] = 'O';
if (game_over(arr, ROW, COL) == 'O')
{
arr[i][j] = 'X';
flag = 1;
break;
}
else
arr[i][j] = ' ';
}
}
}
if (flag == 1)
{
break;
}
}
//电脑无需堵棋时随机下棋
if (flag == 0)
{
//得到电脑随机下时的坐标
int x = rand() % row;
int y = rand() % col;
//下棋位置没有被下过
if (arr[x][y] == ' ')
{
//电脑下棋的位置用X表示
arr[x][y] = 'X';
break;
}
}
else
break;
}
//打印电脑下棋后的棋盘
Display_board(arr, row, col);
}
电脑没机会获胜,玩家也没机会获胜时,电脑随机下,运行效果如下图所示。
电脑没机会获胜而玩家即将胜利时,电脑会下到第3行3列的位置,运行效果如下图所示。
当电脑有机会获胜时,电脑会下到第2行3列的位置,运行效果如下图所示。