用LCD 1602做的一个小游戏,70,80后应该玩过
//新手玩家, 无聊宅在家里做的一个lcd小游戏,使用 LCD1602 I2C 显示,mini红外遥控器控制,按CH-开始, +,-移动#include <Wire.h>
#include "IRremote.h"
#include <LiquidCrystal_I2C.h>
int now_line;//飞机的位置状态
int date;
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(" LCDGAME ");
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);
}
voidgame_begin(){//游戏开始
for(i=0;i<2;i++){ //初始化数组
for(j=0;j<16;j++) {
date=0;
}
}
date=1; //设置玩家飞机的位置;
now_line=1;
score_total=0;
last_time=millis(); //存储当前时间,用于多任务处理
while(1) {//不断循环,直到游戏结束
if (irrecv.decode(&results)){// 将接收的结果存储在results对象中
if (results.value==0xFFE01F) // 判断红外控制器的信号,根据信号改变飞机的位置,-上移,+下移
{ date=1;date=0;now_line=1;}
else if (results.value==0xFFA857)
{ date=0;date=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;date=0;
break;
case 1:date=0;date=1;
break;
case 0:date=0;date=0;
break;
default: break;
}
k++;
}
else {
date=0;date=0; //间隔一个空白位置,从而有空隙避开
k=0;
}
if((now_line==1&&date==1)||(now_line==2&&date==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==1||date==1) {
score_total=score_total+100;
}
switch(now_line){ //经上面的数组循环左移一位后,根据now_line,如果没有飞机碰撞,保留玩家飞机的位置
case 1: date=1; break;
case 2: date=1; break;
default:break;
}
shuaxin(); // 根据最新数组,刷新屏幕
}
}
}
void scroll_date(){ //更新数据,每个数据向前推一个位置
for(i=0;i<2;i++){
for(j=0;j<15;j++) {
date=date;
}
}
}
void shuaxin() {//按数组数据,刷新屏幕
lcd.clear();
for(i=0;i<2;i++){
for(j=0;j<16;j++) {
if(date==0){
line +=" ";}
else {line +="E";}
}
lcd.setCursor(0,i);
lcd.print(line);
line="";
}
}
接线图有吗
谢谢
页:
[1]