2013-12-16 38 views
2

對於我的Tic Tac腳趾AI,只需要產生一個隨機移動。我有一個類AIPlayermakeAMove函數。它只是產生兩個從0到3(行和列)的隨機數,並檢查單元是否被佔用。它似乎工作正常,但由於某種原因,它永遠不會採取勝利的舉措。在命令行中,當我嘗試讓它獲勝並且只剩下勝利的動作時,它不會拿走它們 - 它只會卡住。另外,我認爲使用1-dimesional數組會更容易與AI,但我試圖堅持2-dimesional數組。爲什麼我的TicTacToe遊戲在產生隨機移動時卡住了

我認爲這會更好地收集另一個陣列中的可用單元格,並從這些單元格中產生隨機移動。

歡迎任何建議。

這裏是我的AI等級:

實現文件:

#include <stdlib.h> // rand, srand 
#include <time.h> // time 
#include "AIPlayer.h" 

AIPlayer::AIPlayer(char token) : Player(token) 
{ 
} 

void AIPlayer::makeAMove(Board &myBoard) 
{ 
    int row; 
    int column; 

    bool done = false; 
    do 
    { 
     srand (time(0)); 
     row = rand() % 3; 
     column = rand() % 3; 

     if (myBoard.getCell(row, column) == ' ') 
     { 
      myBoard.setCell(row, column, getToken()); 
      done = true; 
     } 
    } 
    while (!done); 

    std::cout << "\nComputer move (" << getToken() << ")\n" 
        "row " << row << ", column " << column; 
} 

頭文件

#pragma once // include guard 
#include "Player.h" 

class AIPlayer: public Player 
{ 
    public: 
     AIPlayer(char token); 
     virtual void makeAMove(Board &myBoard); 
}; 
+2

「卡住」是什麼意思?它是否凍結(即停止接受輸入),退出還是拋出錯誤? – newfurniturey

+0

你忘了用'''初始化主板嗎? –

+0

沒有錯誤。它可能被凍結。或者只是陷入循環。 – navig8tr

回答

3

在每次循環調用函數srand(時間(0))。

這會根據經過的秒數重置隨機數的生成。

這意味着每當電腦會選擇相同的隨機位置移動(直到秒數改變)

也許這實際上將圍繞一分鐘後工作,但它是更好的移動函數srand出來的循環。

+1

實際上'時間(0)'每秒都會改變。將代碼移出循環很好,但我懷疑這是問題所在。我敢打賭,沒有使用''''' –

+1

進行初始化。你不應該不斷地重新初始化你的隨機數發生器。 –

+0

@Peter de Rivaz:在循環之外移動'srand(time(0))'似乎修復了它。謝謝。 – navig8tr