利用 arduino ~uno 以及Joystick Shield 拓展板开发贪吃蛇小游戏

  上一篇文章 我们介绍了 怎样使用 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版权协议,转载请附上原文出处链接和本声明。