Я пытаюсь реализовать алгоритм MinMax для четырех подряд (или подключить 4 или подключить четыре) игры.Реализация и использование MinMax с четырьмя подряд (connect4) игра
Я думаю, что у меня есть идея, он должен построить дерево возможных досок до определенной глубины, оценить их и вернуть их результат, тогда мы просто возьмем максимум этих баллов.
Итак, aiChooseCol()
проверяет счет каждого возможного столбца, вызывая MinMax()
и возвращает столбец с максимальным счетом.
Теперь я не был уверен, это правильный способ позвонить MinMax()
?
Можно ли проверить temp = Math.Max(temp, 1000);
?
Я все еще не сделал эвристическую функцию, но это должно хотя бы признать выигрышный столбец и выбрать его, но в настоящее время он просто выбирает первый свободный столбец слева ... Я не могу понять, что я делать неправильно.
private int AiChooseCol()
{
int best = -1000;
int col=0;
for (int i = 0; i < m_Board.Cols; i++)
{
if (m_Board.CheckIfColHasRoom(i))
{
m_Board.FillSignInBoardAccordingToCol(i, m_Sign);
int t = MinMax(5, m_Board, board.GetOtherPlayerSign(m_Sign));
if (t > best)
{
best = t;
col = i;
}
m_Board.RemoveTopCoinFromCol(i);
}
}
return col;
}
private int MinMax(int Depth, board Board, char PlayerSign)
{
int temp=0;
if (Depth <= 0)
{
// return from heurisitic function
return temp;
}
char otherPlayerSign = board.GetOtherPlayerSign(PlayerSign);
char checkBoard = Board.CheckBoardForWin();
if (checkBoard == PlayerSign)
{
return 1000;
}
else if (checkBoard == otherPlayerSign)
{
return -1000;
}
else if (!Board.CheckIfBoardIsNotFull())
{
return 0; // tie
}
if (PlayerSign == m_Sign) // maximizing Player is myself
{
temp = -1000;
for (int i = 0; i < Board.Cols; i++)
{
if (Board.FillSignInBoardAccordingToCol(i, PlayerSign)) // so we don't open another branch in a full column
{
var v = MinMax(Depth - 1, Board, otherPlayerSign);
temp = Math.Max(temp, v);
Board.RemoveTopCoinFromCol(i);
}
}
}
else
{
temp = 1000;
for (int i = 0; i < Board.Cols; i++)
{
if (Board.FillSignInBoardAccordingToCol(i, PlayerSign)) // so we don't open another branch in a full column
{
var v = MinMax(Depth - 1, Board, otherPlayerSign);
temp = Math.Min(temp, v);
Board.RemoveTopCoinFromCol(i);
}
}
}
return temp;
}
Некоторые примечания:
FillSignInBoardAccordingToCol()
возвращает логическое значение, если она была успешной.
Тип board
имеет массив char[,]
с фактической доской и знаками игроков.
Этот код находится в классе AI Player.
В 'AiChooseCol' вы не передаете столбец' i' в 'MinMax', так как он знает, в каком столбце вы его просите оценить? – juharr
Ой, может быть, я должен разместить монету в столбце 'i' перед вызовом' MinMax() '? @juharr – shinzou
Да, я знаю, что он может быть реорганизован. Он по-прежнему не работает с фиксацией 'AiChooseCol'. @juharr – shinzou