维博哥哥 发表于 2016-10-23 19:49:44

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

#include <UTFT.h>
#include <stdio.h>
#include <malloc.h>
UTFT myGLCD(ST7735S,A2,A1,A5,A4,A3);

#define LEN sizeof(struct point)

byte x = 40;
byte y = 40;

byte fx;
byte fy;

byte Score = 0;

struct point
{
byte px;
byte py;
struct point *next;
};
struct point a, *head,*p,*p1,*p2;

extern uint8_t SmallFont[];
byte inbyte = 0;
byte flag = 0;
byte start = 0;

byte tempx;
byte tempy;

void ClrSnake()
{
    myGLCD.setColor(255, 255, 255);       
        p=head;
        do
        {
                myGLCD.drawRect(p->px,p->py,p->px+1,p->py+1);
                p=p->next;
        }while(p!=NULL);
}

void DrawSnake()
{
        myGLCD.setColor(0, 0, 255);   
        p=head;
        p1=p->next;       
        do
        {
                p->px = p1->px;
                p->py = p1->py;
                p=p->next;
                p1=p1->next;               
        }while(p1!=NULL);
        p->px = x;
        p->py = y;
        p2=p;
        p=head;
        p1=head;
        do
        {
                myGLCD.drawRect(p->px,p->py,p->px+1,p->py+1);
                p=p->next;
        }while(p!=NULL);
}

void Grown()
{
        p2->next=(struct point *)malloc(LEN);
        p=p2;
        p2=p2->next;
        p2->px=p->px;
        p2->py=p->py;
        p2->next=NULL;
}

void ReadDirection()
{
        while (Serial.available() > 0)
    {
                start=1;
      inbyte = char(Serial.read());
      delay(2);   
      if(inbyte == 'a')
      {
         flag = 1;
      }
      if(inbyte == 'b')
      {
          flag = 2;
      }       
      if(inbyte == 'c')
      {
          flag = 3;
      }       
      if(inbyte == 'd')
      {
          flag = 4;
      }                       
    }
}

void Step()
{
        switch (flag)
        {
          case 1:
                y = y-2;
                break;
          case 2:
                y = y+2;
                break;
          case 3:
                x = x-2;
                break;
          case 4:
                x = x+2;
                break;
        }       
}

void CheckGame()
{
        if(5>x||122<x||8>y||97<y)
    {
                while(1)
                {
               myGLCD.setColor(0, 0, 255);
               myGLCD.setFont(SmallFont);
               myGLCD.setBackColor(255, 255, 255);       
               myGLCD.print("Game Over!", CENTER, 50);   
               delay(500);
                }
    }
}

void Food()
{
        fx = random(3, 61)*2;
        fy = random(4, 48)*2;
        myGLCD.setColor(0, 0, 255);
        myGLCD.drawRect(fx,fy,fx+1,fy+1);
}

void ShowInfo()
{
        myGLCD.setBackColor(255,255,255);
        myGLCD.setColor(0, 0, 255);
        myGLCD.setFont(SmallFont);
        myGLCD.print("Score:",5,103);
        myGLCD.printNumI(Score, 50, 103);       
        myGLCD.printNumI(fx, 5, 115);
        myGLCD.printNumI(fy, 35, 115);
        myGLCD.printNumI(x, 68, 115);
        myGLCD.printNumI(y, 96, 115);       
}

void setup()
{
    Serial.begin(9600);
    myGLCD.InitLCD(PORTRAIT);
    myGLCD.fillScr(0, 0, 0);
        myGLCD.setColor(255, 255, 255);       
        myGLCD.fillRoundRect(2,5,125,100);
        myGLCD.setColor(0, 0, 255);
        myGLCD.drawRoundRect(3,6,124,99);
        myGLCD.setColor(255, 255, 255);
        myGLCD.fillRoundRect(2,103,125,127);
        myGLCD.setColor(0, 0, 255);       
       
   for(byte i= 0;i<10;i++)
   {
   a.px = x; a.py = y-i*2;       
       myGLCD.drawRect(a.px,a.py,a.px+1,a.py+1);
   }
   for(byte i= 9;i>0;i--)
   {
        a.next = &a;
   }
   a.next = NULL;
   head = &a;
   Food();
}

void loop()
{
    ReadDirection();
        if(start == 1)
        {
                ClrSnake();
                Step();
                DrawSnake();
                if(x==fx && y==fy)
                {
                        Food();
                        Score++;
                        Grown();
                }               
        }
        ShowInfo();       
        delay(100);
        CheckGame();   
}
这是在ArduinoDUE上写的一个贪吃蛇小游戏,通过上位机串口通信控制。上位机是用VB写的一个小窗口,通过上下左右,使电脑通过串口给arduino发送a、b、c、d。Arduino收到abcd控制蛇转弯操作。
这个程序里边最有意思的是c语言部分,一开始我是使用数组记录蛇的每个像素的位置。蛇的每下一个像素跟着前一个像素运动,这样只需要控制蛇的第一个像素就能够控制整个蛇运动。
使用数组有一个缺点就是你预先就需要知道需要多少个单位,而我们知道蛇每次迟到一个实物就会增大一次。除非你预先就把数组设为最大,但是我们知道这样是非常浪费内存的。所以我们这里边用的是动态链表,每吃一次食物,链表多一个节点。

Hackerpro 发表于 2016-10-24 08:44:49

用电脑串口控制的?

迷你强 发表于 2016-10-26 09:10:22

:funk:好奇
页: [1]
查看完整版本: ArduinoDUE上1.4寸小液晶写了个贪吃蛇