当然这一篇需要你有一定的python基础?如果你没有python基础不要着急,你可以先去找一些python的基础教程去了解了解学习学习这门短小精悍的语言。
好了,说了那么说没用的话,现在正式开始
创建游戏文件 2048.py
首先导入需要的包:
主逻辑
用户行为
所有的有效输入都可以转换为”上,下,左,右,游戏重置,退出”这六种行为,用 actions 表示
actions = ['Up', 'Left', 'Down', 'Right', 'Restart', 'Exit']
有效输入键是最常见的 W(上),A(左),S(下),D(右),R(重置),Q(退出),这里要考虑到大写键开启的情况,获得有效键值列表:
letter_codes = [ord(ch) for ch in 'WASDRQwasdrq']
将输入与行为进行关联:
actions_dict = dict(zip(letter_codes, actions * 2))
状态机
处理游戏主逻辑的时候我们会用到一种十分常用的技术:状态机,或者更准确的说是有限状态机(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 终结状态结束程序。
下面是经过提取的主逻辑的代码,会在后面进行补全:
用户输入处理
阻塞+循环,直到获得用户有效输入才返回对应行为:
矩阵转置与矩阵逆转
加入这两个操作可以大大节省我们的代码量,减少重复劳动,看到后面就知道了。
矩阵转置:
def transpose(field):
return [list(row) for row in zip(*field)]
矩阵逆转(不是逆矩阵):
def invert(field):
return [row[::-1] for row in field]
创建棋盘
初始化棋盘的参数,可以指定棋盘的高和宽以及游戏胜利条件,默认是最经典的 4×4~2048。
棋盘操作
随机生成一个 2 或者 4
重置棋盘
一行向左合并
棋盘走一步
通过对矩阵进行转置与逆转,可以直接从左移得到其余三个方向的移动操作
判断输赢
判断能否移动
绘制游戏界面
完成主逻辑
完成以上工作后,我们就可以补完主逻辑了!
运行
填上最后一行代码:
curses.wrapper(main)
最后你们最关心的是能不能下载代码啊?到哪里下载啊?在这里,但是给你们最好的建议是自己按照图片敲一遍。
如何下载以上源码以及获取更多编程资源?只需要简单两步:
1、关注订阅号:smcode2016
2、回复关键词2048即可获得
如果你想学习编程,找不到教程或者有点迷茫,关注学习编程专栏:学习编程 - 知乎专栏
如果你觉得不错可以关注我:路人甲