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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4356|回复: 1

用LCD 1602做的一个小游戏,70,80后应该玩过

[复制链接]
发表于 2020-5-4 10:24 | 显示全部楼层 |阅读模式
//新手玩家, 无聊宅在家里做的一个lcd小游戏,  使用 LCD1602 I2C 显示,mini红外遥控器控制,按CH-开始, +,-移动  

微信图片_20200503220845.jpg
#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="";
    }

  }

发表于 2022-1-13 20:10 | 显示全部楼层
接线图有吗
谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:30 , Processed in 0.079122 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表