极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14307|回复: 2

ArduinoDUE上1.4寸小液晶写了个贪吃蛇

[复制链接]
发表于 2016-10-23 19:49:44 | 显示全部楼层 |阅读模式
  1. #include <UTFT.h>
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. UTFT myGLCD(ST7735S,A2,A1,A5,A4,A3);

  5. #define LEN sizeof(struct point)

  6. byte x = 40;
  7. byte y = 40;

  8. byte fx;
  9. byte fy;

  10. byte Score = 0;

  11. struct point
  12. {
  13.   byte px;
  14.   byte py;
  15.   struct point *next;
  16. };
  17. struct point a[10], *head,*p,*p1,*p2;

  18. extern uint8_t SmallFont[];
  19. byte inbyte = 0;
  20. byte flag = 0;
  21. byte start = 0;

  22. byte tempx;
  23. byte tempy;

  24. void ClrSnake()
  25. {
  26.     myGLCD.setColor(255, 255, 255);         
  27.         p=head;
  28.         do
  29.         {
  30.                 myGLCD.drawRect(p->px,p->py,p->px+1,p->py+1);
  31.                 p=p->next;
  32.         }while(p!=NULL);
  33. }

  34. void DrawSnake()
  35. {
  36.         myGLCD.setColor(0, 0, 255);   
  37.         p=head;
  38.         p1=p->next;       
  39.         do
  40.         {
  41.                 p->px = p1->px;
  42.                 p->py = p1->py;
  43.                 p=p->next;
  44.                 p1=p1->next;               
  45.         }while(p1!=NULL);
  46.         p->px = x;
  47.         p->py = y;
  48.         p2=p;
  49.         p=head;
  50.         p1=head;
  51.         do
  52.         {
  53.                 myGLCD.drawRect(p->px,p->py,p->px+1,p->py+1);
  54.                 p=p->next;
  55.         }while(p!=NULL);
  56. }

  57. void Grown()
  58. {
  59.         p2->next=(struct point *)malloc(LEN);
  60.         p=p2;
  61.         p2=p2->next;
  62.         p2->px=p->px;
  63.         p2->py=p->py;
  64.         p2->next=NULL;
  65. }

  66. void ReadDirection()
  67. {
  68.         while (Serial.available() > 0)  
  69.     {
  70.                 start=1;
  71.         inbyte = char(Serial.read());
  72.         delay(2);   
  73.         if(inbyte == 'a')
  74.         {
  75.            flag = 1;
  76.         }
  77.         if(inbyte == 'b')
  78.         {
  79.           flag = 2;
  80.         }       
  81.         if(inbyte == 'c')
  82.         {
  83.           flag = 3;
  84.         }       
  85.         if(inbyte == 'd')
  86.         {
  87.           flag = 4;
  88.         }                       
  89.     }
  90. }

  91. void Step()
  92. {
  93.         switch (flag)
  94.         {
  95.           case 1:
  96.                 y = y-2;
  97.                 break;
  98.           case 2:
  99.                 y = y+2;
  100.                 break;
  101.           case 3:
  102.                 x = x-2;
  103.                 break;
  104.           case 4:
  105.                 x = x+2;
  106.                 break;
  107.         }       
  108. }

  109. void CheckGame()
  110. {
  111.         if(5>x||122<x||8>y||97<y)
  112.     {
  113.                 while(1)
  114.                 {
  115.                  myGLCD.setColor(0, 0, 255);
  116.                  myGLCD.setFont(SmallFont);
  117.                  myGLCD.setBackColor(255, 255, 255);       
  118.                  myGLCD.print("Game Over!", CENTER, 50);   
  119.                  delay(500);  
  120.                 }
  121.     }
  122. }

  123. void Food()
  124. {
  125.         fx = random(3, 61)*2;
  126.         fy = random(4, 48)*2;
  127.         myGLCD.setColor(0, 0, 255);
  128.         myGLCD.drawRect(fx,fy,fx+1,fy+1);
  129. }

  130. void ShowInfo()
  131. {
  132.         myGLCD.setBackColor(255,255,255);
  133.         myGLCD.setColor(0, 0, 255);
  134.         myGLCD.setFont(SmallFont);
  135.         myGLCD.print("Score:",5,103);
  136.         myGLCD.printNumI(Score, 50, 103);       
  137.         myGLCD.printNumI(fx, 5, 115);
  138.         myGLCD.printNumI(fy, 35, 115);
  139.         myGLCD.printNumI(x, 68, 115);
  140.         myGLCD.printNumI(y, 96, 115);       
  141. }

  142. void setup()
  143. {
  144.     Serial.begin(9600);
  145.     myGLCD.InitLCD(PORTRAIT);
  146.     myGLCD.fillScr(0, 0, 0);
  147.         myGLCD.setColor(255, 255, 255);       
  148.         myGLCD.fillRoundRect(2,5,125,100);
  149.         myGLCD.setColor(0, 0, 255);
  150.         myGLCD.drawRoundRect(3,6,124,99);
  151.         myGLCD.setColor(255, 255, 255);
  152.         myGLCD.fillRoundRect(2,103,125,127);
  153.         myGLCD.setColor(0, 0, 255);       
  154.        
  155.    for(byte i= 0;i<10;i++)
  156.    {
  157.      a[i].px = x; a[i].py = y-i*2;         
  158.          myGLCD.drawRect(a[i].px,a[i].py,a[i].px+1,a[i].py+1);
  159.    }
  160.    for(byte i= 9;i>0;i--)
  161.    {
  162.         a[i].next = &a[i-1];
  163.    }
  164.    a[0].next = NULL;
  165.    head = &a[9];
  166.    Food();
  167. }

  168. void loop()
  169. {
  170.     ReadDirection();
  171.         if(start == 1)
  172.         {
  173.                 ClrSnake();
  174.                 Step();
  175.                 DrawSnake();
  176.                 if(x==fx && y==fy)
  177.                 {
  178.                         Food();
  179.                         Score++;
  180.                         Grown();
  181.                 }               
  182.         }
  183.         ShowInfo();       
  184.         delay(100);
  185.         CheckGame();   
  186. }
复制代码

这是在ArduinoDUE上写的一个贪吃蛇小游戏,通过上位机串口通信控制。上位机是用VB写的一个小窗口,通过上下左右,使电脑通过串口给arduino发送a、b、c、d。Arduino收到abcd控制蛇转弯操作。


这个程序里边最有意思的是c语言部分,一开始我是使用数组记录蛇的每个像素的位置。蛇的每下一个像素跟着前一个像素运动,这样只需要控制蛇的第一个像素就能够控制整个蛇运动。


使用数组有一个缺点就是你预先就需要知道需要多少个单位,而我们知道蛇每次迟到一个实物就会增大一次。除非你预先就把数组设为最大,但是我们知道这样是非常浪费内存的。所以我们这里边用的是动态链表,每吃一次食物,链表多一个节点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-10-24 08:44:49 | 显示全部楼层
用电脑串口控制的?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 05:27 , Processed in 0.041258 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表