大家好,小编来为大家解答以下问题,python编程入门与案例详解,python编程基础与案例集锦,现在让我们一起来看看吧!
本项目基于“实验楼”“200行Python代码实现2048教程: 原教程地址:
项目界面采用curses库制作,原文在linux下运行,官方curses库不支持windows系统,需要从第三方下载cueses扩展库,根据网上教程安装下载,第三方下载地址:
1.游戏机制及基本操作 1.1状态机 处理游戏主逻辑的时候我们会用到一种十分常用的技术:状态机,或者更准确的说是有限状态机(FSM) 你会发现 2048 游戏很容易就能分解成几种状态的转换快码论文。
def main(stdscr):
def init():
game_field.reset()
return 'Game'
def game():
(stdscr)
action = get_user_action(stdscr)
if action == 'Restart':
return 'Init'
if action == 'Exit':
return 'Exit'
if (action):
if game_field.is_win():
return 'Win'
if game_field.is_gameover():
return 'Gameover'
return 'Game'
def not_game(state):
(stdscr)
action = get_user_action(stdscr)
if action == 'Restart':
return 'Init'
if action == 'Exit':
return 'Exit'
return state
#responses = defaultdict(lambda: state)
#responses['Restart'] = 'Init'
#responses['Exit'] = 'Exit'
#return responses[action]
state_actions = {
'Init': init,
'Win': lambda: not_game('Win'),
'Gameover': lambda: not_game('Gameover'),
'Game': game}
curses.use_default_colors()
#设置获胜条件
game_field = GameField(win = 2048)
state = 'Init'
#状态机开始循环
while state != 'Exit':
state = state_actions[state]()
设置了init() game() not_game 三种状态,用以实现状态机的状态切换,def main(stdscr)语句中stdscr变量为curses模块的固定格式,通过while循环使程序未进入’Exit‘状态保持运行,个人对原文中not_game函数进行了修改,#备注为原代码。
def not_game(state):
(stdscr)
action = get_user_action(stdscr)
responses = defaultdict(lambda: state)
responses['Restart'] = 'Init'
responses['Exit'] = 'Exit'
return responses[action]
修改为:
def not_game(state):
(stdscr)
action = get_user_action(stdscr)
if action == 'Restart':
return 'Init'
if action == 'Exit':
return 'Exit'
return state
原代码可能兼容性更高一点,不过修改后可能更好理解一点,目前修改后的代码还没有发现问题。1.2模块导入 导入curses模块和random模块,由于程序部分内容修改,不再需要导入defaultdict方法。
import curses
from random import randrange, choice
1.3用户行为及用户输入 所有的有效输入都可以转换为"上,下,左,右,游戏重置,退出"这六种行为,用 actions 表示, 输入键采用W(上),A(左),S(下),D(右),R(重置),Q(退出),这里要考虑到大小写情况,并在原代码基础上支持了方向键。
letter_codes = [ord(ch) for ch in 'WASDRQwasdrq']
actions = ['Up', 'Left', 'Down', 'Right', 'Restart', 'Exit']
actions_dict = dict(zip(letter_codes, actions * 2))
#添加上下左右方向键
letter_codes_key = [curses.KEY_UP, curses.KEY_LEFT, curses.KEY_DOWN, curses.KEY_RIGHT]
actions_key = ['Up', 'Left', 'Down', 'Right']
actions_dict_key = dict(zip(letter_codes_key, actions_key))
actions_dict.update(actions_dict_key)#将两段字典合并
def get_user_action(keyboard):
char = "N"
while char not in actions_dict:
char = keyboard.getch()
return actions_dict[char]
1.4矩阵转置与翻转 zip函数返回一个迭代对象,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表,实现转置。
def transpose(field):
return [list(row) for row in zip(*field)]
def invert(field):
return [row[::-1] for row in field]
2.封装GameFiled类 封装一个GameFiled类,并对其建立reset(重置界面)、move(移动)、is_win(判断是否获胜)、is_gameover(判断游戏失败)、draw(绘制游戏界面)、spawn(随机生成元素)、move_is_possible(是否可以移动)等方法,实现游戏运行。 通过 __init__初始化棋盘参数
class GameField(object):
def __init__(self, height=4, width =4, win=2048):
self.height = height
self.width = width
self.win_value = win
self.score = 0
self.highscore = 0