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语言部分,一开始我是使用数组记录蛇的每个像素的位置。蛇的每下一个像素跟着前一个像素运动,这样只需要控制蛇的第一个像素就能够控制整个蛇运动。
使用数组有一个缺点就是你预先就需要知道需要多少个单位,而我们知道蛇每次迟到一个实物就会增大一次。除非你预先就把数组设为最大,但是我们知道这样是非常浪费内存的。所以我们这里边用的是动态链表,每吃一次食物,链表多一个节点。 用电脑串口控制的? :funk:好奇
页:
[1]