【Arduion】利用OLED屏制作简单躲避小游戏,趣味满满

集教程我们带大家用OLED屏幕做一个简单易上手的躲避小游戏,屏幕可以完整的显示游戏进程及相关信息,可爱有趣并且易上手操作。

本次完成的内容需要的材料:

Arduino UNO    x   1
Button               x   1
OLED                x   1
杜邦线若干

线路图:

/*

  游戏简介:一条命有三格血接触一次扣一个血,可以在右上角实时查看到自己的血量。中间是难度等级

  游戏难度会随着字母的出现逐渐增加。  最左边是游戏得分。



  游戏操作:按下按钮,画面最左下角的字母会向上跳起来(按下一次之后必须等待落地才能按第二下)

  如果该字母没有接触到移动过来的字母就判定为赢,得分会自动加一分。接触到移动的字母就会扣血,

  当血量降低为0时游戏画面会出现OVER,再次点击按钮可以重新开始。



*/

#include<Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#define OLED_RESET 13

Adafruit_SSD1306 display(OLED_RESET);

const int buttonPin = 8;     // the number of the pushbutton pin

//移动字母的数量

#define leter_NUM 26

// variables will change:

int buttonState = 0;         // variable for reading the pushbutton status



//移动的字母,可随意更改,增加或减少需要更改字母的数量

char leter[leter_NUM] ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

//生命值

char life[3] = "***";

void setup()   {

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // initialize with the I2C addr 0x3C (for the 128x64)

    pinMode(buttonPin, INPUT);                 //BUTTON initialize

  display.clearDisplay();                      // Make sure the display is cleared

  display.setTextColor(WHITE);

  display.display();                           // Update the display

}



int x1=0,y1=25,x2=122,y2=25;//初始化字母生成位置

/*

flag:代表移动哪个字母,

flag_data:一次移动多少位置

flag1:记录已经移动了几个字母

life_data:生命值显示的数量

rank:难度

*/

int flag = 0,flag_data = 3,flag1,life_data = 3,rank = 1;

int button_flag = 1;//这个状态为1的时候按键按下才能向上移动

/*

grade:成绩

grade_flag:为1时代表没有发生碰撞。如果为0表示已经发生碰撞

*/

int grade,grade_flag = 1;

void loop() {

//获取按钮状态

buttonState = digitalRead(buttonPin);

//设置移动的最大值和最小值

if(y1 >25)y1 = 25;

if(y1 <10)y1 = 10;

//生成界面

display.setTextSize(1);

display.setCursor(x2,y2);

display.print(leter[flag]);



display.setCursor(x1,y1);

display.print(leter[0]);



display.setCursor(80,0);

display.print("life:");



//生命值的显示

for(int i = 0;i<life_data;i++)

{

display.print(life[i]);

}



display.setCursor(0,0);

display.print("score:");

display.print(grade);



display.setCursor(60,0);

display.print(rank);

//为了让按钮不能长按做的一个判断

if(y1 <25)

{

  button_flag = 0;

}

else

{

  button_flag = 1;

}

//只有Y1=25这个值才能生效

if(button_flag)

{

if(buttonState == LOW )

{

  y1-=15;//每次移动的方式

  button_flag = 0;//按下一次之后就会清0。等待唤醒

}

}

else

{

  y1++;  //按钮没置一时会一直向下落 

}



//当生命值为0的时候

while(life_data <= 0)

{

  //画面显示内容

    display.clearDisplay();

    display.setTextSize(2);

    display.setCursor(30,12);

    display.print("OVER");

    display.display();

    //按键唤醒

    buttonState = digitalRead(buttonPin);

    if(buttonState == LOW )

    {

      x1=0;y1=25;x2=122;y2=25;//25-18

      flag = 0;flag_data = 4;flag1 = 0;life_data = 3;

      button_flag = 1;rank = 1;

      grade = 0;grade_flag = 1;

      break;

    }

}

//扣血的条件

if((y2-y1) < 7 &&(x2 - x1) < 3)

{

  life_data--;

 // grade--;

 grade_flag = 0;

}

//移动字母每次移动的距离  

x2-=flag_data;

//字母从最左端移动到最右端时进行的处理

if(x2 < 0 )

{

  //显示的字母

   flag++;

   //是否加血的标志位

   if(grade_flag)

   grade++;

   //默认是加血的

   grade_flag = 1;

   //字母最大显示的数量,当相等时会清零

   if(flag == leter_NUM)

   {

    flag = 0;

    }

    //一共移动了几个字母

   flag1++;

   x2 = 122;

 //  y1 = 25;

 //移动字母数量大于5时难度会加1,速度会增加1

   if(flag1 > 5)

   {

    flag_data +=1;

    rank++;

    flag1 = 0;

    }

  }

  //显示

  display.display();

  display.clearDisplay();

}

所需代码:

 

跳至工具栏