上篇博客我们已经进行了三子棋游戏的编写,然而上篇博客中三子棋电脑太笨,从而没有“博弈”
所以这篇我们来对电脑进行优化。
对电脑的优化,无非就是让它长个脑子,有一定的判断能力,想让它“长个脑子”很简单,就像我们判断输赢一样,当电脑发现你差一个棋子就可以赢时,它会来拦截你。
编写一个拦截函数代码如下:
int DeteComputer(char board[ROW][COL], int row, int col)
{
int i = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][2] == ' ')
{
board[i][2] = '#';
return 1;
}
if (board[i][0] == board[i][2] && board[i][1] == ' ')
{
board[i][1] = '#';
return 1;
}
if (board[i][1] == board[i][2] && board[i][0] == ' ')
{
board[i][0] = '#';
return 1;
}
}
//列判断
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[2][i] == ' ')
{
board[2][i] = '#';
return 1;
}
if (board[0][i] == board[2][i] && board[1][i] == ' ')
{
board[1][i] = '#';
return 1;
}
if (board[1][i] == board[2][i] && board[0][i] == ' ')
{
board[0][i] = '#';
return 1;
}
}
//对角线判断
if (board[1][1] == board[0][0] && board[2][2] == ' ')
{
board[2][2] = '#';
return 1;
}
if (board[0][0] == board[2][2] && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][2] && board[0][0] == ' ')
{
board[0][0] = '#';
return 1;
}
//
if (board[0][2] == board[1][1] && board[2][0] == ' ')
{
board[2][0] = '#';
return 1;
}
if (board[0][2] == board[2][0] && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][0] && board[0][2] == ' ')
{
board[0][2] = '#';
return 1;
}
return 0;
}
可以看出,编写思路与我们编写判断输赢时差不了多少,可以说是对输赢这个结果的一个拦截。对行、列、对角线上即将有三个相同符号组成一条线时做出判断并拦截。
编写完这个拦截函数,我们再将它放入电脑的“脑子”里:
//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
if (DeteComputer(board, row, col)) //判断
{
;
break;
}
else
{
int x = 0;
int y = 0;
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
}
之后电脑就可以对你精准的拦截了。