|
为了方便新手小伙伴跟着制作这款接水果游戏,我整理了详细的关键步骤,全程基于Mind+(v2.x版本) 操作,搭配K10行空板即可实现,一起来拆解核心环节~
一、前期准备与硬件连接
1. 安装Mind+(v2.x版本)软件,打开后选择“行空板”硬件模式,确保软件与K10行空板的驱动匹配;
2. 用数据线将K10行空板与电脑连接,在Mind+中选择对应的串口,完成硬件连接与初始化。
二、角色与变量初始化设置
1. 变量创建:新建分数 水果速度 游戏时间 游戏状态等变量,分别用于记录得分、控制水果掉落速度、计时和判断游戏是否结束;
分数初始值设为0,水果速度初始值设为5(可根据难度调整),游戏时间设为60秒(或自定义时长),游戏状态初始值设为“运行”。
2. 界面元素绘制:通过Mind+的绘图模块,在K10行空板屏幕显示果篮、水果、炸弹等图形,设置果篮初始位置在屏幕底部中间,水果和炸弹随机在屏幕顶部生成。

三、按键控制果篮移动逻辑
1. 在Mind+中添加“当按下A键”和“当按下B键”的事件模块;
2. 按下A键时,让果篮的X坐标减少(向左移动),按下B键时,果篮的X坐标增加(向右移动);
3. 增加坐标边界判断,避免果篮移出屏幕(如X坐标限制在0~屏幕宽度之间)。
四、水果与炸弹掉落逻辑
1. 添加“重复执行”模块,在游戏状态为“运行”时,让水果和炸弹以水果速度为间隔向下移动;
2. 设置水果和炸弹的随机生成逻辑:每次掉落结束后,随机选择生成水果或炸弹(炸弹生成概率可降低,如10%),生成位置为屏幕顶部随机X坐标。
3. 速度递增设置:
成功接住水果后,将水果速度增加2(或自定义数值);
添加时间触发模块,每落下一个水果速度增加1,实现随时间提速。

五、碰撞检测与得分/结束逻辑
1. 添加“碰撞检测”模块,判断果篮与水果、炸弹的重叠区域;
2. 若果篮与水果碰撞:分数增加1,同时清除当前水果,重新生成新的水果;
3. 若果篮与炸弹碰撞:将游戏状态设为“结束”,停止所有掉落动作,在屏幕上显示“游戏结束”。
六、游戏计时与分数显示
1. 添加“计时器”模块,从游戏开始时启动计时,在屏幕上实时显示剩余时间;
2. 当计时结束(游戏时间归0),将游戏状态设为“结束”,显示最终分数;
3. 全程在屏幕固定位置绘制分数 剩余时间 水果速度等信息,方便玩家查看。

七、程序上传与测试
1. 完成所有代码编写后,点击Mind+中的“上传到设备”按钮,将程序上传到K10行空板;
2. 断开数据线,给K10行空板供电,按下复位键启动游戏,测试按键控制、碰撞检测、速度变化等功能是否正常。
- /*!
- * MindPlus
- * DFRobot, 行空板 K10
- */
- #include "unihiker_k10.h"
-
- // 动态变量
- volatile float mind_n_JieShuBianLiang, mind_n_GuoLanxZuoBiao, mind_n_SuDu, mind_n_JiShiQi,
- mind_n_FenShu, mind_n_ShuiGuoZaoXing, mind_n_ZhaDanTiShi, mind_n_ShuiGuoxZuoBiao,
- mind_n_ShuiGuoyZuoBiao;
-
-
- // 创建对象
- UNIHIKER_K10 k10;
- uint8_t screen_dir=2;
-
- void DF_ShuiGuo();
- void DF_DeFenPanDing();
- void DF_ShuiGuoLan();
- void DF_ZhongZhiShuiGuoWeiZhi();
-
- // 主程序开始
- void setup() {
- k10.begin();
- k10.initScreen(screen_dir);
- k10.creatCanvas();
- pinMode(P0, INPUT);
- pinMode(P1, INPUT);
- k10.setScreenBackground(0x000000);
- k10.canvas->canvasText("准备开始", 75, 150, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->canvasText("按下“按钮”开始游戏", 0, 180, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- while (!((k10.buttonA->isPressed()) || (k10.buttonB->isPressed()))) {}
- k10.canvas->canvasClear();
- mind_n_JieShuBianLiang = 0;
- mind_n_GuoLanxZuoBiao = 100;
- DF_ZhongZhiShuiGuoWeiZhi();
- mind_n_SuDu = 3;
- while (!((mind_n_JieShuBianLiang==1) || (mind_n_JiShiQi>=60))) {
- k10.canvas->canvasText((String("得分") + String(mind_n_FenShu)), 0, 0, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->canvasText((String("时间") + String(mind_n_JiShiQi)), 120, 0, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
- DF_ShuiGuo();
- DF_ShuiGuoLan();
- DF_DeFenPanDing();
- k10.canvas->updateCanvas();
- mind_n_JiShiQi += 0.1;
- }
- if ((mind_n_JieShuBianLiang==1)) {
- k10.canvas->canvasClear();
- k10.canvas->canvasText("游戏结束", 75, 120, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->canvasText("你输了!", 85, 160, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
- else {
- k10.canvas->canvasText("时间到!", 85, 120, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->canvasText((String("最终得分") + String(mind_n_FenShu)), 50, 160, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
- }
- void loop() {
-
- }
-
- // 自定义函数
- void DF_ShuiGuo() {
- if ((mind_n_ShuiGuoZaoXing==1)) {
- mind_n_ZhaDanTiShi = 0;
- k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data);
- }
- if ((mind_n_ShuiGuoZaoXing==2)) {
- mind_n_ZhaDanTiShi = 0;
- k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_1);
- }
- if ((mind_n_ShuiGuoZaoXing==3)) {
- mind_n_ZhaDanTiShi = 0;
- k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_2);
- }
- if ((mind_n_ShuiGuoZaoXing==4)) {
- mind_n_ZhaDanTiShi = 1;
- k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_3);
- }
- if ((mind_n_ShuiGuoZaoXing==5)) {
- mind_n_ZhaDanTiShi = 1;
- k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_3);
- }
- mind_n_ShuiGuoyZuoBiao += mind_n_SuDu;
- if ((mind_n_ShuiGuoyZuoBiao>=270)) {
- DF_ZhongZhiShuiGuoWeiZhi();
- mind_n_SuDu += 1;
- }
- }
- void DF_DeFenPanDing() {
- if ((mind_n_ShuiGuoyZuoBiao>=230)) {
- if ((mind_n_ZhaDanTiShi==1)) {
- if (((mind_n_ShuiGuoxZuoBiao>=(mind_n_GuoLanxZuoBiao - 30)) && (mind_n_ShuiGuoxZuoBiao<=(mind_n_GuoLanxZuoBiao + 30)))) {
- mind_n_JieShuBianLiang = 1;
- }
- }
- else {
- if (((mind_n_ShuiGuoxZuoBiao>=(mind_n_GuoLanxZuoBiao - 30)) && (mind_n_ShuiGuoxZuoBiao<=(mind_n_GuoLanxZuoBiao + 30)))) {
- mind_n_FenShu += 1;
- mind_n_SuDu += 1;
- DF_ZhongZhiShuiGuoWeiZhi();
- }
- }
- }
- }
- void DF_ShuiGuoLan() {
- if ((digitalRead(P0) && (mind_n_GuoLanxZuoBiao>=0))) {
- mind_n_GuoLanxZuoBiao -= 10;
- }
- if ((digitalRead(P1) && (mind_n_GuoLanxZuoBiao<=200))) {
- mind_n_GuoLanxZuoBiao += 10;
- }
- k10.canvas->canvasDrawBitmap(mind_n_GuoLanxZuoBiao,270,50,50,image_data_4);
- }
- void DF_ZhongZhiShuiGuoWeiZhi() {
- mind_n_ShuiGuoyZuoBiao = 30;
- mind_n_ShuiGuoxZuoBiao = (random(0, 200+1));
- mind_n_ShuiGuoZaoXing = (random(1, 5+1));
- }
复制代码
|