综合案例
1.需求分析
2048游戏是一款数字益智游戏,如图所示。具体游戏规则如下:
① 玩家每次可以选择上下左右其中一个方向移动。
② 每移动一次,所有数字方块都会往移动的方向靠拢。
③ 相同数字方块在靠拢时会相加。
④ 每次移动完成后,系统会在空白的方块中随机添加2或4。
⑤ 当所有方块中填满数字并不能相加时,游戏结束。
⑥ 玩家的得分为相同数字之和的累加。
根据上述游戏规则,该游戏需实现以下功能:
① 显示游戏界面。
② 上下左右移动。
③ 添加随机数字。
④ 游戏是否结束。
为方便读者理解各功能之间的联系,此处画出程序的流程图,如图所示。
2.程序设计
对程序中各功能有了初步了解后,本节将带领大家实现每个功能。首先,程序需选用合适的数据结构,由于游戏可以看成由4×4个数字组成,每移动一次,就是对这4×4个数字进行操作,因此数据结构可以选择二维列表(二维列表类似于二维矩阵),具体如下所示:
通过print()函数打印该二维列表,则输出结果如下所示:
二维列表中的数据需显示在4×4方块中,具体实现如下所示:
其中,第2行与第22行输出带颜色的字符串,其语法格式如下:
显示方式、前景色与背景色都用数字表示,具体如下两表所示。
ifZero ()函数的实现如下所示:
其中,若参数s为0,则返回空字符,否则返回参数s。
此时,只需在上述界面的基础上再随机生成两个数(2或4)就可以构成初始界面,具体如下所示:
程序调用init()函数生成初始界面,如图所示。
界面显示功能完成后,接下来实现上下左右功能,它是整个游戏的核心功能。由于上下左右4个方向的具体实现代码类似,此处只讲解向右移动的实现,具体如下所示:
每次执行移动操作后,程序中需自动添加一个随机数(2或4)并重新输出显示界面,具体如下所示:
此处只需将随机数添加到对应矩阵不为0的元素处,再调用display()函数显示界面即可。
最后,程序需检查游戏是否结束,具体如下所示:
上述代码使用for循环遍历二维矩阵中每个元素,若存在某个元素为0或存在某个元素可以与周围的元素相加时,游戏未结束;否则,游戏结束。
3.代码实现
前面介绍了2048游戏中必须实现的各种功能,接下来讲解如何将这些功能组合成程序流程,具体如下所示:
上述代码使用while循环与if-elif-else语句来控制整个程序的流程。
接下来编写代码测试整个程序,具体如下所示:
至此,整个程序编写完成。
4.效果实现
程序代码编辑完成,如果没有错误,便可运行。本节演示程序运行效果。
a.初始界面
程序运行后,首先进入初始界面,如图所示。
b.上移
当输入W时,游戏中所有数字会向上移动。移动过程中,相同数字方块在靠拢时会相加,并将结果与得分相加。移动完成后,程序会随机添加一个数字,如图所示。
3. 下移
当输入S时,游戏中所有数字会向下移动。移动过程中,相同数字方块在靠拢时会相加,并将结果与得分相加。移动完成后,程序会随机添加一个数字,如图所示。
4. 左移
当输入A时,游戏中所有数字会向左移动。移动过程中,相同数字方块在靠拢时会相加,并将结果与得分相加。移动完成后,程序会随机添加一个数字,如图所示。
5. 右移
当输入D时,游戏中所有数字会向右移动。移动过程中,相同数字方块在靠拢时会相加,并将结果与得分相加。移动完成后,程序会随机添加一个数字,如图所示。
6. 退出游戏
当输入Q时,程序退出游戏,如图所示。