Arduino小游戏

jimoshalengzhou
发布于 2020-11-3 18:46
浏览
0收藏
#include"U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//设置设备名称:I2C-SSD1306-128*64(OLED)

#define UP 11//定义方向键上为Arduino引脚11号引脚
#define DOWN 10//定义方向键下为Arduino引脚10号引脚
#define LEFT 9//定义方向键上为Arduino引脚9号引脚
#define RIGHT 8//定义方向键上为Arduino引脚8号引脚
#define A 7//定义方向键上为Arduino引脚7号引脚
#define B 6//定义方向键上为Arduino引脚6号引脚
/***********************************************/
//初始化变量
//声明变量很多地方用了byte类型不用int类型,可以节约内存
byte wait=40;//延迟
int HP=20;//HP
byte PPX=4;//初始化玩家X位置
byte PPY=2;//初始化玩家Y位置
byte PX=0;//初始化玩家X轴坐标
byte PY=0;//初始化玩家Y轴坐标
int RT=1;//初始化运行周期
int S=0;//分数
byte OA;//障碍物
byte OB;//障碍物
byte OC;//障碍物
byte OD;//障碍物
int Atmp=0;//缓存A
int Btmp;//缓存B

//下面湿障碍物的数据,我们把障碍物数据保存在数组里,由运行内存显示,每隔20次运行周期会重新覆盖,保存内存不溢出
byte CA[50];//障碍物A的位置
byte CB[50];//障碍物B的位置
byte CC[50];//障碍物C的位置
byte CD[50];//障碍物D的位置

//下面湿障碍物A、B、C、D的坐标信息
byte CAX[50];//障碍物A_X轴
byte CBX[50];//障碍物B_X轴
byte CCX[50];//障碍物C_X轴
byte CDX[50];//障碍物D_X轴
byte CAY[50];//障碍物A_Y轴
byte CBY[50];//障碍物B_Y轴
byte CCY[50];//障碍物C_Y轴
byte CDY[50];//障碍物D_Y轴

//载入位图
const uint8_t title[] PROGMEM=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

const uint8_t QR[] PROGMEM=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

const uint8_t pause[] PROGMEM=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

const uint8_t plane[] PROGMEM=
{0x8,0xc,0x8c,0xff,0xff,0x8c,0xc,0x8};

const uint8_t BOA[] PROGMEM=
{0xcc,0xcc,0x33,0x33,0xcc,0xcc,0x33,0x33};

const uint8_t BOB[] PROGMEM=
{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

const uint8_t BOC[] PROGMEM=
{0x18,0x66,0x7e,0xbd,0xbd,0x7e,0x66,0x18};

const uint8_t BOD[] PROGMEM=
{0x0,0x7e,0x42,0x5a,0x5a,0x42,0x7e,0x0};

const uint8_t life[] PROGMEM=
{0x0,0x66,0xff,0xcf,0xdf,0x7e,0x3c,0x18};

/********************************************************/

void setup() {
  // put your setup code here, to run once:
  //初始化按钮
  pinMode(UP,INPUT);//定义方向键上的引脚状态
  pinMode(DOWN,INPUT);//定义方向键下的引脚状态
  pinMode(LEFT,INPUT);//定义方向键左的引脚状态
  pinMode(RIGHT,INPUT);//定义方向键右的引脚状态
  pinMode(A,INPUT);//定义A的引脚状态
  pinMode(B,INPUT);//定义B的引脚状态
  randomSeed(analogRead(A0));//伪随机数PIN
  u8g.firstPage();
  do
  {
    u8g.drawXBMP(0,0,128,64,title);
    }
    while(u8g.nextPage());
    delay(1024);
}
/**********************************************************/
void(* resetFunc)(void)=0;//制造从起命令的函数,下面会用到


void loop() {
  // put your main code here, to run repeatedly:
  //下面是GAME OVER或胜利后的处理
  if(HP<0||S>30000)
  {
    //循环检测按钮
    while(1)
    {
      //如果GAME OVER就等待按下A键复位游戏
      if(digitalRead(A)==HIGH)
      if(HP<0) resetFunc();//调用前面的软复位函数,达到软件重启Arduino的目的
      //如果检测到分数大于3万,就判断赢了游戏,放出二维码彩蛋
      if(S>=30000){
        while(1)
         {u8g.setColorIndex(1);
          u8g.firstPage();
          do
          {
            u8g.drawXBMP(40,8,56,49,QR);
            }
            while(u8g.nextPage());
         }
        }
      }
    }
    if(digitalRead(UP)==HIGH)
    {
      delay(10);
      if(digitalRead(UP)==HIGH)
      {
        if(PPY>1) PPY-=1;
        }
      }

      if(digitalRead(DOWN)==HIGH)
    {
      delay(10);
      if(digitalRead(DOWN)==HIGH)
      {
        if(PPY<4) PPY+=1;
        }
      }
      
    if(digitalRead(LEFT)==HIGH)
    {
      delay(10);
      if(digitalRead(LEFT)==HIGH)
      {
        if(PPX>1) PPX-=1;
        }
      }
          if(digitalRead(RIGHT)==HIGH)
    {
      delay(10);
      if(digitalRead(RIGHT)==HIGH)
      {
        if(PPX<15) PPX+=1;
        }
      }
        if(digitalRead(B)==HIGH)
    {
      delay(10);
      if(digitalRead(B)==HIGH)
      {
        delay(200);
        u8g.firstPage();
        do
        {
          draw();
          u8g.setColorIndex(0);
          u8g.drawBox(42,10,46,28);//先覆盖掉原屏幕,避免下面的图片变透明
          u8g.setColorIndex(1);
          u8g.drawXBMP(45,13,40,22,pause);
          }
          while(u8g.nextPage());
          while(1)
          {
            if(digitalRead(B)==HIGH)
            {
              delay(10);
              if(digitalRead(B)==HIGH)
              {
                delay(200);
                break;
                }
               }
            }
        }
      }
      /**************************************/
      //计算
      S+=1;
      PX=PPX*8;
      PY=PPY*8;
      OA=9;
      OB=9;
      OC=9;
      OD=9;
      if(RT<16)
      {
        Atmp=random(1,100);
        if(Atmp<=70)
        {
          OA=random(0,5);
          }
          //乌云

        Atmp=random(1,100);
        if(Atmp<=30)
        {
          OB=random(0,5);
          }

          //加油机
            Atmp=random(1,100);
        if(Atmp<=5)
        {
          OB=random(0,5);
          }
          
          //其他飞机
            Atmp=random(1,100);
        if(Atmp<=50)
        {
          OB=random(0,5);
          }   
        }

        if(HP>12)HP=12;
        //保存障碍物位置
        CAY[RT]=OA*8;
        CBY[RT]=OB*8;
        CCY[RT]=OC*8;
        CDY[RT]=OD*8;
        CA[RT]=OA;
        CB[RT]=OB;
        CC[RT]=OC;
        CD[RT]=OD;
        CAX[RT]=120;
        CBX[RT]=120;
        CCX[RT]=120;
        CDX[RT]=120;
        //判断伤害
        Btmp=15-PPX;
        if(RT>Btmp)
        {
          Atmp=RT-Btmp;
          if(PPY==CA[Atmp])
          {
            HP-=1;
            }
          

          if(PPY==CB[Atmp])
          {
            HP-=2;
            }

            if(PPY==CC[Atmp])
            {
              Atmp=random(1,3);
              HP+=Atmp;
              S+=30;
              }

              if(PPY==CD[Atmp])
              {
                Atmp=random(1,100);
                if(Atmp<50)
                {
                  HP+=1;
                  S+=15;
                  }
                  else
                  {
                    HP-=1;
                    }
                }
        }

        /*******************************华丽的分割线*******************/
        u8g.firstPage();
        do
        {
          draw();  
          }
          while(u8g.nextPage());
          //障碍物往下移
          Atmp=RT-16;
          if(Atmp<1)
          {
            Atmp=1;
            }
            for(Atmp;Atmp<=RT;Atmp++)
            {
              CAX[Atmp]-=8;//把障碍物的数组下移
              CBX[Atmp]-=8;
              CCX[Atmp]-=8;
              CDX[Atmp]-=8;
              }
              RT+=1;
              if(RT>=32)
              {
                RT=1;
                }
                delay(wait);//防止游戏运行到不能玩的级别
                   
}
void draw()
{
  //障碍物循环码初始化计算
  Atmp=RT-16;
  if(Atmp<1)
  {
    Atmp=1;
    }
    //障碍物显示
    for(Atmp;Atmp<=RT;Atmp++)
    {
      if(CCX[Atmp]>0)
      {
        u8g.drawBitmapP(CCX[Atmp],CCY[Atmp],1,8,BOC);
        
        }
      if(CDX[Atmp]>0)
      {
        u8g.drawBitmapP(CDX[Atmp],CDY[Atmp],1,8,BOD);
        }
         if(CAX[Atmp]>0)
      {
        u8g.drawBitmapP(CAX[Atmp],CAY[Atmp],1,8,BOA);
        }
          if(CBX[Atmp]>0)
      {
        u8g.drawBitmapP(CBX[Atmp],CBY[Atmp],1,8,BOB);
        }
      }

      //显示玩家
      u8g.drawBitmapP(PX,PY,1,8,plane);

      //生命及分数
      u8g.setFont(u8g_font_helvB08);

      if(HP>0)
      {
        u8g.setPrintPos(8,54);
        u8g.print("HP:");
        for(Atmp=1;Atmp<=HP;Atmp++)
        {
          Btmp=Atmp*8+20;
          u8g.drawBitmapP(Btmp,45,1,8,life);
          }
        }
      u8g.setPrintPos(8,62);
      u8g.print("score:");
      u8g.print(S);
      if(HP<0||S>=30000)
      {
        u8g.setColorIndex(255);
        u8g.drawBox(0,0,128,64);
        u8g.setFont(u8g_font_fub14);
        u8g.setColorIndex(0);
        u8g.setPrintPos(4,21);
        if(HP<0) u8g.print("GAME OVER");
        if(S>=30000) u8g.print("You Win");
        u8g.setFont(u8g_font_helvB08);
        u8g.setPrintPos(35,39);
        u8g.print("score:");
        if(HP<0) u8g.print(S);
        if(S>=30000) u8g.print(30000);
        u8g.setPrintPos(2,62);
        if(HP<0)
        u8g.print("please push A to RESET");
        if(S>=30000)
        u8g.print("A to QR code");
        
        }
  }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
  • 268.
  • 269.
  • 270.
  • 271.
  • 272.
  • 273.
  • 274.
  • 275.
  • 276.
  • 277.
  • 278.
  • 279.
  • 280.
  • 281.
  • 282.
  • 283.
  • 284.
  • 285.
  • 286.
  • 287.
  • 288.
  • 289.
  • 290.
  • 291.
  • 292.
  • 293.
  • 294.
  • 295.
  • 296.
  • 297.
  • 298.
  • 299.
  • 300.
  • 301.
  • 302.
  • 303.
  • 304.
  • 305.
  • 306.
  • 307.
  • 308.
  • 309.
  • 310.
  • 311.
  • 312.
  • 313.
  • 314.
  • 315.
  • 316.
  • 317.
  • 318.
  • 319.
  • 320.
  • 321.
  • 322.
  • 323.
  • 324.
  • 325.
  • 326.
  • 327.
  • 328.
  • 329.
  • 330.
  • 331.
  • 332.
  • 333.
  • 334.
  • 335.
  • 336.
  • 337.
  • 338.
  • 339.
  • 340.
  • 341.
  • 342.
  • 343.
  • 344.
  • 345.
  • 346.
  • 347.
  • 348.
  • 349.
  • 350.
  • 351.
  • 352.
  • 353.
  • 354.
  • 355.
  • 356.
  • 357.
  • 358.
  • 359.
  • 360.
  • 361.
  • 362.
  • 363.
  • 364.
  • 365.
  • 366.
  • 367.
  • 368.
  • 369.
  • 370.
  • 371.
  • 372.
  • 373.
  • 374.

程序要使用到u8glib图形库

 

接下来是效果展示:

Arduino小游戏-鸿蒙开发者社区

Arduino小游戏-鸿蒙开发者社区

分类
标签
已于2020-11-3 18:46:59修改
收藏
回复
举报


回复
    相关推荐