用LCD 1602做的一个小游戏,70,80后应该玩过-Arduino中文社区 - Powered by Discuz! Archiver

wu17127 发表于 2020-5-4 10:24

用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="";
    }

}

3030257ybs 发表于 2022-1-13 20:10

接线图有吗
谢谢
页: [1]
查看完整版本: 用LCD 1602做的一个小游戏,70,80后应该玩过