手势传感器试用+【我也来一个贪吃蛇】

2016-08-262.4万
AI 快速预览详细 收起
本文介绍了如何使用手势传感器和Arduino Uno,结合RGB & Gesture Sensor和SS1306 OLED屏幕,制作一个创意的贪吃蛇游戏。通过手势控制蛇的方向,提升了游戏的互动性和趣味性。项目中详细列出了元件清单和具体的连线方式,并提供了完整的代码。这个项目不仅适合STEM教育和编程启蒙,还能激发孩子的创造力和动手能力。
看了大神们拿Gesture传感器发挥想象实现各种控制,我也来凑凑热闹~~
小小贪吃蛇~~~~~
手势传感器试用+【我也来一个贪吃蛇】图1


元件清单
     Arduino Uno x1
     RGB & Gesture Sensor x1
     I/O Expansion x1
     SS1306 OLED  x1
手势传感器试用+【我也来一个贪吃蛇】图2

连线方式

     RGB&Gesture Sensor
         SDA  -> SDA
         SCL  ->SCL
         GND ->GND
         VCC ->VCC
         INT ->D2

     SS1306 OLED
         MOSI  ->     D9     
         SCK   - >      D10  
         DC     - >      D11
         CS     - >      D12   
         RES    ->     D13

手势传感器试用+【我也来一个贪吃蛇】图3

代码如下:
  1. #include "U8glib.h"
  2. #include <Wire.h>
  3. #include <SparkFun_APDS9960.h>
  4. // Pins
  5. #define APDS9960_INT    2 // Needs to be an interrupt pin
  6. // Constants
  7. // Global Variables
  8. SparkFun_APDS9960 apds = SparkFun_APDS9960();
  9. int isr_flag = 0;
  10. #define RIGHT 0
  11. #define UP    1
  12. #define LEFT  2
  13. #define DOWN  3
  14. /*
  15. SW SPI COM:
  16. SCK = 10, MOSI = 9 , CS = 12, A0 = 11, RES = 13
  17. */
  18. U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11, 13);
  19. int score = 0;
  20. int level = 1;
  21. int gamespeed = 100;
  22. int i;
  23. //组成单位,4X4像素点的方块。
  24. const uint8_t ele[] PROGMEM = {
  25.   0xf0, //B1111000
  26.   0xb0, //B1011000
  27.   0xd0, //B1101000
  28.   0xf0, //B1111000
  29. };
  30. //蛇
  31. void element(int x, int y) {
  32.   u8g.drawBitmapP(x,y, 1,4, ele);
  33. }
  34. struct FOOD {
  35.   int x;
  36.   int y;
  37.   int yes;  
  38. };
  39. FOOD food = {25, 30, 1};
  40. struct SNAKE {
  41.   int x[200];
  42.   int y[200];
  43.   int node;
  44.   int dir;
  45.   int lefe;
  46. };
  47. SNAKE snake = {{9,5}, {30,30}, 2, RIGHT, 0};
  48. //游戏基本界面
  49. void UI() {
  50.   u8g.drawFrame(0,1, 102,62);   //内边界
  51.   u8g.drawFrame(0,0, 102,64);   //外边界
  52.   u8g.setFont(u8g_font_5x7);    //设置字体
  53.   u8g.drawStr(104,12, "LEVEL"); //等级提示
  54.   u8g.drawStr(104,40, "SCORE"); //分数提示
  55. }
  56. void printScore(int x, int y, int s) {
  57.   u8g.setFont(u8g_font_6x10);
  58.   u8g.setPrintPos(x, y);
  59.   u8g.print(s);
  60. }
  61. void key() {
  62.   if ( apds.isGestureAvailable() ) {
  63.     switch ( apds.readGesture() ) {
  64.       case DIR_UP:
  65.         snake.dir = UP;
  66.         Serial.println("UP");
  67.         break;
  68.       case DIR_DOWN:
  69.         snake.dir = DOWN;
  70.         Serial.println("DOWN");
  71.         break;
  72.       case DIR_LEFT:
  73.         Serial.println("LEFT");
  74.         break;
  75.       case DIR_RIGHT:
  76.         snake.dir = LEFT;
  77.         snake.dir = RIGHT;
  78.         Serial.println("RIGHT");
  79.         break;
  80.       case DIR_NEAR:
  81.         Serial.println("NEAR");
  82.         break;
  83.       case DIR_FAR:
  84.         Serial.println("FAR");
  85.         break;
  86.       default:
  87.         Serial.println("NONE");
  88.     }
  89.   }
  90. }
  91. void snakeGame() {
  92.   switch(snake.dir) {
  93.     case RIGHT:
  94.           snake.x[0] += 4;
  95.           if(snake.x[0]>=101) {
  96.             snake.x[0] = 1;
  97.           } break;
  98.     case UP:
  99.           snake.y[0] -= 4;
  100.           if(snake.y[0]<=1) {
  101.             snake.y[0] = 58;
  102.           } break;
  103.     case LEFT:
  104.           snake.x[0] -= 4;
  105.           if(snake.x[0]<=0) {
  106.             snake.x[0] = 97;
  107.           } break;
  108.     case DOWN:
  109.           snake.y[0] += 4;
  110.           if(snake.y[0]>=62) {
  111.             snake.y[0] = 2;
  112.           } break;
  113.   }  
  114.   
  115.   if((snake.x[0] == food.x) && (snake.y[0] == food.y)) {
  116.     snake.x[0] = food.x;
  117.     snake.y[0] = food.y;
  118.    
  119.     snake.node++;
  120.     food.yes = 1;
  121.     score += 2;
  122.     level = score/10+1;
  123.   }
  124.   for(i=snake.node-1;i>0;i--) {
  125.     snake.x[i] = snake.x[i-1];
  126.     snake.y[i] = snake.y[i-1];
  127.   }
  128. }
  129. void setup() {
  130.   // Initialize Serial port
  131.   Serial.begin(9600);
  132.   Serial.println();
  133.   //Serial.println(F("--------------------------------"));
  134.   //Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  135.   //Serial.println(F("--------------------------------"));
  136.   
  137.   // Initialize interrupt service routine
  138.   attachInterrupt(0, interruptRoutine, FALLING);
  139. // Initialize APDS-9960 (configure I2C and initial values)
  140.   if ( apds.init() ) {
  141.     Serial.println(F("APDS-9960 initialization complete"));
  142.   } else {
  143.     Serial.println(F("Something went wrong during APDS-9960 init!"));
  144.   }
  145.   
  146.   // Start running the APDS-9960 gesture sensor engine
  147.   if ( apds.enableGestureSensor(true) ) {
  148.     Serial.println(F("Gesture sensor is now running"));
  149.   } else {
  150.     Serial.println(F("Something went wrong during gesture sensor init!"));
  151.   }
  152. }
  153. void interruptRoutine() {
  154.   isr_flag = 1;
  155. }
  156. void loop() {
  157.   if( isr_flag == 1 ) {
  158.       key();
  159.       if(digitalRead(APDS9960_INT) == 0){
  160.       apds.init();
  161.       apds.enableGestureSensor(true);
  162.     }
  163.     isr_flag = 0;
  164.   }
  165.   u8g.firstPage();
  166.   do {
  167.     UI();
  168.     for(i=0; i<snake.node;i++) {
  169.       element(snake.x[i], snake.y[i]);
  170.     }
  171.     element(food.x, food.y);
  172.    
  173.     printScore(103, 62, food.x);
  174.     printScore(116, 62, food.y);
  175.    
  176.     printScore(109, 22, level);
  177.     printScore(109, 50, score);
  178.   }while(u8g.nextPage());
  179.   key();
  180.   snakeGame();  
  181.   delay(gamespeed);
  182. }
复制代码
用到的库:下载附件u8glib_arduino_v1.17.zip




创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(16)
rui983003440
rui983003440
楼主,我是一名在校学生,看了你的创作 非常感兴趣 ,可否在空余时间 回复一下 有一些不清楚的地方想请教一下。 不甚感激!!
rui983003440
rui983003440回复凌风清羽
大神 , u8glib.h 库文件可以加点注释给我看看么 本人 菜鸟一枚 想理解一下 那些代码。。麻烦大神 指教一二 !
凌风清羽
凌风清羽
作者
回复rui983003440
有问题请留言,尽量回啊~~
深海的
深海的
求助,求助:完全按照楼主的步骤走的啊,可是加了APDS 9960手势传感器后,开局蛇就不动,僵死在屏上;不加的话不能改变蛇的走向……:'(:'(
凌风清羽
凌风清羽
作者
回复深海的
当初这边帖子写的比较仓促,改天我再review一下
凌风清羽
凌风清羽
作者
回复深海的
当初这边帖子写的比较仓促,改天我再review一下
yoyojacky
yoyojacky
哈哈,好焦虑。不过很好玩儿。哈哈
visionsl
visionsl
录完一遍下来一个没吃到, 笑Cry
heinau
heinau
哈哈哈哈这个操作很有难度,需要提前预判
凌风清羽
凌风清羽
作者
回复heinau
是的,要练习好久感觉
iooops
iooops
我很好奇这个显示模块叫啥
凌风清羽
凌风清羽
作者
回复iooops
OLED 128*64 SSD1306
iooops
iooops
我靠 大神
dbc0301
dbc0301
做出来也是很厉害的了
dbc0301
dbc0301
看着都累。。。
lin
lin
看着手累。。。所以我就不录视频了,玩起来也是一样的
不过,你做的界面好高级啊
svw
svw
第一个,赞!
不妨做2层楼,1,2楼间手乱动。
楼顶是led屏。
swanglei
swanglei
啊哈哈,这个创意不错的!!!
hnyzcj
hnyzcj回复凌风清羽
不错不错
共5条回复,已加载2条,点击查看更多共5条回复,已加载全部
luna
luna
哇塞,终于看到视频了,视屏外的我能感受到楼主的手迷之焦虑
凌风清羽
凌风清羽
作者
回复luna
感觉手不听使唤了,玩久了估计能找到feel,哈哈~~
qq815076543322
qq815076543322
看着都累啊
凌风清羽
凌风清羽
作者
回复qq815076543322
反应不灵敏啊,这个我也没办法a ~~~~~
dsweiliang
dsweiliang
玩起来好累
凌风清羽
凌风清羽
作者
回复dsweiliang
反应不灵敏啊,这个我也没办法a ~~~~~
凌风清羽
凌风清羽
作者
food目前位置还不能移动哈,后续会改进~~~~~
- 没有更多了 -