//新手玩家, 无聊宅在家里做的一个lcd小游戏, 使用 LCD1602 I2C 显示,mini红外遥控器控制,按CH-开始, +,-移动
#include <Wire.h>
#include "IRremote.h"
#include <LiquidCrystal_I2C.h>
int now_line; //飞机的位置状态
int date[2][16];
int i,j;
int k=0; //控制飞机间隔,至少有一个间隔;
int newstone;// 产生新飞机
String line=""; //缓存的字符串
int score_total; //分数,避开一个飞机100分;
unsigned long current_time;
unsigned long last_time;
unsigned long interval_time=1000;
LiquidCrystal_I2C lcd(0x27,16,2); //定义一个lcd对象
const int re=6; //红外数据与arduino接口
IRrecv irrecv(re);
decode_results results; //定义一个红外接收的储存数据结果的对象
void setup() {
irrecv.enableIRIn(); //初始化红外传感器
Serial.begin(9600);
lcd.init(); // 初始化红外传感器lcd
lcd.backlight();
}
void loop() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" LCD GAME ");
lcd.setCursor(0,1);
lcd.print(" CH- -> Play ");
if (irrecv.decode(&results)) //
{ Serial.println(results.value,HEX);
if (results.value==0xFFA25D) //红外控制器按下CH-,游戏开始
{ irrecv.resume();
game_begin();
}
}
delay(1000);
}
void game_begin() { //游戏开始
for(i=0;i<2;i++){ //初始化数组
for(j=0;j<16;j++) {
date[j]=0;
}
}
date[0][0]=1; //设置玩家飞机的位置;
now_line=1;
score_total=0;
last_time=millis(); //存储当前时间,用于多任务处理
while(1) { //不断循环,直到游戏结束
if (irrecv.decode(&results)){ // 将接收的结果存储在results对象中
if (results.value==0xFFE01F) // 判断红外控制器的信号,根据信号改变飞机的位置,-上移,+下移
{ date[0][0]=1; date[1][0]=0; now_line=1; }
else if (results.value==0xFFA857)
{ date[0][0]=0; date[1][0]=1; now_line=2; }
Serial.println(results.value,HEX);//
irrecv.resume();
shuaxin();
}
current_time=millis(); //多任务处理, 效果是让玩家的飞机可以随时改变位置,而落下的飞机每隔一秒更新一次
if (current_time - last_time >= interval_time){ //如果间隔的时间多于interval_time,则更新飞机
last_time=current_time;
scroll_date(); //让数组向左移动一位,模拟飞机落下一个格子
if(k==0){ //用k控制,每隔一个间隔,随机产生一个飞机
newstone=random(0,3) ; //产生一个随机数
switch (newstone){ //根据随机数增加飞机
case 2:date[1][15]=1;date[0][15]=0;
break;
case 1:date[1][15]=0;date[0][15]=1;
break;
case 0:date[0][15]=0;date[1][15]=0;
break;
default: break;
}
k++;
}
else {
date[0][15]=0;date[1][15]=0; //间隔一个空白位置,从而有空隙避开
k=0;
}
if((now_line==1&&date[0][0]==1)||(now_line==2&&date[1][0]==1)) { //飞机触及,游戏结束
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Game Over ");
lcd.setCursor(0,1);
lcd.print("Score:");
lcd.print(score_total,DEC);
delay(5000);
return;
}
else if(date[0][0]==1||date[1][0]==1) {
score_total=score_total+100;
}
switch(now_line){ //经上面的数组循环左移一位后,根据now_line,如果没有飞机碰撞,保留玩家飞机的位置
case 1: date[0][0]=1; break;
case 2: date[1][0]=1; break;
default:break;
}
shuaxin(); // 根据最新数组,刷新屏幕
}
}
}
void scroll_date(){ //更新数据,每个数据向前推一个位置
for(i=0;i<2;i++){
for(j=0;j<15;j++) {
date[j]=date[j+1];
}
}
}
void shuaxin() { //按数组数据,刷新屏幕
lcd.clear();
for(i=0;i<2;i++){
for(j=0;j<16;j++) {
if(date[j]==0){
line +=" ";}
else {line +="E";}
}
lcd.setCursor(0,i);
lcd.print(line);
line="";
}
}
|