Funpack 第十期 Kitronik ARCADE 之 2048小游戏
Funpack 第十期 Kitronik ARCADE 实现任务一 复刻2048小游戏
标签
嵌入式系统
pluto
更新2021-08-27
704

FunPack 第十期 Kitronik ARCADE

1 实现功能

     本次FunPack活动分为两个任务

  • 移植或者设计一款游戏
  • 设计一款摩斯密码练习器

本次使用板卡实现了任务一——设计一款游戏,游戏主题为2048。

游戏规则:玩家通过 w s a d 控制数字移动方向,达成 2048 这个数字即获胜。

每次可以选择一个方向移动,数字便会朝这个方向移动,如果遇到相同数字就相加,遇到不同数字或者边界就停止移动。同时会在空白的地方生成 2 或者 4 的随机数字。通过不断相撞、相加,最后达成 2048 这个数字。

2 实现思路及代码介绍

2.1 数字方块的显示

经典2048小游戏的游戏界面由4×4方格组成,所以游戏界面可以由大小为16的一维数组ImageList表示,游戏界面中某区域上数字方块的显示则根据一维数组ImageList相应位置中的值表示。

Fv-TuLuNsHySqXch2SkYWJhNDnq5

discount表示在数组ImageList中的位置,通过对4进行除或余的操作,得到disline和disrow的值代表该数值在4×4平面中的行列位置,从而以此确定数字方块的位置,如diacount = 10时,disline = 2,disrow = 2,则代表数组ImageList中的第十一位在4×4平面中位于第三行第三列。

Fk87gjn6Gy51cZNMRaXIHiUII5Bt

调用函数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的位置。

FgPUFHDTXTJWSXCqxZWvMtvNd5P7

2.2 数字方块的随机生成

2.2.1 判断是否可以产生随机方块

调用函数can_creat遍历数组ImageList,判断数组中是否存在0, 若存在则执行函数creat,在游戏界面内随机产生数字方块。

Fsih9vxn1076X-nMZae8WlH32BAP

2.2.2 在数值为0处随机产生数字方块

调用函数creat,使用随机数在数组中数值为0的地方随机挑选一处产生2或4 的数值,2与4产生的比例为4:1。

 FvGVLWQDOFumQCzoKjArOpGgY48K

2.3 数字方块的滑动及合并

游戏中数字方块的滑动分为两种情况,以向右滑动举例。

第一种情况如图所示,向右移动,数字方块与空格交换位置

FoM54wk0mPRF7y5xmbPEx02CjxME

第二种情况如图所示,向右移动,相同的方块合并称为新的数字方块,数值翻倍

2.3.1 判断是否可以滑动

函数canMoveRight用于判断数字方块是否可以滑动,利用循环,对每一个数字方块及其右边的方块情况进行判断,如果该数字方块右边的方块为0或该数字方块与其右侧方块数值相同,则判断为可以移动,返回1。

FlbJ-h_BdvnAaA-nDjpv-8GRr3P8

2.3.2 判断两个处于水平或竖直方向上的方块间是否存在其他方块

利用循环语句,依次判断两方块间是否存在其他数值不为0的方块

Fk5dxPpdFCssMqs4_IkQ7Frx31B1

2.3.3 数字方块的移动

利用循环遍历游戏界面除去最右侧的四个数字方块外的所有方块,ErgodicLine代表行数,ErgodicRow代表列数,ErgodicTemp代表与选定数字方块作比较的数字方块的列数,moveClearFlag用于判断下一次循环时ErgodicTemp的数值。

当选定的ErgodicTemp列的数字方块等于0,且作比较的两方块中没有其余方块,则ErgodicTemp列的方块数值与ErgodicRow列的数值方块的数值进行交换,此时符合条件1

FoM54wk0mPRF7y5xmbPEx02CjxME

当选定的ErgodicTemp列的数字方块与ErgodicRow列的数字方块的数值相等且作比较的两方块中没有其余方块,则ErgodicTemp列的方块数值变为二倍,ErgodicRow列的数字方块的数值设为0。得分增加数值为ErgodicTemp列新的数值,此时符合条件2

FnDZh8fSS20Zapi3h1IcOiTZr8dS

 

2.3.4 算法整合

当向右移动按键按下,如果可以移动,则调用moveRight函数进行向右移动,调用delectSprites消除精灵效果,再调用display函数刷新游戏界面,暂停0.2秒产生新的随机数字方块,在此之上判断游戏是否结束。

FtnP8pfW1n8mhHw-8gO4na3Fh-zi

2.4 游戏结束的判断

在每次进行上下左右移动并产生新的方块后,调用函数game_over, can_creat函数用于判断数值数组ImageList中是否存在数值为0的情况,如果不存在为零的情况,且向上下左右皆不能移动,则返回1, 执行判断语句,此时游戏以失败结束。

FqCMjaSbiaAyarHY1lhSKmBwodCL

在函数display中,设置一个标记变量doneFlag,若数值为2的11次幂,也就是root_n = 11时,doneFlag设置为1。在每次进行上下左右操作结束并显示操作后的游戏界面后,判断doneFlag是否为1,若为1,则代表游戏界面中存在2048,此时游戏以成功结束。

 

2.5 销毁精灵效果

在每次游戏刷新显示新的游戏界面后,遍历数组,对精灵效果进行销毁,提升游戏速度。

 FqzZ2RGUr2ytayuiOOMQ231sIPm2

 

3 演示说明

游戏开始,随机产生一数字方块

Fmk-2vX2LnN24vxRAGX54O5QTGbi

点击上下左右键,方块移动与合成,分值改变并产生新的数字方块

Fh-_Gg8Oe7cFONEROLoizJJKVait

Fm3HeAHRXqq6xg23IM9vHCM6XGpT

未合成2048,且无可移动方块,游戏失败,显示本局得分和历史最高分

FvLam9wni2FfKIs8vpMG4UQCiXxB

合成2048,游戏胜利

FnP2bO6OitadZsnPkRUAaq7NSiZM

FnQR0S3lr4rGDJOkYJ5GH6mMAvkb

4 心得体会

本次是我第一次参加funpack活动,由于此次活动开展时间是寒假且活动开展的时间较长,所以对在读的学生比较友好,本次活动主题新奇,且编译游戏时可选择的编译语言较多,入门难度降低了许多。

但是在这一过程中我也发现了一些问题。

首先是板卡质量,电源、屏幕上的问题屡屡出现。

其次是在编译过程中的问题,例如微软编程中重复操作模块不如其他编程语言那么直观易懂,不能体现重复操作在整个操作过程中要达到的目的,可读性降低。

团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号