[RISC-V MCU 应用开发] 【RISC-V MCU CH32V103测评】+移植一个简单的Ardunio game

[复制链接]
 楼主| qjp1988113 发表于 2020-12-2 15:57 | 显示全部楼层 |阅读模式
本帖最后由 qjp1988113 于 2020-12-2 16:00 编辑

前面做好了摇杆、OLED的驱动及U8GLIB库的移植,今天我们开始移植一个原来在ardunio 上运行的小游戏--《开飞机》。
ardunio的IDE,也是支持C/C++,我们稍微修改下就好了。其中给我感觉的就是新版的C支持在函数内部定义变量,
而旧版的只能在函数顶端定义。另外对于产生随机数的random也有少许差异,废话不说了,上代码:
game.h
  1. /*
  2. * game.h
  3. *
  4. *  Created on: Nov 30, 2020
  5. *      Author: Administrator
  6. */

  7. #ifndef USER_GAME_H_
  8. #define USER_GAME_H_

  9. #include "joy.h"
  10. #include "adc_timtrig.h"
  11. #include "u8g_arm.h"
  12. #include "u8g.h"

  13. <font color="#ff0000">extern u8g_t u8g;//定义OLED对象</font>
  14. extern u8 reset**;

  15. void loop(void);
  16. void setup(void);
  17. void draw(void);



  18. #endif /* USER_GAME_H_ */
game.c
  1. /*
  2. * game.c
  3. *
  4. *  Created on: Nov 30, 2020
  5. *      Author: Administrator
  6. */

  7. #include "game.h"
  8. #include "debug.h"
  9. #include "u8g.h"
  10. #include "stdlib.h"
  11. #include "time.h"
  12. #include "string.h"

  13. u8g_t u8g;

  14. u8 reset**=0;
  15. //初始化变量
  16. //声明变量很多地方用了byte类型不用int类型,可以节约内存
  17. char wait=40;//延迟
  18. int HP=20;//HP
  19. char PPX=4;//初始化玩家X位置
  20. char PPY=2;//初始化玩家Y位置
  21. char PX=0;//初始化玩家X轴坐标
  22. char PY=0;//初始化玩家Y轴坐标
  23. //int RT=1;//初始化运行周期
  24. int RT=1;//初始化运行周期
  25. int S=0;//分数
  26. char ObjA;//障碍物
  27. char ObjB;//障碍物
  28. char ObjC;//障碍物
  29. char ObjD;//障碍物
  30. //int Atmp=0;//缓存A
  31. //int Btmp;//缓存B

  32. //下面湿障碍物的数据,我们把障碍物数据保存在数组里,由运行内存显示,每隔20次运行周期会重新覆盖,保存内存不溢出
  33. char CA[50];//障碍物A的位置
  34. char CB[50];//障碍物B的位置
  35. char CC[50];//障碍物C的位置
  36. char CD[50];//障碍物D的位置

  37. //下面湿障碍物A、B、C、D的坐标信息
  38. char CAX[50];//障碍物A_X轴
  39. char CBX[50];//障碍物B_X轴
  40. char CCX[50];//障碍物C_X轴
  41. char CDX[50];//障碍物D_X轴
  42. char CAY[50];//障碍物A_Y轴
  43. char CBY[50];//障碍物B_Y轴
  44. char CCY[50];//障碍物C_Y轴
  45. char CDY[50];//障碍物D_Y轴

  46. //载入位图
  47. const uint8_t title[] PROGMEM = {
  48.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
  49.   0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
  50.   0x98, 0x81, 0x31, 0xF3, 0x20, 0x45, 0x1F, 0x44, 0x8A, 0x00, 0xA0, 0x00, 0x00, 0x81, 0x00, 0x00,
  51.   0x68, 0x41, 0x4A, 0x92, 0x20, 0x45, 0x04, 0x44, 0x8A, 0x00, 0xB0, 0x01, 0x00, 0x40, 0x01, 0x00,
  52.   0x14, 0x02, 0x49, 0xF2, 0xE0, 0x45, 0xC4, 0xC4, 0x8B, 0x00, 0x4E, 0x06, 0x00, 0x80, 0x00, 0x00,
  53.   0x14, 0x82, 0x48, 0x92, 0x20, 0x55, 0xC4, 0x44, 0xAA, 0x00, 0xB0, 0x01, 0x00, 0x00, 0x00, 0x00,
  54.   0x68, 0x41, 0x48, 0x92, 0x20, 0x29, 0x04, 0x44, 0x52, 0x08, 0xA8, 0x00, 0x3E, 0x00, 0x00, 0x00,
  55.   0x98, 0xC1, 0x33, 0xF7, 0x20, 0x29, 0x04, 0x5C, 0x52, 0x00, 0x40, 0xC0, 0x61, 0x00, 0x00, 0x30,
  56.   0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x38, 0xC3, 0x00, 0x00, 0x0C,
  57.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE7, 0xC6, 0xFF, 0x07, 0x03,
  58.   0x00, 0x40, 0x00, 0x04, 0x52, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE0, 0x0C, 0xFE, 0xFF, 0xF9, 0x00,
  59.   0xC0, 0xF3, 0x1D, 0x04, 0x12, 0x00, 0x08, 0x00, 0x00, 0x00, 0x30, 0xE8, 0x81, 0x0F, 0xFC, 0x40,
  60.   0x00, 0x42, 0x94, 0x3F, 0x7E, 0x00, 0x14, 0x40, 0x00, 0x00, 0x1C, 0x1F, 0x00, 0x8E, 0x7F, 0x00,
  61.   0x00, 0xE5, 0x14, 0x04, 0x12, 0x00, 0x08, 0x00, 0x00, 0x00, 0xF6, 0x00, 0x00, 0xFC, 0x1F, 0x08,
  62.   0x00, 0xE3, 0x14, 0x0A, 0x57, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xFC, 0x0F, 0x00,
  63.   0x00, 0xE5, 0x14, 0x0A, 0x25, 0x00, 0x00, 0x00, 0x20, 0x00, 0x76, 0x00, 0x00, 0xF8, 0x03, 0x00,
  64.   0x00, 0x51, 0x15, 0x11, 0x55, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF1, 0x00, 0x00, 0xF6, 0x01, 0x00,
  65.   0x00, 0x52, 0xA3, 0x20, 0x47, 0x00, 0x02, 0x20, 0x00, 0x60, 0xFC, 0x00, 0x80, 0x79, 0x00, 0x00,
  66.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x18, 0xFA, 0x01, 0x60, 0x36, 0x10, 0x14,
  67.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x38, 0x84, 0xF1, 0x03, 0x90, 0x09, 0x00, 0x02,
  68.   0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1D, 0x00, 0x76, 0x43, 0xF0, 0x03, 0x7C, 0x07, 0x00, 0x54,
  69.   0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0xCD, 0x00, 0xF8, 0x07, 0x9B, 0x01, 0x20, 0x00,
  70.   0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x60, 0x33, 0x00, 0xEA, 0xC3, 0x44, 0x00, 0x02, 0x05,
  71.   0x00, 0x11, 0x03, 0x00, 0x00, 0x40, 0x02, 0xD8, 0x0C, 0x00, 0xE5, 0x31, 0x33, 0x00, 0x00, 0x28,
  72.   0xC0, 0xCC, 0x1C, 0x00, 0x00, 0x00, 0x70, 0x36, 0x03, 0x40, 0xDA, 0xC8, 0x1E, 0x00, 0x40, 0x75,
  73.   0x20, 0x32, 0x61, 0x80, 0x00, 0x00, 0x88, 0x8F, 0x00, 0xB0, 0x36, 0x36, 0x03, 0x00, 0x00, 0x20,
  74.   0x98, 0x0A, 0x81, 0x03, 0x00, 0x00, 0xE8, 0x70, 0x00, 0xE8, 0x8D, 0xC9, 0x20, 0x10, 0x50, 0x14,
  75.   0x64, 0x0C, 0x02, 0x1C, 0x00, 0x00, 0x78, 0x18, 0x00, 0x5E, 0x63, 0x36, 0x00, 0x02, 0x00, 0x00,
  76.   0x13, 0x08, 0x04, 0xE0, 0x00, 0x00, 0x08, 0x06, 0x80, 0xE7, 0x90, 0x19, 0x00, 0x00, 0x15, 0x75,
  77.   0x08, 0x08, 0x04, 0x00, 0x1F, 0x00, 0x90, 0x01, 0x40, 0x31, 0x6C, 0x06, 0x06, 0x00, 0x00, 0x20,
  78.   0x06, 0x10, 0x08, 0x00, 0xE0, 0xFF, 0x5F, 0x00, 0xF0, 0x10, 0x9B, 0x01, 0x00, 0x44, 0x50, 0x55,
  79.   0x01, 0x10, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0xC8, 0x64, 0x00, 0x00, 0x00, 0x00, 0x20,
  80.   0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x1E, 0x38, 0x13, 0x00, 0x00, 0x11, 0x75, 0x65,
  81.   0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x03, 0x80, 0x07, 0xCC, 0x0C, 0x00, 0x00, 0x00, 0x02, 0xA0,
  82.   0x00, 0x20, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x40, 0x01, 0x34, 0x03, 0x00, 0x44, 0x55, 0x55, 0x5D,
  83.   0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x00, 0xF0, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x80, 0x82, 0x28,
  84.   0x04, 0x50, 0x80, 0x00, 0x00, 0x18, 0x00, 0x38, 0x00, 0x23, 0x00, 0x00, 0x11, 0x15, 0x57, 0x65,
  85.   0x00, 0x40, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x19, 0x20, 0x00, 0x00, 0x8A, 0x08, 0x20,
  86.   0x00, 0x80, 0x00, 0x01, 0x80, 0x01, 0x80, 0x07, 0x80, 0x06, 0x00, 0x44, 0xD1, 0x25, 0x44, 0x15,
  87.   0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0xC0, 0x01, 0xC0, 0x81, 0x00, 0x00, 0xA8, 0x60, 0xA0, 0x22,
  88.   0x00, 0x80, 0xC0, 0x00, 0x18, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x45, 0x76, 0xC7, 0x30, 0x03,
  89.   0x00, 0x00, 0x31, 0x00, 0x04, 0x00, 0x78, 0x00, 0x20, 0x00, 0x00, 0x00, 0x22, 0xCA, 0x81, 0x00,
  90.   0x40, 0x00, 0x8D, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x20, 0x00, 0x40, 0x00, 0x10, 0x80, 0x41, 0x05,
  91.   0x00, 0x80, 0xE3, 0xC0, 0x00, 0x80, 0x27, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14,
  92.   0x00, 0x80, 0x18, 0x31, 0x00, 0xC0, 0x21, 0x00, 0xC8, 0x4B, 0x8F, 0x17, 0x66, 0x3A, 0x06, 0x04,
  93.   0x00, 0x20, 0x07, 0x0D, 0x00, 0x40, 0x20, 0x00, 0x08, 0x49, 0x81, 0x14, 0xA9, 0x0A, 0x1E, 0x04,
  94.   0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x10, 0x00, 0x04, 0x79, 0x87, 0x17, 0xAF, 0x3A, 0xFF, 0xE4,
  95.   0x00, 0x00, 0xC0, 0x03, 0x00, 0x20, 0x10, 0x00, 0x04, 0x49, 0x81, 0x10, 0x29, 0x0B, 0xFE, 0xF3,
  96.   0x00, 0x00, 0xC0, 0x03, 0x00, 0x2A, 0x10, 0x00, 0x02, 0x49, 0x8F, 0x70, 0x29, 0x3A, 0xBF, 0xDF,
  97.   0x20, 0x00, 0xF0, 0x03, 0x00, 0x15, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x0C,
  98.   0x00, 0x80, 0xF8, 0x07, 0xA0, 0x1E, 0x08, 0x00, 0x01, 0x00, 0x88, 0xCC, 0x01, 0xC0, 0x7F, 0x44,
  99.   0x00, 0x40, 0x79, 0x07, 0x54, 0x13, 0x08, 0x80, 0x00, 0x00, 0x88, 0x52, 0x21, 0xC4, 0x5B, 0x34,
  100.   0x00, 0x80, 0xA8, 0xA7, 0xEA, 0x1C, 0x04, 0x80, 0x00, 0xFE, 0x88, 0x5E, 0x71, 0x97, 0x9F, 0x39,
  101.   0x00, 0x18, 0xD8, 0x5F, 0x35, 0x0B, 0x04, 0x5F, 0x80, 0xF9, 0xA8, 0xD2, 0xA8, 0x8A, 0x17, 0xE0,
  102.   0x00, 0x86, 0xD8, 0xBC, 0xFE, 0x0C, 0xE4, 0x30, 0x60, 0xF8, 0x50, 0x52, 0xD1, 0x45, 0x07, 0x90,
  103.   0x80, 0xAA, 0xD8, 0xFA, 0x13, 0x0B, 0x1E, 0x3C, 0x18, 0xF0, 0x50, 0x52, 0xA9, 0x08, 0xA7, 0x86,
  104.   0xF0, 0xCF, 0xF1, 0xFF, 0xD0, 0x04, 0xE2, 0x13, 0x06, 0x60, 0x00, 0x00, 0x74, 0x01, 0x07, 0x05,
  105.   0xAC, 0x72, 0xF7, 0x1F, 0x30, 0x04, 0x1E, 0x90, 0x01, 0x18, 0x00, 0x00, 0xA8, 0x86, 0x85, 0x22,
  106.   0x57, 0xDD, 0xE1, 0x07, 0x10, 0x04, 0x01, 0x68, 0x00, 0x06, 0x00, 0xC0, 0x5D, 0xFE, 0x49, 0x05,
  107.   0xAA, 0x8A, 0xC0, 0x00, 0x08, 0xFE, 0x01, 0x04, 0x80, 0x01, 0x28, 0xA8, 0x0A, 0x18, 0xC9, 0xA3,
  108.   0x77, 0xBF, 0x34, 0x00, 0x04, 0x02, 0x01, 0x04, 0x70, 0x00, 0x76, 0x76, 0x77, 0xE3, 0x50, 0x01,
  109.   0xAA, 0x0A, 0x17, 0x00, 0x04, 0x82, 0x00, 0x02, 0x0C, 0x07, 0xA2, 0x8A, 0xAA, 0x42, 0xE1, 0x02,
  110.   0xD5, 0xC1, 0x16, 0x00, 0x04, 0x82, 0x00, 0x01, 0xC3, 0x08, 0xD1, 0xC5, 0xD5, 0x45, 0x40, 0x47,
  111.   0xAA, 0xB8, 0x08, 0x00, 0x02, 0x81, 0x80, 0xC1, 0x30, 0x06, 0xAA, 0x0A, 0x80, 0x4A, 0xF2, 0x2F,
  112. };
  113. const uint8_t QR[] PROGMEM = {
  114.   0x7F, 0xAD, 0x41, 0x4C, 0x0D, 0xFD, 0x01, 0x41, 0x6D, 0x9D, 0x01, 0xCD, 0x05, 0x01, 0x5D, 0x3F,
  115.   0xC9, 0xFE, 0xB2, 0x75, 0x01, 0x5D, 0x9F, 0xA3, 0x2A, 0x9B, 0x74, 0x01, 0x5D, 0xCE, 0xE7, 0x8F,
  116.   0x14, 0x74, 0x01, 0x41, 0x57, 0x49, 0x0C, 0x5B, 0x04, 0x01, 0x7F, 0x55, 0x55, 0x55, 0x55, 0xFD,
  117.   0x01, 0x00, 0x04, 0x7A, 0x24, 0xF6, 0x01, 0x00, 0x73, 0x3A, 0xD1, 0xCF, 0x00, 0xE9, 0x01, 0x10,
  118.   0x16, 0x49, 0xA2, 0x1F, 0x2B, 0x00, 0x67, 0x7C, 0xB5, 0x7E, 0xC2, 0x5F, 0x01, 0xB2, 0x41, 0xB6,
  119.   0x49, 0xFB, 0x32, 0x00, 0xC6, 0x88, 0xB2, 0x3C, 0x4E, 0xBE, 0x00, 0xB0, 0x61, 0x1C, 0xA7, 0x16,
  120.   0x23, 0x00, 0xEF, 0x55, 0x6D, 0x65, 0xCB, 0x47, 0x01, 0x96, 0xB6, 0x65, 0x6A, 0xBC, 0x34, 0x00,
  121.   0x50, 0x22, 0x81, 0xC7, 0xEA, 0xCA, 0x00, 0x23, 0x23, 0xC9, 0x99, 0x35, 0xB9, 0x00, 0xF3, 0x09,
  122.   0x6B, 0x54, 0xE5, 0xBC, 0x01, 0x22, 0x36, 0x89, 0x19, 0x29, 0x39, 0x01, 0xD2, 0x6D, 0x5C, 0x96,
  123.   0x26, 0x2F, 0x00, 0x02, 0xD9, 0xE7, 0x07, 0xB4, 0x71, 0x00, 0xFB, 0x93, 0xD0, 0xC7, 0x39, 0xBF,
  124.   0x01, 0x1B, 0x17, 0x78, 0x1C, 0x6F, 0x31, 0x00, 0x52, 0x1B, 0x6B, 0x75, 0x42, 0x75, 0x01, 0x1A,
  125.   0xB5, 0x61, 0x94, 0xA5, 0xF1, 0x01, 0xFD, 0x7D, 0xE4, 0x97, 0xBF, 0xFF, 0x01, 0xB8, 0xCB, 0x7E,
  126.   0x61, 0x50, 0x0C, 0x00, 0xE2, 0x88, 0x72, 0xD5, 0xE0, 0xDB, 0x01, 0x8A, 0x76, 0x7C, 0x1B, 0x35,
  127.   0x2C, 0x01, 0x43, 0x66, 0xE9, 0xC4, 0x06, 0xBE, 0x01, 0x9E, 0xE4, 0xE1, 0x92, 0xE2, 0x8B, 0x01,
  128.   0x53, 0xA5, 0x98, 0x90, 0xE4, 0xD8, 0x01, 0xB9, 0x17, 0x4D, 0x36, 0x09, 0x4D, 0x00, 0x41, 0x9A,
  129.   0xE2, 0xF4, 0x43, 0x4E, 0x01, 0x1B, 0xAF, 0xB8, 0x69, 0xF9, 0xAB, 0x01, 0x5C, 0x76, 0xBC, 0x5B,
  130.   0xA8, 0x0B, 0x00, 0xBD, 0xCB, 0x27, 0x3F, 0x9F, 0x45, 0x00, 0x62, 0xFD, 0x56, 0x64, 0x53, 0x6C,
  131.   0x01, 0x0E, 0x17, 0x1E, 0x8C, 0xDF, 0xA7, 0x01, 0x47, 0x28, 0xE0, 0x9F, 0xEA, 0x7F, 0x00, 0x00,
  132.   0x61, 0x69, 0x8C, 0x39, 0x91, 0x00, 0x7F, 0x6A, 0x7D, 0xCD, 0x02, 0xF5, 0x01, 0x41, 0x47, 0x5F,
  133.   0x9C, 0x32, 0xB1, 0x00, 0x5D, 0x99, 0xF2, 0x97, 0x00, 0x3F, 0x00, 0x5D, 0x74, 0x1C, 0x06, 0xBC,
  134.   0xAB, 0x01, 0x5D, 0x60, 0x2F, 0xAD, 0xB9, 0xFA, 0x01, 0x41, 0x8B, 0x47, 0x09, 0x8F, 0xB5, 0x00,
  135.   0x7F, 0x05, 0xEB, 0x76, 0x60, 0xC9, 0x01,
  136. };
  137. const uint8_t pause[] PROGMEM = {
  138.   0xA7, 0xAA, 0xAA, 0xAA, 0x3A, 0x55, 0x55, 0x55, 0x55, 0x29, 0x07, 0x00, 0x00, 0x00, 0x38, 0xF0,
  139.   0xF7, 0xFB, 0xF7, 0x03, 0x19, 0x1C, 0x8E, 0x1C, 0x26, 0x8A, 0xCF, 0x04, 0xC8, 0x14, 0x89, 0x08,
  140.   0x24, 0x09, 0x24, 0x8A, 0x08, 0x24, 0xC9, 0x17, 0x89, 0xC9, 0x24, 0x09, 0x24, 0x1A, 0xCC, 0x24,
  141.   0x19, 0x16, 0xF1, 0xFF, 0xFF, 0xFF, 0x23, 0x0A, 0x86, 0x4C, 0x18, 0x16, 0xC9, 0x34, 0x4D, 0xC8,
  142.   0x24, 0x0A, 0x04, 0x4D, 0x0E, 0x14, 0x09, 0x02, 0xCD, 0xD9, 0x27, 0xCA, 0x33, 0x41, 0x10, 0x14,
  143.   0xC9, 0x33, 0x21, 0x18, 0x26, 0xFA, 0xFF, 0xFF, 0xFF, 0x17, 0x70, 0xFC, 0xDE, 0xEF, 0x03, 0x07,
  144.   0x00, 0x00, 0x00, 0x38, 0x55, 0x55, 0x55, 0x55, 0x29, 0xA7, 0xAA, 0xAA, 0xAA, 0x3A,
  145. };
  146. const uint8_t plane[] PROGMEM = {0x8, 0xC, 0x8C, 0xFF, 0xFF, 0x8C, 0xC, 0x8};
  147. const uint8_t BOA[] PROGMEM = {0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33};
  148. const uint8_t BOB[] PROGMEM = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  149. const uint8_t BOC[] PROGMEM = {0x18, 0x66, 0x7E, 0xBD, 0xBD, 0x7E, 0x66, 0x18};
  150. const uint8_t BOD[] PROGMEM = {0x0, 0x7E, 0x42, 0x5A, 0x5A, 0x42, 0x7E, 0x0};
  151. const uint8_t life[] PROGMEM = {0x0, 0x66, 0xFF, 0xCF, 0xDF, 0x7E, 0x3C, 0x18};

  152. /********************************************************/

  153. void setup() {
  154.     // put your setup code here, to run once:
  155.     char key_value=0;
  156.     //初始化按钮
  157.     srand((unsigned)time(NULL));//伪随机数PIN
  158.     reset**=0;

  159.     u8g_FirstPage(&u8g);
  160.     do
  161.     {
  162.         u8g_DrawXBMP(&u8g,0,0,128,64,title);
  163.     }
  164.     while(u8g_NextPage(&u8g));
  165.     u8g_Delay(1024);
  166.     u8g_Delay(1024);
  167.     u8g_Delay(1024);

  168.     GET_KEY_Basedata();
  169.     key_value = GET_KEY_VALUE(JOY_X, JOY_Y, JOY_Z);
  170.     while(key_value!=LEFT_UP)
  171.     {
  172.         //显示
  173.         u8g_FirstPage(&u8g);
  174.         do
  175.         {
  176.           u8g_DrawXBMP(&u8g,0,0,128,64,title);
  177.         }
  178.         while(u8g_NextPage(&u8g));


  179.         GET_KEY_Basedata();
  180.         key_value = GET_KEY_VALUE(JOY_X, JOY_Y, JOY_Z);
  181.         printf("SETUP: x:%d   y:%d  z:%d\n", JOY_X,JOY_Y,JOY_Z);

  182.        switch(key_value)
  183.        {
  184.            case UP :
  185.                printf("UP\n");
  186.                break ;

  187.            case DOWN :
  188.                printf("DOWN\n");
  189.                break ;

  190.            case LEFT :
  191.                printf("LEFT\n");
  192.                break ;

  193.            case RIGHT  :
  194.                printf("RIGHT\n");
  195.                break ;

  196.            case LEFT_UP:
  197.                printf("LEFT_UP\n");
  198.                break ;

  199.            case LEFT_DOWN:
  200.                printf("LEFT_DOWN\n");
  201.                break ;

  202.            case RIGHT_UP:
  203.                printf("RIGHT_UP\n");
  204.                break ;

  205.            case RIGHT_DONW :
  206.                printf("RIGHT_DONW\n");
  207.                break ;

  208.            case ENTER :
  209.                printf("ENTER\n");
  210.                break ;

  211.            default:
  212.                break ;
  213.        }
  214.     }
  215. }
  216. /**********************************************************/
  217. void(* resetFunc)(void)=0;//制造从起命令的函数,下面会用到


  218. void loop() {
  219.     int  i=0;

  220.     int  tmprand=0;  //随机数缓存
  221.     char key_value=0;
  222.     int Atmp=0;//缓存A
  223.     int Btmp=0;//缓存B

  224.     //下面是GAME OVER或胜利后的处理
  225.     if(HP<0||S>30000)
  226.     {
  227.         //循环检测按钮
  228.         while(1)
  229.         {
  230.             //如果GAME OVER就等待按下A键复位游戏
  231.             GET_KEY_Basedata();
  232.             key_value = GET_KEY_VALUE(JOY_X, JOY_Y, JOY_Z);
  233.             printf("x:%d   y:%d  z:%d\n", JOY_X,JOY_Y,JOY_Z);

  234.              switch(key_value)
  235.              {
  236.                  case UP :
  237.                      printf("UP\n");
  238.                      break ;

  239.                  case DOWN :
  240.                      printf("DOWN\n");
  241.                      break ;

  242.                  case LEFT :
  243.                      printf("LEFT\n");
  244.                      break ;

  245.                  case RIGHT  :
  246.                      printf("RIGHT\n");
  247.                      break ;

  248.                  case LEFT_UP:
  249.                      printf("LEFT_UP\n");
  250.                      break ;

  251.                  case LEFT_DOWN:
  252.                      printf("LEFT_DOWN\n");
  253.                      break ;

  254.                  case RIGHT_UP:
  255.                      printf("RIGHT_UP\n");
  256.                      break ;

  257.                  case RIGHT_DONW :
  258.                      printf("RIGHT_DONW\n");
  259.                      break ;

  260.                  case ENTER :
  261.                      printf("ENTER\n");
  262.                      break ;

  263.                  default:
  264.                      break ;
  265.              }
  266.             //ENTER 代表A键
  267.             if(key_value==ENTER)//复位
  268.             {
  269.                 printf("I'm in ENTER\n");
  270.                 if(HP<0)
  271.                 {
  272.                     printf("I'm in HP<0 ENTER\n");

  273.                     //resetFunc();//调用前面的软复位函数,达到软件重启Arduino的目的
  274.                     NVIC_SystemReset();
  275.                     //复位初始数据
  276.                     wait=40;//延迟
  277.                     HP=20;//HP
  278.                     PPX=4;//初始化玩家X位置
  279.                     PPY=2;//初始化玩家Y位置
  280.                     PX=0;//初始化玩家X轴坐标
  281.                     PY=0;//初始化玩家Y轴坐标
  282.                     //int RT=1;//初始化运行周期
  283.                     RT=1;//初始化运行周期
  284.                     S=0;//分数
  285.                     ObjA=0;//障碍物
  286.                     ObjB=0;//障碍物
  287.                     ObjC=0;//障碍物
  288.                     ObjD=0;//障碍物
  289.                     //int Atmp=0;//缓存A
  290.                     //int Btmp;//缓存B
  291.                     //////////memset(arr, 0, 1024); //清零
  292.                     //下面湿障碍物的数据,我们把障碍物数据保存在数组里,由运行内存显示,每隔20次运行周期会重新覆盖,保存内存不溢出
  293.                     memset(CA,0,50);//障碍物A的位置
  294.                     memset(CB,0,50);//障碍物B的位置
  295.                     memset(CC,0,50);//障碍物C的位置
  296.                     memset(CD,0,50);//障碍物D的位置

  297.                     //下面湿障碍物A、B、C、D的坐标信息
  298.                     memset(CAX,0,50);//障碍物A_X轴
  299.                     memset(CBX,0,50);//障碍物B_X轴
  300.                     memset(CCX,0,50);//障碍物C_X轴
  301.                     memset(CDX,0,50);//障碍物D_X轴
  302.                     memset(CAY,0,50);//障碍物A_Y轴
  303.                     memset(CBY,0,50);//障碍物B_Y轴
  304.                     memset(CCY,0,50);//障碍物C_Y轴
  305.                     memset(CDY,0,50);//障碍物D_Y轴

  306.                     printf("RESTORE DATA\n");
  307.                 }
  308.                // break;
  309.             }

  310.             //如果检测到分数大于3万,就判断赢了游戏,放出二维码彩蛋
  311.             if(S>=30000){
  312.                 while(1)
  313.                 {
  314.                     u8g_SetColorIndex(&u8g,1);
  315.                     u8g_FirstPage(&u8g);
  316.                     do
  317.                     {
  318.                         u8g_DrawXBMP(&u8g,40,8,56,49,QR);
  319.                     }
  320.                     while(u8g_NextPage(&u8g));
  321.                 }
  322.             }
  323.         }
  324.     }

  325.     GET_KEY_Basedata();
  326.     key_value = GET_KEY_VALUE(JOY_X, JOY_Y, JOY_Z);
  327.     if(key_value==UP)
  328.     {
  329.         //u8g_Delay(10);
  330.         if(key_value==UP)
  331.         {
  332.             if(PPY>1) PPY-=1;
  333.         }
  334.     }

  335.     if(key_value==DOWN)
  336.     {
  337.         //u8g_Delay(10);
  338.         if(key_value==DOWN)
  339.         {
  340.             if(PPY<4) PPY+=1;
  341.         }
  342.     }

  343.     if(key_value==LEFT)
  344.     {
  345.         //u8g_Delay(10);
  346.         if(key_value==LEFT)
  347.         {
  348.             if(PPX>1) PPX-=1;
  349.         }
  350.     }
  351.     if(key_value==RIGHT)
  352.     {
  353.         //u8g_Delay(10);
  354.         if(key_value==RIGHT)
  355.         {
  356.             if(PPX<15) PPX+=1;
  357.         }
  358.     }
  359.     //LEFT_UP代表B键
  360.     if(key_value==LEFT_UP)
  361.     {
  362.         //u8g_Delay(10);
  363.         if(key_value==LEFT_UP)
  364.         {
  365.             //u8g_Delay(200);
  366.             u8g_FirstPage(&u8g);
  367.             do
  368.             {
  369.                 draw();
  370.                 u8g_SetColorIndex(&u8g,0);
  371.                 u8g_DrawBox(&u8g,42,10,46,28);//先覆盖掉原屏幕,避免下面的图片变透明
  372.                 u8g_SetColorIndex(&u8g,1);
  373.                 u8g_DrawXBMP(&u8g,45,13,40,22,pause);
  374.             }
  375.             while(u8g_NextPage(&u8g));
  376.             while(1)
  377.             {
  378.                 GET_KEY_Basedata();
  379.                 key_value = GET_KEY_VALUE(JOY_X, JOY_Y, JOY_Z);
  380.                 if(key_value==LEFT_UP)
  381.                 {
  382.                     u8g_Delay(10);
  383.                     if(key_value==LEFT_UP)
  384.                     {
  385.                         u8g_Delay(200);
  386.                         break;
  387.                     }
  388.                 }
  389.             }
  390.         }
  391.     }
  392.     /**************************************/
  393.     //计算
  394.     S+=1;
  395.     PX=PPX*8;
  396.     PY=PPY*8;
  397.     ObjA=9;
  398.     ObjB=9;
  399.     ObjC=9;
  400.     ObjD=9;
  401.     if(RT<16)
  402.     {
  403.         //srand((unsigned)time(NULL));
  404.         tmprand= random();
  405.         Atmp=1+tmprand%100;//1~100
  406.         if(Atmp<=70)
  407.         {
  408.             //srand((unsigned)time(NULL));
  409.             tmprand= random();
  410.             ObjA=tmprand%5;
  411.         }
  412.         //乌云

  413.         //srand((unsigned)time(NULL));
  414.         tmprand= random();
  415.         Atmp=1+tmprand%100;//1~100
  416.         if(Atmp<=30)
  417.         {
  418.             //srand((unsigned)time(NULL));
  419.             tmprand= random();
  420.             ObjB=tmprand%5;
  421.         }

  422.         //加油机
  423.         //srand((unsigned)time(NULL));
  424.         tmprand= random();
  425.         Atmp=1+tmprand%100;//1~100
  426.         if(Atmp<=5)
  427.         {
  428.             //srand((unsigned)time(NULL));
  429.             tmprand= random();
  430.             ObjC=tmprand%5;
  431.         }

  432.         //其他飞机
  433.         //srand((unsigned)time(NULL));
  434.         tmprand= random();
  435.         Atmp=1+tmprand%100;//1~100
  436.         if(Atmp<=50)
  437.         {
  438.             //srand((unsigned)time(NULL));
  439.             tmprand= random();
  440.             ObjD=tmprand%5;
  441.         }
  442.     }

  443.     if(HP>12)HP=12;
  444.     //保存障碍物位置
  445.     CAY[RT]=ObjA*8;
  446.     CBY[RT]=ObjB*8;
  447.     CCY[RT]=ObjC*8;
  448.     CDY[RT]=ObjD*8;
  449.     CA[RT]=ObjA;
  450.     CB[RT]=ObjB;
  451.     CC[RT]=ObjC;
  452.     CD[RT]=ObjD;
  453.     CAX[RT]=120;
  454.     CBX[RT]=120;
  455.     CCX[RT]=120;
  456.     CDX[RT]=120;
  457.     //判断伤害
  458.     Btmp=15-PPX;
  459.     if(RT>Btmp)
  460.     {
  461.         Atmp=RT-Btmp;
  462.         if(PPY==CA[Atmp])
  463.         {
  464.             HP-=1;
  465.         }


  466.         if(PPY==CB[Atmp])
  467.         {
  468.             HP-=2;
  469.         }

  470.         if(PPY==CC[Atmp])
  471.         {
  472.             //Atmp=random(1,3);
  473.             //srand((unsigned)time(NULL));
  474.             tmprand= random();
  475.             Atmp=1+tmprand%3;

  476.             HP+=Atmp;
  477.             S+=30;
  478.         }

  479.         if(PPY==CD[Atmp])
  480.         {
  481.             //Atmp=random(1,100);

  482.             //srand((unsigned)time(NULL));
  483.             tmprand= random();
  484.             Atmp=1+tmprand%100;

  485.             if(Atmp<50)
  486.             {
  487.                 HP+=1;
  488.                 S+=15;
  489.             }
  490.             else
  491.             {
  492.                 HP-=1;
  493.             }
  494.         }
  495.     }

  496.     /*******************************华丽的分割线*******************/
  497.     u8g_FirstPage(&u8g);
  498.     do
  499.     {
  500.         draw();
  501.     }
  502.     while(u8g_NextPage(&u8g));
  503.     //障碍物往下移
  504.     Atmp=RT-16;
  505.     if(Atmp<1)
  506.     {
  507.         Atmp=1;
  508.     }

  509.     for(Atmp;Atmp<=RT;Atmp++)
  510.     {
  511.         CAX[Atmp]-=8;//把障碍物的数组下移
  512.         CBX[Atmp]-=8;
  513.         CCX[Atmp]-=8;
  514.         CDX[Atmp]-=8;
  515.     }
  516.     RT+=1;
  517.     if(RT>=32)
  518.     {
  519.         RT=1;
  520.     }


  521.     u8g_Delay(wait);//防止游戏运行到不能玩的级别

  522. }
  523. void draw()
  524. {
  525.     int Atmp=0;
  526.     int Btmp=0;

  527.     char tmpbuf[500]={0};
  528.     //障碍物循环码初始化计算
  529.     Atmp=RT-16;
  530.     if(Atmp<1)
  531.     {
  532.         Atmp=1;
  533.     }
  534.     //障碍物显示
  535.     for(Atmp;Atmp<=RT;Atmp++)
  536.     {
  537.         if(CCX[Atmp]>0)
  538.         {
  539.             u8g_DrawBitmapP(&u8g,CCX[Atmp],CCY[Atmp],1,8,BOC);

  540.         }
  541.         if(CDX[Atmp]>0)
  542.         {
  543.             u8g_DrawBitmapP(&u8g,CDX[Atmp],CDY[Atmp],1,8,BOD);
  544.         }
  545.         if(CAX[Atmp]>0)
  546.         {
  547.             u8g_DrawBitmapP(&u8g,CAX[Atmp],CAY[Atmp],1,8,BOA);
  548.         }
  549.         if(CBX[Atmp]>0)
  550.         {
  551.             u8g_DrawBitmapP(&u8g,CBX[Atmp],CBY[Atmp],1,8,BOB);
  552.         }
  553.     }

  554.     //显示玩家
  555.     u8g_DrawBitmapP(&u8g,PX,PY,1,8,plane);
  556.     //生命及分数
  557.     u8g_SetFont(&u8g,u8g_font_profont10);
  558.     u8g_SetColorIndex(&u8g,255);
  559.     if(HP>0)
  560.     {
  561.         u8g_DrawStr(&u8g, 8, 54, "HP:");
  562.         for(Atmp=1;Atmp<=HP;Atmp++)
  563.         {
  564.             Btmp=Atmp*8+20;
  565.             u8g_DrawBitmapP(&u8g,Btmp,45,1,8,life);
  566.         }
  567.     }

  568.     sprintf(tmpbuf,"score: %d",S);
  569.     u8g_DrawStr(&u8g, 8, 62,tmpbuf);

  570.     if(HP<0||S>=30000)
  571.     {
  572.         u8g_SetColorIndex(&u8g,255);
  573.         u8g_DrawBox(&u8g,0,0,128,64);
  574.         //打印结果
  575.         u8g_SetFont(&u8g,u8g_font_profont10);
  576.         u8g_SetColorIndex(&u8g,0);
  577.         if(HP<0)
  578.             u8g_DrawStr(&u8g, 4, 10,"GAME OVER");
  579.         if(S>=30000)
  580.             u8g_DrawStr(&u8g, 4, 10,"You Win");
  581.         //打印分数
  582.         u8g_SetFont(&u8g,u8g_font_profont10);
  583.         u8g_SetColorIndex(&u8g,0);
  584.         if(HP<0)
  585.         {
  586.             sprintf(tmpbuf,"score: %d",S);
  587.             u8g_DrawStr(&u8g, 4, 30,tmpbuf);
  588.         }
  589.         if(S>=30000)
  590.         {
  591.             u8g_DrawStr(&u8g, 4, 30,"score: 30000");
  592.         }

  593.         if(HP<0)
  594.             u8g_DrawStr(&u8g, 2, 62,"please push A to RESET");
  595.         if(S>=30000)
  596.             u8g_DrawStr(&u8g, 2, 62,"A to QR code");

  597.     }
  598. }

在mian.c里面调用:
  1. ............


编译下载,看下运行的效果:
启动画面,LEFT_UP 替代B键,启动游戏:
B.jpg
结束界面,ENTER取代A键,按下后重新开始:
A.jpg

游戏视频,要摇杆操作这游戏还是挺累的,麻蛋。还不如按键呢:
D (1).gif
ardunio平台上有个ardunio BOY的游戏机,还有好多开源的游戏,不过查看源码,好像要梯子,感兴趣可以自己去移植移植。
xyz549040622 发表于 2020-12-2 19:59 | 显示全部楼层
牛X,支持下!这都可以移植过来,不过看样子V103玩游戏有点卡呀。
740071911 发表于 2020-12-3 09:12 | 显示全部楼层
xyz549040622 发表于 2020-12-2 19:59
牛X,支持下!这都可以移植过来,不过看样子V103玩游戏有点卡呀。

应该就这样的吧,arduino是mega328p,性能应该远不如v103
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

111

主题

627

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部