2025-12-26 15:56:15 [显示全部楼层]
10浏览
查看: 10|回复: 0

[K10教程] 基于K10行空板制作接水果游戏

[复制链接]
为了方便新手小伙伴跟着制作这款接水果游戏,我整理了详细的关键步骤,全程基于Mind+(v2.x版本) 操作,搭配K10行空板即可实现,一起来拆解核心环节~

一、前期准备与硬件连接

1. 安装Mind+(v2.x版本)软件,打开后选择“行空板”硬件模式,确保软件与K10行空板的驱动匹配;

2. 用数据线将K10行空板与电脑连接,在Mind+中选择对应的串口,完成硬件连接与初始化。


二、角色与变量初始化设置

1. 变量创建:新建分数 水果速度 游戏时间 游戏状态等变量,分别用于记录得分、控制水果掉落速度、计时和判断游戏是否结束;

分数初始值设为0,水果速度初始值设为5(可根据难度调整),游戏时间设为60秒(或自定义时长),游戏状态初始值设为“运行”。


2. 界面元素绘制:通过Mind+的绘图模块,在K10行空板屏幕显示果篮、水果、炸弹等图形,设置果篮初始位置在屏幕底部中间,水果和炸弹随机在屏幕顶部生成。

基于K10行空板制作接水果游戏图2

三、按键控制果篮移动逻辑

1. 在Mind+中添加“当按下A键”和“当按下B键”的事件模块;

2. 按下A键时,让果篮的X坐标减少(向左移动),按下B键时,果篮的X坐标增加(向右移动);

3. 增加坐标边界判断,避免果篮移出屏幕(如X坐标限制在0~屏幕宽度之间)。



四、水果与炸弹掉落逻辑

1. 添加“重复执行”模块,在游戏状态为“运行”时,让水果和炸弹以水果速度为间隔向下移动;

2. 设置水果和炸弹的随机生成逻辑:每次掉落结束后,随机选择生成水果或炸弹(炸弹生成概率可降低,如10%),生成位置为屏幕顶部随机X坐标。

3. 速度递增设置:

成功接住水果后,将水果速度增加2(或自定义数值);

添加时间触发模块,每落下一个水果速度增加1,实现随时间提速。

基于K10行空板制作接水果游戏图3

五、碰撞检测与得分/结束逻辑

1. 添加“碰撞检测”模块,判断果篮与水果、炸弹的重叠区域;

2. 若果篮与水果碰撞:分数增加1,同时清除当前水果,重新生成新的水果;

3. 若果篮与炸弹碰撞:将游戏状态设为“结束”,停止所有掉落动作,在屏幕上显示“游戏结束”。



六、游戏计时与分数显示

1. 添加“计时器”模块,从游戏开始时启动计时,在屏幕上实时显示剩余时间;

2. 当计时结束(游戏时间归0),将游戏状态设为“结束”,显示最终分数;

3. 全程在屏幕固定位置绘制分数 剩余时间 水果速度等信息,方便玩家查看。

基于K10行空板制作接水果游戏图1

七、程序上传与测试

1. 完成所有代码编写后,点击Mind+中的“上传到设备”按钮,将程序上传到K10行空板;

2. 断开数据线,给K10行空板供电,按下复位键启动游戏,测试按键控制、碰撞检测、速度变化等功能是否正常。

  1. /*!
  2. * MindPlus
  3. * DFRobot, 行空板 K10
  4. */
  5. #include "unihiker_k10.h"
  6. // 动态变量
  7. volatile float mind_n_JieShuBianLiang, mind_n_GuoLanxZuoBiao, mind_n_SuDu, mind_n_JiShiQi,
  8.                mind_n_FenShu, mind_n_ShuiGuoZaoXing, mind_n_ZhaDanTiShi, mind_n_ShuiGuoxZuoBiao,
  9.                mind_n_ShuiGuoyZuoBiao;
  10. // 创建对象
  11. UNIHIKER_K10 k10;
  12. uint8_t screen_dir=2;
  13. void DF_ShuiGuo();
  14. void DF_DeFenPanDing();
  15. void DF_ShuiGuoLan();
  16. void DF_ZhongZhiShuiGuoWeiZhi();
  17. // 主程序开始
  18. void setup() {
  19.         k10.begin();
  20.         k10.initScreen(screen_dir);
  21.         k10.creatCanvas();
  22.         pinMode(P0, INPUT);
  23.         pinMode(P1, INPUT);
  24.         k10.setScreenBackground(0x000000);
  25.         k10.canvas->canvasText("准备开始", 75, 150, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
  26.         k10.canvas->canvasText("按下“按钮”开始游戏", 0, 180, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
  27.         k10.canvas->updateCanvas();
  28.         while (!((k10.buttonA->isPressed()) || (k10.buttonB->isPressed()))) {}
  29.         k10.canvas->canvasClear();
  30.         mind_n_JieShuBianLiang = 0;
  31.         mind_n_GuoLanxZuoBiao = 100;
  32.         DF_ZhongZhiShuiGuoWeiZhi();
  33.         mind_n_SuDu = 3;
  34.         while (!((mind_n_JieShuBianLiang==1) || (mind_n_JiShiQi>=60))) {
  35.                 k10.canvas->canvasText((String("得分") + String(mind_n_FenShu)), 0, 0, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
  36.                 k10.canvas->canvasText((String("时间") + String(mind_n_JiShiQi)), 120, 0, 0xFFFFFF, k10.canvas->eCNAndENFont24, 50, true);
  37.                 DF_ShuiGuo();
  38.                 DF_ShuiGuoLan();
  39.                 DF_DeFenPanDing();
  40.                 k10.canvas->updateCanvas();
  41.                 mind_n_JiShiQi += 0.1;
  42.         }
  43.         if ((mind_n_JieShuBianLiang==1)) {
  44.                 k10.canvas->canvasClear();
  45.                 k10.canvas->canvasText("游戏结束", 75, 120, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
  46.                 k10.canvas->canvasText("你输了!", 85, 160, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
  47.                 k10.canvas->updateCanvas();
  48.         }
  49.         else {
  50.                 k10.canvas->canvasText("时间到!", 85, 120, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
  51.                 k10.canvas->canvasText((String("最终得分") + String(mind_n_FenShu)), 50, 160, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
  52.                 k10.canvas->updateCanvas();
  53.         }
  54. }
  55. void loop() {
  56. }
  57. // 自定义函数
  58. void DF_ShuiGuo() {
  59.         if ((mind_n_ShuiGuoZaoXing==1)) {
  60.                 mind_n_ZhaDanTiShi = 0;
  61.                 k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data);
  62.         }
  63.         if ((mind_n_ShuiGuoZaoXing==2)) {
  64.                 mind_n_ZhaDanTiShi = 0;
  65.                 k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_1);
  66.         }
  67.         if ((mind_n_ShuiGuoZaoXing==3)) {
  68.                 mind_n_ZhaDanTiShi = 0;
  69.                 k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_2);
  70.         }
  71.         if ((mind_n_ShuiGuoZaoXing==4)) {
  72.                 mind_n_ZhaDanTiShi = 1;
  73.                 k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_3);
  74.         }
  75.         if ((mind_n_ShuiGuoZaoXing==5)) {
  76.                 mind_n_ZhaDanTiShi = 1;
  77.                 k10.canvas->canvasDrawBitmap(mind_n_ShuiGuoxZuoBiao,mind_n_ShuiGuoyZuoBiao,50,50,image_data_3);
  78.         }
  79.         mind_n_ShuiGuoyZuoBiao += mind_n_SuDu;
  80.         if ((mind_n_ShuiGuoyZuoBiao>=270)) {
  81.                 DF_ZhongZhiShuiGuoWeiZhi();
  82.                 mind_n_SuDu += 1;
  83.         }
  84. }
  85. void DF_DeFenPanDing() {
  86.         if ((mind_n_ShuiGuoyZuoBiao>=230)) {
  87.                 if ((mind_n_ZhaDanTiShi==1)) {
  88.                         if (((mind_n_ShuiGuoxZuoBiao>=(mind_n_GuoLanxZuoBiao - 30)) && (mind_n_ShuiGuoxZuoBiao<=(mind_n_GuoLanxZuoBiao + 30)))) {
  89.                                 mind_n_JieShuBianLiang = 1;
  90.                         }
  91.                 }
  92.                 else {
  93.                         if (((mind_n_ShuiGuoxZuoBiao>=(mind_n_GuoLanxZuoBiao - 30)) && (mind_n_ShuiGuoxZuoBiao<=(mind_n_GuoLanxZuoBiao + 30)))) {
  94.                                 mind_n_FenShu += 1;
  95.                                 mind_n_SuDu += 1;
  96.                                 DF_ZhongZhiShuiGuoWeiZhi();
  97.                         }
  98.                 }
  99.         }
  100. }
  101. void DF_ShuiGuoLan() {
  102.         if ((digitalRead(P0) && (mind_n_GuoLanxZuoBiao>=0))) {
  103.                 mind_n_GuoLanxZuoBiao -= 10;
  104.         }
  105.         if ((digitalRead(P1) && (mind_n_GuoLanxZuoBiao<=200))) {
  106.                 mind_n_GuoLanxZuoBiao += 10;
  107.         }
  108.         k10.canvas->canvasDrawBitmap(mind_n_GuoLanxZuoBiao,270,50,50,image_data_4);
  109. }
  110. void DF_ZhongZhiShuiGuoWeiZhi() {
  111.         mind_n_ShuiGuoyZuoBiao = 30;
  112.         mind_n_ShuiGuoxZuoBiao = (random(0, 200+1));
  113.         mind_n_ShuiGuoZaoXing = (random(1, 5+1));
  114. }
复制代码

果篮素材.png
水果2.png
水果1.png
水果3.png
水果4.png
炸弹.png

接水果.mpcode

128.57 KB, 下载次数: 1

程序文件

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail