国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

200 行python 代碼實現 2048 游戲

2020-02-22 22:51:27
字體:
來源:轉載
供稿:網友

創建游戲文件 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]

矩陣轉置與矩陣逆轉

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

矩陣轉置:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华宁县| 额尔古纳市| 大兴区| 日土县| 蒙自县| 攀枝花市| 临清市| 丹寨县| 什邡市| 义马市| 河南省| 吉水县| 苍山县| 涞源县| 大城县| 赤水市| 阳谷县| 海宁市| 霍城县| 延津县| 汶川县| 邳州市| 白水县| 安国市| 资兴市| 八宿县| 镇安县| 罗城| 都兰县| 吴忠市| 罗甸县| 舒兰市| 巴彦淖尔市| 麻阳| 边坝县| 建昌县| 博爱县| 方正县| 云和县| 晋江市| 青岛市|