【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();
}