200 行程式碼實現簡易版 2048 遊戲

發表於2016-05-04

建立遊戲檔案 2048.py

首先匯入需要的包:

主邏輯

使用者行為

所有的有效輸入都可以轉換為”上,下,左,右,遊戲重置,退出”這六種行為,用 actions 表示

有效輸入鍵是最常見的 W(上),A(左),S(下),D(右),R(重置),Q(退出),這裡要考慮到大寫鍵開啟的情況,獲得有效鍵值列表:

將輸入與行為進行關聯:

狀態機

處理遊戲主邏輯的時候我們會用到一種十分常用的技術:狀態機,或者更準確的說是有限狀態機(FSM)

你會發現 2048 遊戲很容易就能分解成幾種狀態的轉換。

state 儲存當前狀態, state_actions 這個詞典變數作為狀態轉換的規則,它的 key 是狀態,value 是返回下一個狀態的函式:

  • Init: init()
    • Game
  • Game: game()
    • Game
    • Win
    • GameOver
    • Exit
  • Win: lambda: not_game(‘Win’)
    • Init
    • Exit
  • Gameover: lambda: not_game(‘Gameover’)
    • Init
    • Exit
  • Exit: 退出迴圈

狀態機會不斷迴圈,直到達到 Exit 終結狀態結束程式。

下面是經過提取的主邏輯的程式碼,會在後面進行補全:

使用者輸入處理

阻塞+迴圈,直到獲得使用者有效輸入才返回對應行為:

矩陣轉置與矩陣逆轉

加入這兩個操作可以大大節省我們的程式碼量,減少重複勞動,看到後面就知道了。

矩陣轉置:

矩陣逆轉(不是逆矩陣):

建立棋盤

初始化棋盤的引數,可以指定棋盤的高和寬以及遊戲勝利條件,預設是最經典的 4×4~2048。

棋盤操作

隨機生成一個 2 或者 4

重置棋盤

一行向左合併

(注:這一操作是在 move 內定義的,拆出來是為了方便閱讀)

棋盤走一步

通過對矩陣進行轉置與逆轉,可以直接從左移得到其餘三個方向的移動操作

判斷輸贏

判斷能否移動

繪製遊戲介面

完成主邏輯

完成以上工作後,我們就可以補完主邏輯了!

執行

填上最後一行程式碼:

螢幕快照 2016-04-13 下午4.48.12

完整版程式碼地址

https://github.com/JLUNeverMore/easy_2048-in-200-lines

相關文章