2012-02-12 72 views
2

我已經讀過一本書,並試圖製作一個井字遊戲作爲我的第一個項目之一。我在製作一個功能時遇到了問題,該功能會檢查所做的動作是否是勝利動作。我只需要一個正確的方向。Tic-Tac-Toe數組或列表?

對於我的井字棋板即時通訊使用3x3陣列。有8種可能的組合。所以即時考慮製作一系列組合並讓程序檢查棋盤上的任何棋步是否與勝出棋步中的動作相匹配。

我想得到一些建議,不管數組是可以工作的,還是其他的東西能像矢量或列表一樣工作的更好。

+0

數組應該用於固定大小的東西,如井字棋板,可以更改大小的東西的列表。 – Joel 2012-02-12 21:15:04

+2

您可能會喜歡[this](http://xkcd.com/832/)。 – 2012-02-12 21:21:15

+0

不錯的馬特我愛xkcd – 2012-02-12 21:25:18

回答

2

一個數組在這種情況下很好地工作,因爲你有一個靜態的,不變的東西來存儲。這對他們來說是一個完美的用例。

當您在動態存儲的東西時,列表和向量更合適,並且您不知道大小。在你的情況下,你知道前面的大小,所以你應該使用最簡單的數據結構來完成工作(數組)。

+0

好酷,所以你可以創建數組陣列 – 2012-02-12 21:16:06

+0

絕對!雖然這可能會變得複雜,但你當然可以做到這一點。如果你真的想嚇唬人們閱讀你的代碼,你可以擁有數組數組的數組。我不會建議。 – Oleksi 2012-02-12 21:17:13

+0

所以會有比製作數組數組更好的選擇嗎? – 2012-02-12 21:19:41

1

呃......這真的很難說。你絕對可以使用兩者。我自己可能會這樣做靜態數組,但是,正如你正在學習,我建議你開始使用靜態數組,因爲它更自然,然後嘗試使用Vector來做,所以你會看到不同之處。也許你可能想創造一個類別TicTacToeBoard,它可以比較自己的一個實例(因爲你需要檢查策略是否勝利)。當你有一個包含所有方法的類時,你可以改變array和Vector之間的實現,並且你還會看到封裝的想法:所以從外部開始,類將是相同的,並且從內部可以使用不同的方案。

1

使用3x3陣列來存儲您當前的棋盤是好的。使用數組存儲可能的獲勝組合是不行的。雖然這是你的第一個課程,但是開始學習良好的習慣從未受傷。這個問題或許可以列舉出所有可能的組合。然而,如果你想編碼的話,你會怎麼做?可能獲勝的場景數量巨大。國際象棋怎麼樣?目前所有可用的計算機都沒有足夠的內存來存儲所有可能的國際象棋動作。

更好的方法是編寫一個函數來檢查你的獲勝條件。爲了簡單起見,我推薦它這樣寫。爲了不使太簡單了,我會寫,隨着僞代碼:

// returns true if specified side won 
// board - a pointer to your array 
// player - specifies if you want to check if X or O is the winner 
bool game_won(board, player) 
{ 
    For each row, check if each field is equal to player. 
     if yes return true. 
    For each column, check if each field is equal to player. 
     if yes return true. 
    Check if each field on diagonal is equal to player. 
     if yes return true. 

    // winning conditions not met, let's keep playing 
    return false 
} 

播放器後,使每個動作,你應該叫game_won(),它會檢查你是否認爲此舉使玩家成爲贏家。

p.s. 每個球員有8個而不是10個可能的獲勝動作:3個水平線,3個垂直線和2個對角線。

+0

感謝這真的澄清,哈哈我不能相信我犯了一個錯誤計數,但謝謝 – 2012-02-12 21:34:04