python 实现 2048 游戏(二)

上一篇文章中,我们梳理了实现简易版 2048 游戏的基本知识,这篇文章将介绍如何实现各个模块。换句话说,上一次我们确定了旅行的目的地,这一次就让我们自由畅行在山间田野。


python 实现 2048 游戏(二)


主程序,即 game 函数按部就班地向下执行,该判断就判断,然后执行相应函数。首先读取用户输入,第一个判断:是否移动数字,显然要移动数字要满足以下条件:

  • 用户输入小写的 w s a d 对应上下左右
  • 该移动方向上允许移动

具体来说,移动方向最前面有空间或者有连续相同的数字。可以移动则执行 move 函数,并在棋盘上生成随机数字,否则原样输出。

其次判断:棋盘是否被填满。被填满时执行 fail 函数。

最后判断:是否胜利。如果获胜,打印获胜提示。

python 实现 2048 游戏(二)

首先是移动模块:

basic 函数用来执行移动与碰撞的操作。move_{up,down,right,left} 函数用来实现各个方向上的 basic 函数操作。move 函数用来响应用户指令,实现各个方向上的移动。

棋盘由 4 * 4 矩阵组成,0 代表该位置上没有数字。basic 函数就是基于矩阵的运算,且以右移为基础移动。

4 * 4 矩阵

向右滑动:

每一周期分为 4 轮,每一轮操作一行(共 4 行),从最左面的元素开始执行。设置 flag 用于提示这一轮是否发生了改变,如果发生了改变,这一轮就再进行一次循环,直到 flag 保持为 0 不变。对于循环的每一个元素,如果该元素不为 0 ,若下个元素为 0,就交换当前值与下个元素的值。若下个元素与当前元素相同,则当前元素置 0 ,且下一个元素增加一倍,分数还要增加 100 分。

举个例子:对于第一行 [2 2 0 4]

第一轮:

  • 4 与 0 不交换 [2 2 0 4]
  • 0 与 2 交换 [2 0 2 4]
  • 0 与 2 交换 [0 2 2 4]
  • flag = 1 且 score + = 0

第二轮:

  • 4 与 2 不交换 [0 2 2 4]
  • a13 双倍 a12 置 0 [0 0 4 4]
  • 0 不变 [0 0 4 4]
  • flag = 1 且 score += 100

第三轮:

  • a14 双倍 a13 置 0 [0 0 0 8]
  • 不变 [0 0 0 8]
  • 不变 [0 0 0 8]
  • flag = 1 且 score += 100

第四轮:

  • 不变
  • 不变
  • 不变
  • flag = 0 且 score += 0

即第一轮最后输出结果 [0 0 0 8]。

以上就是向右移动的操作,而对于其他方向上的移动其实就是在此基础上进行矩阵的转置与逆置操作。

# A 为 4*4 的矩阵
# 转置操作
A.T
# 逆置操作
A[::-1,::-1]

下图为原矩阵:


python 实现 2048 游戏(二)

向下滑动:

将原矩阵转置得到新矩阵,新矩阵向右滑动,相当于原矩阵向下滑动,再转置变回原矩阵。


python 实现 2048 游戏(二)

向左滑动:

将原矩阵逆置得到新矩阵,新矩阵向右滑动,相当于原矩阵向左滑动,再逆置变回原矩阵。


python 实现 2048 游戏(二)


向上滑动:

将原矩阵转置加逆置得到新矩阵,新矩阵向右滑动,相当于原矩阵向上滑动,再通过转置加逆置变回原矩阵。


python 实现 2048 游戏(二)


python 实现 2048 游戏(二)

接下来,我们讲 choice 模块:首先获取值为 0 的矩阵元素的位置,并储存在字典里,以序号( 最大值为 count ) 为索引。其次产生 [0,count) 范围内的随机数(随机抽取值为 0 的元素),并且产生随机数 2 或 4 (概率为 75% 与 25%)。最后将随机抽取的元素更改为生成的随机数(2 或 4)。

python 实现 2048 游戏(二)

然后是生成分数:

首先游戏开始时加载一次分数(历史最高分),游戏结束时保存最高分。每次打印棋盘前,都比较当前分数与当前最高分,并更改当前最高分数。

python 实现 2048 游戏(二)

其次是打印模块:

只打印非零值。

python 实现 2048 游戏(二)

最后是一些零碎的知识点:

首先我们要初始化程序,初次运行游戏会在当前目录生成 ‘out.npy’ 文件,并且储存 0 在文本中。其次初始化棋盘,最后就可以愉快地开始游戏了。

python 实现 2048 游戏(二)

以上便是 python 实现 2048 游戏的完结版,如果想获取源代码,在微信后台回复 2048 。


分享到:


相關文章: