2014-01-13 34 views
0

我正在嘗試用alpha-beta修剪實現tic tac腳趾的minimax算法。現在我的程序正在運行,但它似乎沒有工作。每當我運行它似乎在所有的廣場輸入垃圾。我已經實現了這個功能,這樣我的極大極小功能就進入了一個電路板狀態,並修改了這個狀態,這樣當電路板完成時,電路板狀態就包含了下一個最好的移動。然後,我將「this」設置爲等同於修改過的電路板。這裏是我的功能極大極小算法:用於Tic Tac腳趾失敗的MiniMax算法

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) 

它接受通過pass by valuechildWithMaximum所以無法以這種方式返回板。

你想說的話大概是:

int board::miniMax(int alpha, int beta, board & childWithMaximum)