Алгоритм MiniMax для отказа Tic Tac Toe

Я пытаюсь реализовать минимаксный алгоритм для крестики-нолики с альфа-бета-обрезкой. Прямо сейчас у меня запущена программа, но, похоже, она не работает. Всякий раз, когда я запускаю его, кажется, что он вводит мусор во все квадраты. Я реализовал это так, чтобы моя минимаксная функция принимала состояние доски и изменяла это состояние так, чтобы, когда она будет закончена, состояние доски содержало следующий лучший ход. Затем я устанавливаю «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

0

Решение

Может быть много проблем с вашим кодом … вы наверняка опубликовали его много. Поскольку вы задаете свой вопрос, вы обязаны сначала попробовать все, что можете, а затем сократить свой вопрос до наименьшего количества кода, необходимого для разъяснения того, что происходит. На самом деле, я не чувствую, что вы приложили много усилий, чтобы задать этот вопрос.

Но, возможно, я все еще могу оказать некоторую помощь:

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)
1

Другие решения

Других решений пока нет …