創建游戲文件 2048.py
首先導入需要的包:
import cursesfrom random import randrange, choicefrom collections import defaultdict
主邏輯
用戶行為
所有的有效輸入都可以轉換為"上,下,左,右,游戲重置,退出"這六種行為,用 actions 表示
actions = ['Up', 'Left', 'Down', 'Right', 'Restart', 'Exit']
有效輸入鍵是最常見的 W(上),A(左),S(下),D(右),R(重置),Q(退出),這里要考慮到大寫鍵開啟的情況,獲得有效鍵值列表:
letter_codes = [ord(ch) for ch in 'WASDRQwasdrq']
將輸入與行為進行關聯:
actionsdict = dict(zip(lettercodes, actions * 2))
狀態機
處理游戲主邏輯的時候我們會用到一種十分常用的技術:狀態機,或者更準確的說是有限狀態機(FSM)
你會發現 2048 游戲很容易就能分解成幾種狀態的轉換。

state 存儲當前狀態, state_actions 這個詞典變量作為狀態轉換的規則,它的 key 是狀態,value 是返回下一個狀態的函數:
Init: init()Game: game()Win: lambda: not_game('Win')Gameover: lambda: not_game('Gameover')Exit: 退出循環
狀態機會不斷循環,直到達到 Exit 終結狀態結束程序。
下面是經過提取的主邏輯的代碼,會在后面進行補全:
def main(stdscr): def init(): #重置游戲棋盤 return 'Game' def not_game(state): #畫出 GameOver 或者 Win 的界面 #讀取用戶輸入得到action,判斷是重啟游戲還是結束游戲 responses = defaultdict(lambda: state) #默認是當前狀態,沒有行為就會一直在當前界面循環 responses['Restart'], responses['Exit'] = 'Init', 'Exit' #對應不同的行為轉換到不同的狀態 return responses[action] def game(): #畫出當前棋盤狀態 #讀取用戶輸入得到action if action == 'Restart':  return 'Init' if action == 'Exit':  return 'Exit' #if 成功移動了一步:  if 游戲勝利了:  return 'Win'  if 游戲失敗了:  return 'Gameover' return 'Game' state_actions = {  'Init': init,  'Win': lambda: not_game('Win'),  'Gameover': lambda: not_game('Gameover'),  'Game': game } state = 'Init' #狀態機開始循環 while state != 'Exit': state = state_actions[state]()用戶輸入處理
阻塞+循環,直到獲得用戶有效輸入才返回對應行為:
def get_user_action(keyboard): char = "N" while char not in actions_dict: char = keyboard.getch() return actions_dict[char]
矩陣轉置與矩陣逆轉
加入這兩個操作可以大大節省我們的代碼量,減少重復勞動,看到后面就知道了。
矩陣轉置:
新聞熱點
疑難解答