开篇语
今天是笔者奶奶生日,昨天为此准备了不少事情,也因此花费了很多时间,今天上午接待客人,下午送我年迈的姑奶奶回家。等我抽出身来看代码已经是三点的事情了。再加上还有个“问题xx”要教导,真正开始认真看代码,已经是四点咯。然后看到五点多,爸爸叫我吃饭,我去,还没跑步,所以又是一番鸡飞狗跳。跑完回来一边压腿,一边看家人吃饭,也是醉醉的。虽然有点跑题,但是我还是要拿我的跑步的图来放一放~~~
这是定向越野~地面泥泞,公路上大大小小的石子,跑起来真是百曲千回~
第二天了,继续坚持!yeah!
正文
本次是我对于Python实现2048这个曾经风靡一时的小游戏的代码解读,代码来自实验楼:200行Python代码实现2048
工作环境
一、主逻辑图
逻辑图解:黑色是逻辑层,蓝色是外部方法,红色是类内方法,稍后即可知道~
状态机。。。游戏概念,出自实验楼
下面容我逐行解释主逻辑main()函数,并且在其中穿叉外部定义的函数与类。
二、主逻辑代码解读(完整代码见文末)
主逻辑main如下,之后的是对主函数中的一些方法的解读:
def main(stdscr):
def init():
#重置游戏棋盘
game_field.reset()
return 'Game'
def not_game(state):
#画出 GameOver 或者 Win 的界面
game_field.draw(stdscr)
#读取用户输入得到action,判断是重启游戏还是结束游戏
action = get_user_action(stdscr)
responses = defaultdict(lambda: state) #默认是当前状态,没有行为就会一直在当前界面循环
responses['Restart'], responses['Exit'] = 'Init', 'Exit' #对应不同的行为转换到不同的状态
return responses[action]
def game():
#画出当前棋盘状态
game_field.draw(stdscr)
#读取用户输入得到action
action = get_user_action(stdscr)
if action == 'Restart':
return 'Init'
if action == 'Exit':
return 'Exit'
if game_field.move(action): # move successful
if game_field.is_win():
return 'Win'
if game_field.is_gameover():
return 'Gameover'
return 'Game'
state_actions = {
'Init': init,
'Win': lambda: not_game('Win'),
'Gameover': lambda: not_game('Gameover'),
'Game': game
}
curses.use_default_colors()
game_field = GameField(win=32)
state = 'Init'
#状态机开始循环
while state != 'Exit':
state = state_actions[state]()
逐条解读(代码框内会标注是来自外部,无标注则是来自内部):定义主函数
def main(stdscr):
def init():
#重置游戏棋盘
game_field.reset()
reset出自外部定义的类,game_field=