2014-01-13 2 views
0

Я пытаюсь реализовать минимаксный алгоритм для tic tac toe с обрезкой альфа-бета. Прямо сейчас у меня работает программа, но она, похоже, не работает. Всякий раз, когда я запускаю его, он, кажется, вводит мусор во все квадраты. Я реализовал его так, чтобы моя функция минимакс принимала состояние платы и изменяла это состояние, так что, когда оно будет закончено, состояние платы будет содержать следующий лучший ход. Затем я устанавливаю «это» равным модифицированной доске. Вот мои функции для минимаксном алгоритма:Алгоритм MiniMax для отказа Tic Tac Toe

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 .h: http://pastebin.com/94mDdy7x

+1

Я установил вмятины на свой код и массировать его в более компактный формат. Пожалуйста, сделайте это самостоятельно до публикации в следующий раз. – Richard

+1

Предположительно здесь будет интересен конструктор класса платы. Пожалуйста, включите его. – Richard

+0

Конструктор классов входит в паштет. Спасибо за помощь! Это мой первый вопрос. – gacharya

ответ

1

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

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

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 через pass by value так не вернуть доску таким образом.

, что вы хотели сказать, вероятно:

int board::miniMax(int alpha, int beta, board & childWithMaximum) 
Смежные вопросы