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輸贏的條件。
先把給出的棋子位置全部放到一個列表中,然後進行判斷。
有三種情況可以判斷輸贏:
- 橫著連成一條線
- 豎著連成一條線
- 斜著連成一條線(這裡又分↖,↗)
|
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
實習編輯 | 王文星
責 編 | 周茂林


