Python|找出井字棋的獲勝者

  • 2019 年 12 月 17 日
  • 筆記

問題描述

A 和 B 在一個 3 x 3 的網格上玩井字棋。

井字棋遊戲的規則如下:

玩家輪流將棋子放在空方格 (" ") 上。

第一個玩家 A 總是用 "X" 作為棋子,而第二個玩家 B 總是用 "O" 作為棋子。

"X" 和 "O" 只能放在空方格中,而不能放在已經被佔用的方格上。

只要有 3 個相同的(非空)棋子排成一條直線(行、列、對角線)時,遊戲結束。

如果所有方塊都放滿棋子(不為空),遊戲也會結束。

遊戲結束後,棋子無法再進行任何移動。

給你一個數組 moves,其中每個元素是大小為 2 的另一個數組(元素分別對應網格的行和列)

它按照 A 和 B 的行動順序(先 A 後 B)記錄了兩人各自的棋子位置。

如果遊戲存在獲勝者(A 或 B),就返回該遊戲的獲勝者;如果遊戲以平局結束,則返回 "Draw";如果仍會有行動(遊戲未結束),則返回 "Pending"。

你可以假設 moves 都 有效(遵循井字棋規則),網格最初是空的,A 將先行動。

示例 1:

輸入:moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]

輸出:"A"

解釋:"A" 獲勝,他總是先走。

"X " "X " "X " "X " "X "

" " -> " " -> " X " -> " X " -> " X "

" " "O " "O " "OO " "OOX"

示例 2:

輸入:moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]

輸出:"B"

解釋:"B" 獲勝。

"X " "X " "XX " "XXO" "XXO" "XXO"

" " -> " O " -> " O " -> " O " -> "XO " -> "XO "

" " " " " " " " " " "O "

示例 3:

輸入:moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]]

輸出:"Draw"

輸出:由於沒有辦法再行動,遊戲以平局結束。

"XXO"

"OOX"

"XOX"

解決方案

這裡用枚舉會很簡單,有想法的可以看看。小編還是個Python萌新,這裡用的是簡單暴力的多個if…elif…elif……來判斷是否符合A或B輸贏的條件。

先把給出的棋子位置全部放到一個列表中,然後進行判斷。

有三種情況可以判斷輸贏:

  1. 橫著連成一條線
  2. 豎著連成一條線
  3. 斜著連成一條線(這裡又分↖,↗)

def ABmove(moves): lis1 = [' ' for x in range(9)] # 這裡生成一個長度為9的列表,便於後面存放『X』,『O』。 # 注意不要產生會混淆判斷的元素,我這裡用『1』代表『X』,用『0』代表『O』,所以我直接生成一個全是空格的列表。 n = 0 # 這裡用於計數,A和B是一人一步,利用奇偶數除2取余是否等於0便可以判斷哪步是A哪步是B

結語

這個程式碼是很複雜的,不過解法很多,利用枚舉可以很便捷的得出輸贏情況。

END

實習編輯 | 王文星

責 編 | 周茂林