真是办公室偷闲小能手,嘿嘿。(下图右上角就是游戏运行界面)
一闪一闪的,是因为我使用全局热键唤出或者隐匿 iTerm2 ,这个软件的一些技巧和配色我之前有做过较为详细的说明。
输入
1 | letter_codes = [ord(ch) for ch in 'WASDRQwasdrq'] |
考虑到大小写,所以用数组 WASDRQwasdrq 和 act x 2 中的操作一一对应。
1 | def get_user_action(keyboard): |
除了 N 和 actions_dict 之外的字符输入都是无效的,阻塞循环等待。
矩阵的操作
1 | def transpose(field): |
分别是用来转置和逆转矩阵用的。(上下操作矩阵用转置,左右才做矩阵用逆转)
棋盘初始化
1 | def __init__(self, height=4, width=4, win=2048): |
绘制
1 | def draw(self, screen): |
绘制水平和垂直方向的线条,以及最高分的显示。
棋盘操作
重置
1 | def reset(self): |
随机添加
1 | def spawn(self): |
spawn 是卵,繁殖的意思,随机添加 2 或者 4 。
移动
虽然有四个方向的操作,但是通过对矩阵的转置和逆转,我们只要对一个方向进行处理,别的方向上操作,转化过来就行了。
1 | def move(self, direction): |
棋盘的合并都是先消除中间的空格再合并相邻的数字。tighten 是靠拢,merge 是合并。
判断是否能移动
1 | def move_is_possible(self, direction): |
能移动就两种情况,一是有空格,一是有相邻位有相同的数字。
状态
先分析游戏都有哪些的状态,初始化(Init),游戏中(Game),获胜(Win),失败(GameOver),退出(Exit),如下图:
然后各个状态之间通过对应的方法联通。
补充主逻辑的代码:
1 | def init(): |