Я пытаюсь реализовать минимаксный алгоритм для крестики-нолики с альфа-бета-обрезкой. Прямо сейчас у меня запущена программа, но, похоже, она не работает. Всякий раз, когда я запускаю его, кажется, что он вводит мусор во все квадраты. Я реализовал это так, чтобы моя минимаксная функция принимала состояние доски и изменяла это состояние так, чтобы, когда она будет закончена, состояние доски содержало следующий лучший ход. Затем я устанавливаю «this» равным измененной доске. Вот мои функции для минимаксного алгоритма:
void board::getBestMove() {
board returnBoard;
miniMax(INT_MIN + 1, INT_MAX -1, returnBoard);
*this = returnBoard;
}
int board::miniMax(int alpha, int beta, board childWithMaximum) {
if (checkDone())
return boardScore();
vector<board> children = getChildren();
for (int i = 0; i < 9; ++i) {
if(children.empty()) break;
board curr = children.back();
if (curr.firstMoveMade) { // not an empty board
board dummyBoard;
int score = curr.miniMax(alpha, beta, dummyBoard);
if (computerTurn && (beta > score)) {
beta = score;
childWithMaximum = *this;
if (alpha >= beta) break;
} else if (alpha < score) {
alpha = score;
childWithMaximum = *this;
if (alpha >= beta) break;
}
}
}
return computerTurn? alpha : beta;
}
vector<board> board::getChildren() {
vector<board> children;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (getPosition(i, j) == '*') { //move not made here
board moveMade(*this);
moveMade.setPosition(i, j);
children.push_back(moveMade);
}
}
}
return children;
}
И вот мои полные файлы, если кто-то хочет попробовать запустить его:
.CPP: http://pastebin.com/ydG7RFRX
.ч: http://pastebin.com/94mDdy7x
Может быть много проблем с вашим кодом … вы наверняка опубликовали его много. Поскольку вы задаете свой вопрос, вы обязаны сначала попробовать все, что можете, а затем сократить свой вопрос до наименьшего количества кода, необходимого для разъяснения того, что происходит. На самом деле, я не чувствую, что вы приложили много усилий, чтобы задать этот вопрос.
Но, возможно, я все еще могу оказать некоторую помощь:
void board::getBestMove() {
board returnBoard;
miniMax(INT_MIN + 1, INT_MAX -1, returnBoard);
*this = returnBoard;
}
Посмотрите, как вы говорите *this = returnBoard
,
Это должно означать, что вы хотите получить доску от miniMax
,
Но посмотри как miniMax
определено!
int board::miniMax(int alpha, int beta, board childWithMaximum)
Принимает childWithMaximum
с помощью передать по значению так что не могу вернуть доску таким образом.
то, что вы хотели сказать, было, вероятно:
int board::miniMax(int alpha, int beta, board & childWithMaximum)
Других решений пока нет …