FunPack 第十期 Kitronik ARCADE
1 实现功能
本次FunPack活动分为两个任务
- 移植或者设计一款游戏
- 设计一款摩斯密码练习器
本次使用板卡实现了任务一——设计一款游戏,游戏主题为2048。
游戏规则:玩家通过 w s a d 控制数字移动方向,达成 2048 这个数字即获胜。
每次可以选择一个方向移动,数字便会朝这个方向移动,如果遇到相同数字就相加,遇到不同数字或者边界就停止移动。同时会在空白的地方生成 2 或者 4 的随机数字。通过不断相撞、相加,最后达成 2048 这个数字。
2 实现思路及代码介绍
2.1 数字方块的显示
经典2048小游戏的游戏界面由4×4方格组成,所以游戏界面可以由大小为16的一维数组ImageList表示,游戏界面中某区域上数字方块的显示则根据一维数组ImageList相应位置中的值表示。
discount表示在数组ImageList中的位置,通过对4进行除或余的操作,得到disline和disrow的值代表该数值在4×4平面中的行列位置,从而以此确定数字方块的位置,如diacount = 10时,disline = 2,disrow = 2,则代表数组ImageList中的第十一位在4×4平面中位于第三行第三列。
调用函数cal N_th root确定数值数组ImageList中discount位置上的数值对应图片数组InitUIist的第几位,图片数组UIist 的排列规则是0、2、4、8……,即2^(n-1),函数cal N_th root用于判断数值数组ImageList中discount位置上的数值为2的次幂关系,得到的数值root_n即为该数值对应的图片在图片数组UIist的位置。
2.2 数字方块的随机生成
2.2.1 判断是否可以产生随机方块
调用函数can_creat遍历数组ImageList,判断数组中是否存在0, 若存在则执行函数creat,在游戏界面内随机产生数字方块。
2.2.2 在数值为0处随机产生数字方块
调用函数creat,使用随机数在数组中数值为0的地方随机挑选一处产生2或4 的数值,2与4产生的比例为4:1。
2.3 数字方块的滑动及合并
游戏中数字方块的滑动分为两种情况,以向右滑动举例。
第一种情况如图所示,向右移动,数字方块与空格交换位置
第二种情况如图所示,向右移动,相同的方块合并称为新的数字方块,数值翻倍
2.3.1 判断是否可以滑动
函数canMoveRight用于判断数字方块是否可以滑动,利用循环,对每一个数字方块及其右边的方块情况进行判断,如果该数字方块右边的方块为0或该数字方块与其右侧方块数值相同,则判断为可以移动,返回1。
2.3.2 判断两个处于水平或竖直方向上的方块间是否存在其他方块
利用循环语句,依次判断两方块间是否存在其他数值不为0的方块
2.3.3 数字方块的移动
利用循环遍历游戏界面除去最右侧的四个数字方块外的所有方块,ErgodicLine代表行数,ErgodicRow代表列数,ErgodicTemp代表与选定数字方块作比较的数字方块的列数,moveClearFlag用于判断下一次循环时ErgodicTemp的数值。
当选定的ErgodicTemp列的数字方块等于0,且作比较的两方块中没有其余方块,则ErgodicTemp列的方块数值与ErgodicRow列的数值方块的数值进行交换,此时符合条件1
当选定的ErgodicTemp列的数字方块与ErgodicRow列的数字方块的数值相等且作比较的两方块中没有其余方块,则ErgodicTemp列的方块数值变为二倍,ErgodicRow列的数字方块的数值设为0。得分增加数值为ErgodicTemp列新的数值,此时符合条件2
2.3.4 算法整合
当向右移动按键按下,如果可以移动,则调用moveRight函数进行向右移动,调用delectSprites消除精灵效果,再调用display函数刷新游戏界面,暂停0.2秒产生新的随机数字方块,在此之上判断游戏是否结束。
2.4 游戏结束的判断
在每次进行上下左右移动并产生新的方块后,调用函数game_over, can_creat函数用于判断数值数组ImageList中是否存在数值为0的情况,如果不存在为零的情况,且向上下左右皆不能移动,则返回1, 执行判断语句,此时游戏以失败结束。
在函数display中,设置一个标记变量doneFlag,若数值为2的11次幂,也就是root_n = 11时,doneFlag设置为1。在每次进行上下左右操作结束并显示操作后的游戏界面后,判断doneFlag是否为1,若为1,则代表游戏界面中存在2048,此时游戏以成功结束。
2.5 销毁精灵效果
在每次游戏刷新显示新的游戏界面后,遍历数组,对精灵效果进行销毁,提升游戏速度。
3 演示说明
游戏开始,随机产生一数字方块
点击上下左右键,方块移动与合成,分值改变并产生新的数字方块
未合成2048,且无可移动方块,游戏失败,显示本局得分和历史最高分
合成2048,游戏胜利
4 心得体会
本次是我第一次参加funpack活动,由于此次活动开展时间是寒假且活动开展的时间较长,所以对在读的学生比较友好,本次活动主题新奇,且编译游戏时可选择的编译语言较多,入门难度降低了许多。
但是在这一过程中我也发现了一些问题。
首先是板卡质量,电源、屏幕上的问题屡屡出现。
其次是在编译过程中的问题,例如微软编程中重复操作模块不如其他编程语言那么直观易懂,不能体现重复操作在整个操作过程中要达到的目的,可读性降低。