上一篇文章中,我们梳理了实现简易版 2048 游戏的基本知识,这篇文章将介绍如何实现各个模块。换句话说,上一次我们确定了旅行的目的地,这一次就让我们自由畅行在山间田野。
游戏主程序,即 game 函数按部就班地向下执行,该判断就判断,然后执行相应函数。
首先读取用户输入,第一个判断:是否移动数字,显然要移动数字要满足以下条件:用户输入小写的 w s a d 对应上下左右
该移动方向上允许移动
具体来说,移动方向最前面有空间或者有连续相同的数字。可以移动则执行 move 函数,并在棋盘上生成随机数字,否则原样输出。
其次判断:棋盘是否被填满。被填满时执行 fail 函数。
最后判断:是否胜利。如果获胜,打印获胜提示。
def game(board, stdscr, rscore):
global score
global change
# curses.noecho()
# 屏幕不显示用户输入的字符
curses.noecho()
while 1:
# stdscr.getch()
# 读取用户输入的字符
order = stdscr.getch()
# move()对用户移动的响应
current_board, change = move(order, board)
# change 为 1 随机产生 2 或 4
if change:
current_board = choice(board)
# 打印棋盘
print_board(stdscr, current_board, rscore)
# 当棋盘被填满,判断是否游戏结束
if (current_board != 0).all():
fail(current_board)
# win 为 1 打印获胜提示
if win:
stdscr.addstr('You win')
以上便是游戏主程序的基本逻辑,接下来我们看具体的函数模块。
首先是移动模块:
basic 函数用来执行移动与碰撞的操作。move_{up,down,right,left} 函数用来实现各个方向上的 basic 函数操作。move 函数用来响应用户指令,实现各个方向上的移动。
棋盘由 4$\times$4 矩阵组成,0 代表该位置上没有数字。basic 函数就是基于矩阵的运算,且以右移为基础移动。
4 $\times $ 4 矩阵: $$ \left[ \begin{matrix} &2&2&0&4&\ &2&4&2&0&\ &4&8&0&2&\ &8&4&0&4&\ \end{matrix} \right] $$
向右滑动:
每一周期分为 4 轮,每一轮操作一行(共 4 行),从最左面的元素开始执行。设置 flag 用于提示这一轮是否发生了改变,如果发生了改变,这一轮就再进行一次循环,直到 flag 保持为 0 不变。对于循环的每一个元素,如果该元素不为 0 ,若下个元素为 0,就交换当前值与下个元素的值。若下个元素与当前元素相同,则当前元素置 0 ,且下一个元素增加一倍,分数还要增加 100 分。