上一篇文章 我们介绍了 怎样使用 Nokia 5110液晶模块怎么显示使用(参照上一篇wen'zhan),现在我们可以大胆一点去开发一些小游戏 ,比如最经典的贪吃蛇,那么我们今天就来开始学习这个,
硬件设施:
首先我们会使用到 arduino ~uno 以及Joystick Shield 头展板 和Nokia 5110液晶模块,5110的LCD库的使用 ,在上一篇文章里,或者私信我 都行。
代码展示:
#include<LCD5110_Graph.h>
extern byte X_MAX=82;
extern byte Y_MAX=46;
extern unsigned char TinyFont[];
extern unsigned char SmallFont[];
byte DotX ,DotY;
byte SnakeBody[100][2]={{10,16},{10,18},{10,20}};
byte EatSelf =0;
byte NewFood=0;
byte SnakeLength=3;
long score=0;
byte FoodX=30,FoodY=30;
byte Direct=2;
byte LastDirect=2;
byte StepTime=5;
#define A digitalRead(2)
#define B digitalRead(3)
#define C digitalRead(4)
#define D digitalRead(5)
#define BL 6
LCD5110 LCD(9,10,11,13,12);
void setup() {
analogWrite(BL,0);
LCD.InitLCD();
LCD.setFont(SmallFont);
DisplayStart();
randomSeed(analogRead(7));
CreatFood();
}
void loop() {
MoveSnake();
JudgeEatSelf();
}
void DisplayStart(){
LCD.clrScr();
LCD.print("Snake",CENTER,20);
LCD.update();
delay(2000);
LCD.clrScr();
}
void DisplayGameOver(){
LCD.clrScr();
for(byte y=48;y>20;y--){
LCD.print("Game over",CENTER,y);
LCD.update();
delay(50);
}
delay(5000);
LCD.clrScr();
}
void PrintFrame(){
LCD.clrScr();
LCD.drawRect(0,6,83,47);
LCD.drawRect(1,7,82,46);
LCD.setFont(TinyFont);
LCD.print("Score",0,0);
LCD.printNumI(0,24,0,3,' ');
LCD.update();
}
void CreatDot(byte x,byte y){
LCD.drawRect(x,y,x+1,y+1);
LCD.update();
}
void ClearDot(byte x,byte y){
LCD.clrRect(x,y,x+1,y+1);
LCD.update();
}
byte IsFoodFit(byte X,byte Y){
byte WhetherFit=1;
for(int i=0;i<SnakeLength;i++){
if((X==SnakeBody[i][0]&&Y==SnakeBody[i][1])||(X%2!=0)||(Y%2!=0))
{
WhetherFit=0;
break;
}
}
return WhetherFit;
}
void RandomFoodPlace(){
FoodX=random(2,81);
FoodY=random(8,45);
}
void CreatFood(){
ClearDot(FoodX,FoodY);
while(!IsFoodFit(FoodX,FoodY))RandomFoodPlace();
CreatDot(FoodX,FoodY);
}
void DisplaySnake(){
int i;
for(i=0;i<SnakeLength;i++){
CreatDot(SnakeBody[i][0],SnakeBody[i][1]);
}
}
void ClearSnake(){
int i;
for(i=0;i<SnakeLength;i++){
ClearDot(SnakeBody[i][0],SnakeBody[i][1]);
}
}
void MoveSnake(){
if(A==0)Direct=0;
else if (B==0)Direct=1;
else if (C==0)Direct=2;
else if (D==0)Direct=3;
if((LastDirect+Direct)%2==0)Direct=LastDirect;
LastDirect=Direct;
if(SnakeBody[SnakeLength-1][0]==FoodX&&SnakeBody[SnakeLength-1][1]==FoodY)
{ SnakeLength++;
score++;
NewFood=1;
}
if(NewFood==1){
CreatFood();
NewFood=0;
switch(Direct){
case 0 :SnakeBody[SnakeLength-1][0]=SnakeBody[SnakeLength-2][0];
SnakeBody[SnakeLength-1][1]=SnakeBody[SnakeLength-2][1]-2;
break;
case 1:SnakeBody[SnakeLength-1][0]=SnakeBody[SnakeLength-2][0]+2;
SnakeBody[SnakeLength-1][1]=SnakeBody[SnakeLength-2][1];
break;
case 2: SnakeBody[SnakeLength-1][0]=SnakeBody[SnakeLength-2][0];
SnakeBody[SnakeLength-1][1]=SnakeBody[SnakeLength-2][1]+2;
break;
case 3:SnakeBody[SnakeLength-1][0]=SnakeBody[SnakeLength-2][0]-2;
SnakeBody[SnakeLength-1][1]=SnakeBody[SnakeLength-2][1];
break;
}
}
else {
switch(Direct){
case 0:{
for(int i=0;i<SnakeLength-1;i++){
SnakeBody[i][0]=SnakeBody[i+1][0];
SnakeBody[i][1]=SnakeBody[i+1][1];
}
SnakeBody[SnakeLength-1][1]=SnakeBody[SnakeLength -1][1]-2;
}
break ;
case 1:{
for(int i=0;i<SnakeLength-1;i++){
SnakeBody[i][0]=SnakeBody[i+1][0];
SnakeBody[i][1]=SnakeBody[i+1][1];
}
SnakeBody[SnakeLength-1][0]=SnakeBody[SnakeLength -1][0]+2;
}
break;
case 2:{
for(int i=0;i<SnakeLength-1;i++){
SnakeBody[i][0]=SnakeBody[i+1][0];
SnakeBody[i][1]=SnakeBody[i+1][1];
}
SnakeBody[SnakeLength-1][1]=SnakeBody[SnakeLength -1][1]+2;
}
break;
case 3:
{
for(int i=0;i<SnakeLength-1;i++){
SnakeBody[i][0]=SnakeBody[i+1][0];
SnakeBody[i][1]=SnakeBody[i+1][1];
}
SnakeBody[SnakeLength-1][0]=SnakeBody[SnakeLength -1][0]-2;
}
break;
}
}
for(byte i=0;i<StepTime;i++){
DisplaySnake();
LCD.printNumI(score,24,0,3,' ');
ClearSnake();
}
}
void JudgeEatSelf(){
for(int i;i<SnakeLength-1;i++){
if ( SnakeBody[SnakeLength-1][0]==SnakeBody[i][0]&&SnakeBody[SnakeLength-1][1]==SnakeBody[i][1]){
DisplayGameOver();
break;
}
}
if((SnakeBody[SnakeLength-1][0]<=0)||(SnakeBody[SnakeLength-1][0]>=X_MAX)||(SnakeBody[SnakeLength-1][1]<=6)||(SnakeBody[SnakeLength-1][1]>=Y_MAX))
{
DisplayGameOver();
}
}大家可以尝试一下,再重复一下 LCD 库可以找我私发,或者参照我上一篇文章,
成品展示:
大家还有啥不太理解的可以私信~
版权声明:本文为qq_55931917原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。