电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Arduboy运行2048小程序
分 享
扫描二维码分享
Arduboy运行2048小程序
arduboy
2048
入门电子设计
关注
发布时间: 2020-03-19
丨
阅读: 1248
大家好,在之前我给大家介绍了一款基于ATmega32U4的开源掌机Arduboy。我们也可以自己通过一块Arduino micro、一个oled屏幕、一个蜂鸣器和几个按键来自己组装一个Arduboy掌机。这款掌机的最有意思的地方就是我们可以通过这个掌机来自行开发游戏。这个开发游戏的过程其实要比真正玩游戏还要有趣,毕竟受硬件的影响,Arduboy能运行的游戏种类并不多,画质也不是很好,所以主要就是体验编程的乐趣了。 在之前的文章中我只简单的在屏幕上打印了一个hello world然后简单介绍了一下按键的使用,编程方面并没有做更详细的介绍,那么在这篇文章里我会通过一个简单的2048小程序来介绍一下官方提供的Arduboy库的一些用法。 首先我们先来了解一下游戏的规则 ## 游戏规则 游戏的界面由16个格子组成,初始时的数字为2或者4,当我们按下其中一个方向键时,所有的数字会向那个方向移动,当两个格子的数字相同时,相撞后数字会相加。每当数字移动时,会在空白的格子上随机出现一个数字。当界面不可移动时,游戏就结束了,当数字相加到2048时,游戏就胜利。 这就是游戏的规则,还是比较简单的,现在我们就开始在Arduboy上编程实现这个小游戏。 ![](https://cf02.ickimg.com/bbsimages/202003/4325efdf31d550439d07ceba32c6e796.jpg) ## 程序 首先我们需要在屏幕上绘制出16个格子,在这里我通过两个循环来绘制10条线,用这10条线来组成16个格子。我使用的是官方提供的Arduboy库,画线是通过drawLine()这个函数来完成的,括号内依次是第一点的x坐标、第一点y坐标、第二点x坐标、第二点y坐标和线条颜色,颜色我们选择1。 ```cpp for(n = 0;n <= 60;n += 15) //绘制5条横线 { arduboy.drawLine(10,n,114,n,1); } for(m = 10;m <= 114;m += 26) //绘制5条竖线 { arduboy.drawLine(m,0,m,60,1); } ``` ![](https://cf02.ickimg.com/bbsimages/202003/fbcc5f2729b7f546021983121e243e45.jpg) 通过上面的程序我们就实现了方格的绘制,在绘制的时候要注意方格的尺寸,毕竟屏幕是128*64的,方格大小勉强能装下4位数字。 然后我们再定义一个二维数组来存放每个方格的数字。 ```cpp int Map[4][4] = { 0,2,0,2, 2,0,0,0, 0,0,2,8, 0,2,0,0 }; ``` 我们可以预先在数组里设定一些数字,接下来我们就要将数字绘制到画好的方格中去了,要输出字符,首先我们要设定光标的位置,在这里我们使用的是setCursor()这个函数,参数是光标的x、y坐标,打印字符使用的是print()函数 ```cpp for(x = 0;x < 4;x++) //输出数组内数据 { for(y = 0;y < 4;y++) { arduboy.setCursor(12+(x*26),4+(y*15)); if(Map[y][x] != 0) { arduboy.print(Map[y][x]); } } } ``` 然后我们使用display()来显示一下就可以了, ![](https://cf02.ickimg.com/bbsimages/202003/e14764e1e8d097985160c294d050575a.jpg) 接下来就是游戏逻辑的实现了,我们以向左移动为例,当按向左的方向键,数字会向左移动,如果碰到相同的数字就会相加,然后将靠右边的数字清零,下面是具体的程序, ```cpp if (arduboy.pressed(LEFT_BUTTON)) { delay(20); if(arduboy.pressed(LEFT_BUTTON)) { for(y = 0;y < 4;y++) { for(x = 0;x < 4;) { if(Map[y][x] == 0) { x++; continue; } else //如果不为0 { for(i = x + 1;i < 4;i++) { if(Map[y][i] == 0) { continue; } else { if(Map[y][x] == Map[y][i]) { Map[y][x] += Map[y][i]; Map[y][i] = 0; Blank++; break; } else { break; } } } x = i; } } } for(y = 0;y < 4;y++) { for(x = 0;x < 4;x++) { if(Map[y][x] == 0) { continue; } else { for(i = x;(i > 0)&&(Map[y][i-1] == 0);i--) { Map[y][i-1] = Map[y][i]; Map[y][i] = 0; while(arduboy.pressed(LEFT_BUTTON)) Move = 1; } } } } } } ``` ![](https://cf02.ickimg.com/bbsimages/202003/9d24d1147ba681603e59d32411cc0973.jpg) 这样就实现了向左的移动,其余的方向只需要改一下循环里的x和y就可以。 然后当我们移动一次数字时,就要在空白的方格内重新生成数字2,在前面的函数中变量Move就是用来检测是否发生数字的移动的。 ```cpp if(Move == 1) { New_x = random(3); New_y = random(3); if(Map[New_y][New_x] == 0) { Map[New_y][New_x] = 2; Move = 0; } } ``` 当有数字移动时,我们使用随机函数生成一个坐标,如果这个坐标的方格内数字为0时,我们就置2,这样就完成了每一次移动产生新数字的动作。 最后我们只要判断数组中出现2048时,就将游戏界面清屏输出游戏胜利即可。如果游戏中所有方格全不为0,那么我们再判断是否有同方向上可以相加的方格,如果没有,那么游戏就结束了。 这里的游戏只是使用了一些简单的画线函数,后面我会继续介绍库中的其他函数,并制作一个画面更精美的游戏。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
入门电子设计
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交