当前位置: 首页 > 科技观察

HarmonyOS基于LYEVK-3861开发了童年游戏贪吃蛇_0

时间:2023-03-21 00:26:52 科技观察

更多信息请访问:https://harmonyos.51cto.com与华为共建的鸿蒙技术社区官方介绍关于LYEVK-3861开发板套件中有OLED屏扩展板和灯板与按钮。这次我们使用这两个扩展板来实现一个简单的贪吃蛇游戏。由于现有板卡资源有限,计划使用OLED屏显示游戏运行界面,OLED扩展板上的按键和灯效板复用为游戏选择和游戏控制方向键。OLED屏幕是128*64的点阵,采用I2C接口。OLED扩展板上的按钮用于选择游戏难度和游戏开始的方向控制(左)。灯板主要利用板上的按钮。按钮用于整个游戏中的确认操作和游戏运行过程中的方向控制(向右)效果演示环境准备1、开发环境、编译环境搭建,参考官方文档,这里不再赘述。参考链接如下:Window开发环境Ubuntu编译环境2、OpenHarmony2.0Canary源码源码获取,参考:源码获取说明镜像完整下载3、LYEVK-3861物联网开发板套件LYEVK-3861开发板OLED模块而SSD1306显示原理板子上的OLED屏大约0.96英寸,内存大小为128*64,分为8页,PAGE0~PAGE7,128列。OLED与方立方体点阵定义蛇的蛇体用■个方块表示。现有板卡的OLED驱动库中没有■的点阵定义。使用工具PCtoLCD2002,可以生成■的字符点阵定义。可以根据自己的需要生成指定大小的点阵。这里我们使用一个8*8的点阵。取模结果如下:按照图中所示的步骤实现块的取模。实际测试时发现,使用原始模数结果,在形成完整蛇身的过程中,各个方格之间的空隙比较大,显示效果不是很好。我们修改了取模的结果,最终方块的8*8点阵表示为:/*---8*8点阵*/staticconstunsignedcharF8X8[]={//0x00,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x00,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x00,//};OLED显示方块关于方块的显示和消除,我们使用自己定义的函数来显示整个方块,这个函数需要指定块的起始位置,整个块的处理不会影响屏幕其他区域的显示/*打印一个方块或者消除方块*/voidBar(uint8x0,uint8y0,DisOnOffonOff)Snake有了以上基础,我们就可以基于我们的LYEVK-3861开发板设计一个简短的贪吃蛇游戏了.贪吃蛇游戏按键复用的基本定义1、OLED扩展板上的按键功能:①在游戏主界面,点击按键选择不同难度;②在游戏界面,功能是控制蛇头向左转;2.灯光棋盘上按键的作用:①游戏主界面,游戏结束界面,游戏通关界面,确认操作,界面跳转②游戏界面,功能是控制蛇头向右转。主界面显示游戏名称,游戏可选难度(1、2、3,数字越大难度越大),按键功能选择游戏界面使用整屏128x64作为游戏的可运行界面,而蛇是由方块(8x8点阵)组成的,方块需要16*8的方块来填满整个界面。游戏规则定义每次移动1个单位长度(匀速,不同难度移动速度不同)。通过按下按钮,可以将方向更改为蛇前进方向的左侧或右侧。食物随机生成,食物长度+1。游戏在撞到墙或身体时结束(失败)长度达到最长长度结束游戏(成功)蛇蛇基本算法设计蛇定义typedefstruct{int8X[SNAKE_MAX_LONG];int8Y[SNAKE_MAX_LONG];uint8Long;//蛇长gameLevelLevel;//1-简单2-普通3-难度snakeDirectionDirection;//蛇的前进方向默认为右}snakeType;//蛇的结构蛇的运动蛇的局部刷新由于开发板的性能有限CPUHi3861和0.96英寸的处理性能,吃蛇的时候很难用游戏运行过程中,不能每次都刷新整个画面来更新蛇身。这里我们采用局部刷新的方式,避免一次性刷新整个画面,影响游戏性能。具体处理方法如下:蛇每移动一个长度单位(1方块),无论是否吃到食物,都会将蛇头方块的位置打印到屏幕上。消除并吃食物,那么这次尾块就不会被消除。这样做的好处是每次蛇的位置发生变化时,除了判断它是否吃过食物外,只需要打印头部和尾部的方块,而不用重复打印蛇身体的所有方块。蛇的移动规则是基于开发板现有的资源。想要直接控制贪蛇的四个方向是不现实的。为了合理利用开发板的配套资源,我们在发光板上使用了OLED扩展板和两者。按键控制蛇的移动。设计方法简述如下:1、8x8点阵划分整个屏幕后,每个方格的坐标范围为水平(0-15)和垂直(0-7)。范围在-1、0、1这三个数字之间变化。根据蛇的4个行进方向和左转还是右转,定义如下参数:typedefenum{DIREC_STRAIGHT=-1,DIREC_RIGHT,//右DIREC_TOP,//upDIREC_LEFT,//leftDIREC_BOTTOM,//bottomDIREC_MAX}snakeDirection;/*1-2直行3-4左转5-6右转*/staticint8snakeDirectonInfo[4][6]={{1,0,0,-1,0,1},//DIREC_RIGHT{0,-1,-1,0,1,0},//DIREC_TOP{-1,0,0,1,0,-1},//DIREC_LEFT{0,1,1,0,-1,0}//DIREC_BOTTOM};说明:每个方向定义了6个元素,按照两组,分别是直行、左转、右转,所以在处理蛇移动的时候,可以直接套用定义好的数组,优化蛇的逻辑处理移动。2、没有按钮时,小蛇按照一定的频率(刷新频率)向前移动,一次一格;当有按钮时,根据不同的按钮选择不同的处理方式:if(direct==DIREC_LEFT){//leftTurnnewPos[0]=snakeDirectonInfo[Snake.Direction][2];newPos[1]=snakeDirectonInfo[Snake.Direction][3];Snake.Direction=(Snake.Direction+1)>DIREC_BOTTOM?(DIREC_RIGHT):(Snake.Direction+1);//新方向}elseif(direc==DIREC_RIGHT){//右转newPos[0]=snakeDirectonInfo[Snake.Direction][4];newPos[1]=snakeDirectonInfo[Snake.Direction][5];Snake.Direction=(Snake.Direction-1)