- #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[10], *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[i].px = x; a[i].py = y-i*2;
- myGLCD.drawRect(a[i].px,a[i].py,a[i].px+1,a[i].py+1);
- }
- for(byte i= 9;i>0;i--)
- {
- a[i].next = &a[i-1];
- }
- a[0].next = NULL;
- head = &a[9];
- 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语言部分,一开始我是使用数组记录蛇的每个像素的位置。蛇的每下一个像素跟着前一个像素运动,这样只需要控制蛇的第一个像素就能够控制整个蛇运动。
使用数组有一个缺点就是你预先就需要知道需要多少个单位,而我们知道蛇每次迟到一个实物就会增大一次。除非你预先就把数组设为最大,但是我们知道这样是非常浪费内存的。所以我们这里边用的是动态链表,每吃一次食物,链表多一个节点。 |