Я пытаюсь реализовать NegaMax ai для Connect 4. Иногда алгоритм работает хорошо, и ai может победить. Однако иногда он полностью не блокирует противника 3 подряд или не делает победного броска, когда у него три подряд.
Функция оценки выполняет итерацию по сетке (по горизонтали, вертикали, по диагонали вверх, по диагонали вниз) и принимает каждый набор из четырех квадратов. Затем он проверяет в каждом из этих наборов и оценивает на основе этого.
Я основал функцию на оценочном коде, представленном здесь: http://blogs.skicelab.com/maurizio/connect-four.html
Моя функция заключается в следующем:
//All sets of four tiles are evaluated before this
//and values for the following variables are set.
if (redFoursInARow != 0)
{
redScore = INT_MAX;
}
else
{
redScore = (redThreesInARow * threeWeight) + (redTwosInARow * twoWeight);
}
int yellowScore = 0;
if (yellowFoursInARow != 0)
{
yellowScore = INT_MAX;
}
else
{
yellowScore = (yellowThreesInARow * threeWeight) + (yellowTwosInARow * twoWeight);
}
int finalScore = yellowScore - redScore;
return turn ? finalScore : -finalScore; //If this is an ai turn, return finalScore. Else return -finalScore.
Моя функция negamax выглядит так:
inline int NegaMax(char g[6][7], int depth, int &bestMove, int row, int col, bool aiTurn)
{
{
char c = CheckForWinner(g);
if ('E' != c || 0 == depth)
{
return EvaluatePosition(g, aiTurn);
}
}
int bestScore = INT_MIN;
for (int i = 0; i < 7; ++i)
{
if (CanMakeMove(g, i)) //If column i is not full...
{
{
//...then make a move in that column.
//Grid is a 2d char array.
//'E' = empty tile, 'Y' = yellow, 'R' = red.
char newPos[6][7];
memcpy(newPos, g, sizeof(char) * 6 * 7);
int newRow = GetNextEmptyInCol(g, i);
if (aiTurn)
{
UpdateGrid(newPos, i, 'Y');
}
else
{
UpdateGrid(newPos, i, 'R');
}
int newScore = 0; int newMove = 0;
newScore = NegaMax(newPos, depth - 1, newMove, newRow, i, !aiTurn);
newScore = -newScore;
if (newScore > bestScore)
{
bestMove = i;
bestScore = newScore;
}
}
}
}
return bestScore;
}
Я знаю, что Connect 4 был решен, потому что есть определенно лучшие способы сделать это, но любая помощь или предложения по исправлению / улучшению этого будут высоко оценены. Спасибо!
Задача ещё не решена.