我正在寻找最佳评估函数,以便在minimax / alpha-beta算法中用于开发井字游戏AI。
我正在计算一行/列/对角线中的圆/十字的数量,后面有空的空间(三行一行,没有空的空间)。根据这一行中符号的数量,我将单独的分数乘以10 ^(counter-1),得到1,10或100个点。
我相信很多都可以改进,因为很少找到最佳解决方案,我在使用字母表算法中的这个功能时遇到问题
我的问题是 - 如何改进这项功能?小件代码和建议表示赞赏。
我的代码:
private int h(int[][] field, int depth, int player) //final score of the node
{
if (win(field, 1)) //if human won
return -1000; //very bad for MAX=computer
if (win(field, 0)) //if computer won
return 1000;
int heuristics = individualScore(field, 0) - individualScore(field, 1);
return heuristics;
}
private int individualScore(int[][] field, int player)
{
int sum = 0;
int otherPlayer = -1;
if (player == 0) //if computer is the current player
otherPlayer = 1; //other player is human
else
otherPlayer = 0;//Vice versa
for (int i = 0; i < 3; i++) // rows
{
int counter = 0;
bool rowAvailable = true;
for (int l = 0; l < 3; l++)
{
if (field[i][l] == player)
counter++;
if (field[i][l] == otherPlayer)
{
rowAvailable = false;
break;
}
}
if (rowAvailable && counter > 0)
sum += (int)Math.Pow(10, counter - 1);
}
for (int i = 0; i < 3; i++) // columns
{
int counter = 0;
bool columnAvailable = true;
for (int k = 0; k < 3; k++)
{
if (field[k][i] == player)
counter++;
if (field[k][i] == otherPlayer)
{
columnAvailable = false;
break;
}
}
if (columnAvailable && counter > 0)
sum += (int)Math.Pow(10, counter - 1);
}
int counterD = 0;
bool diagonalAvailable = true;
for (int i = 0; i < 3; i++) //diagonals
{
if (field[i][i] == player)
counterD++;
if (field[i][i] == otherPlayer)
{
diagonalAvailable = false;
break;
}
}
if (diagonalAvailable && counterD > 0)
sum += (int)Math.Pow(10, counterD - 1);
counterD = 0;
diagonalAvailable = true;
int j = 0;
for (int i = 2; i >= 0; i--)
{
if (field[i][j] == player)
counterD++;
if (field[i][j] == otherPlayer)
{
diagonalAvailable = false;
break;
}
}
if (diagonalAvailable && counterD > 0)
sum += (int)Math.Pow(10, counterD - 1);
return sum;
}
答案 0 :(得分:-1)
你可以让你的AI向前看一个甚至两个步骤,这样你就可以看到在AI迈出这一步之后用户(以及AI再次)有什么机会(并再次评估这个机会)。 此外,你可以添加一些东西,以便AI试图欺骗用户进入情境,他无法摆脱。这是可能的,因为在Tic-Tac-Toe中没有那么多的可能性。
如果你真的很酷,你可以建立一个神经网络,从你玩的一些游戏中学习,但这是一个完全不同的故事。