【Proteus仿真】【Arduino单片机】星球大战游戏

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用IIC OLED、无源蜂鸣器、按键模块等。

主要功能:
系统运行后,OLED显示游戏界面,K1和K2控制上下,K3控制子弹发射。当游戏结束,按下K3键重新开始。


二、软件设计

/*
作者:嗨小易(QQ技术交流群:570487280)

*/


const unsigned char PROGMEM storm [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x00, 0x0C,
0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00,
0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00,
0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40,
0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xD7, 0xFF, 0xFF,
0xE1, 0x00, 0x01, 0xBF, 0xFC, 0x1F, 0xFA, 0x80, 0x01, 0xBF, 0xF1, 0xCF, 0xFA, 0x80, 0x01, 0x3F,
0xC2, 0x37, 0xF7, 0x80, 0x01, 0xEF, 0x9C, 0x01, 0xE7, 0xC0, 0x01, 0xE0, 0x70, 0x06, 0x06, 0x80,
0x01, 0xE0, 0xC0, 0x03, 0x06, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x00,
0x1D, 0xC0, 0x03, 0x70, 0x00, 0x80, 0x0C, 0x60, 0x05, 0xB0, 0x07, 0xF0, 0x08, 0x90, 0x09, 0x10,
0x1F, 0xF8, 0x09, 0xD0, 0x0B, 0x90, 0x1F, 0x7C, 0x03, 0xF0, 0x0F, 0xC0, 0xFC, 0x0F, 0x07, 0x90,
0x0D, 0x43, 0xC0, 0x03, 0x07, 0x90, 0x05, 0x64, 0x00, 0x00, 0xCF, 0x10, 0x07, 0xFC, 0x00, 0x00,
0x26, 0x10, 0x01, 0x80, 0x00, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x40, 0x01, 0x80,
0x07, 0xF0, 0x01, 0x80, 0x00, 0x80, 0x07, 0xC8, 0x00, 0x80, 0x00, 0x80, 0x0B, 0xE8, 0x00, 0x80,
0x00, 0x87, 0x97, 0xE9, 0xE0, 0x80, 0x00, 0x87, 0xDF, 0xEF, 0xA0, 0x80, 0x00, 0x4B, 0xFF, 0xFF,
0xA0, 0x80, 0x00, 0x6B, 0xDF, 0xFB, 0xA3, 0x00, 0x00, 0x24, 0x97, 0xE8, 0x24, 0x00, 0x00, 0x1E,
0x1F, 0xC0, 0x2C, 0x00, 0x00, 0x07, 0xF8, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00
};



void setup()   {                
 

 pinMode(3,INPUT_PULLUP);
 pinMode(12,INPUT_PULLUP);
 pinMode(11,INPUT_PULLUP);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  display.clearDisplay();
display.setTextSize(0);
   display.drawBitmap(6, 11,storm, 48,48, 1);
    display.setFont(&FreeSans9pt7b);
  display.setTextColor(WHITE);
    display.setCursor(65,14);
  display.println("xWing");
   display.setFont();
  display.setCursor(65,17);
  display.setTextSize(0);
  display.println("vs");
  display.setCursor(0,0);
  float voltaza=readVcc()/1000;
  display.println(voltaza);;
  display.setFont(&FreeSans9pt7b);
  display.setCursor(65,39);
  display.println("Death");
  display.setFont();
  display.setCursor(65,42);
  display.println("star ");
  display.setTextSize(0);
  
  display.setCursor(65,55);
 
  display.println("by Danko");
  
    display.setCursor(65,20);

   display.display();
}

void loop() {

  if(go==0){
  display.clearDisplay();

display.drawPixel(50,30,1);
display.drawPixel(30,17,1);
display.drawPixel(60,18,1);
display.drawPixel(55,16,1);
display.drawPixel(25,43,1);
 display.drawPixel(100,43,1); 
display.drawPixel(117,52,1);
display.drawPixel(14,49,1);
display.drawPixel(24,24,1);
display.drawPixel(78,36,1);
display.drawPixel(80,57,1);
display.drawPixel(107,11,1);
display.drawPixel(150,11,1);
display.drawPixel(5,5,1);
display.drawPixel(8,7,1);
display.drawPixel(70,12,1);
display.drawPixel(10,56,1);
display.drawPixel(70,25,1);


  
  if(poc==0){
  pocetno=millis();
  odabrano= random(400,1200);
  poc=1;
  }
 trenutno=millis();


//nivoi

if((trenutno-nivovrije)>50000)
{
  nivovrije=trenutno;
  nivo=nivo+1;

 brzina=brzina+1; //brizna neprijateljevog metka
 if ( nivo % 2 == 0 )
    {
       bkugle=bkugle+1;
       promjer=promjer-1;
    }
najmanja=najmanja-50;
najveca=najveca-50;

  }



 if((odabrano+pocetno)<trenutno)
  {
    poc=0;
   ispaljeno=ispaljeno+1;
   if(ispaljeno==1)
   {rx=95;
    ry=nep;}
     if(ispaljeno==2){
      rx2=95;
      ry2=nep;}
      if(ispaljeno==3)
      {
        rx3=95;
          ry3=nep;
      }
  
      
     if(ispaljeno==4){
      rx4=95;
      ry4=nep;
     
     }
     
    
      
   }

  
    if(ispaljeno>0)
    {
    display.drawCircle(rx,ry,2,1);
    rx=rx-brzina;}

    if(ispaljeno>1)
    {
    display.drawCircle(rx2,ry2,1,1);
    rx2=rx2-brzina;}

     if(ispaljeno>2)
    {
    display.drawCircle(rx3,ry3,4,1);
    rx3=rx3-brzina;}

     if(ispaljeno>3)
    {
    display.drawCircle(rx4,ry4,2,1);
    rx4=rx4-brzina;}

 if(digitalRead(12)==0 && poz>=2){
 poz=poz-2;}

  if(digitalRead(11)==0&& poz<=46){
 poz=poz+2;}
  

   if(digitalRead(3)==0 && postoji==0)
  {
    postoji=1;
    metx=6;
    mety=poz+8;
    tone(9,1200,20);
  
    
    }
   if(postoji==1)

    {
    metx=metx+8 ;
    
    display.drawLine(metx,mety,metx+4,mety,1);
    }
   
   display.drawBitmap(4, poz,dioda16, 16,16, 1);
   display.fillCircle(centar,nep,promjer,1);
   display.fillCircle(centar+2,nep+3,promjer/3,0);

 display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(33,57);
  display.println("score:");
    display.setCursor(68,57);
  display.println(bodovi);

   display.setCursor(33,0);
  display.println("lives:");
    display.setCursor(68,0);
  display.println(zivoti);
   
   display.setCursor(110,0);
  display.println("L:");

  display.setCursor(122,0);
  display.println(nivo);

  display.setCursor(108,57);
  display.println(trenutno/1000);
   display.display();

   if(metx>128)postoji=0;
  
 
  
   if(smjer==0){
   nep=nep+bkugle;}
   else
   {nep=nep-bkugle;}

   if(nep>=(64-promjer))
   smjer=1;
   if(nep<=promjer)
   smjer=0;

   if(mety>=nep-promjer && mety<=nep+promjer)
   if(metx>(centar-promjer)&&metx<(centar+promjer))
   {
   metx=-20;
   tone(9,500,20);
   bodovi=bodovi+1;
   postoji=0;
   }

int pozicija=poz+8;
     if(ry>=pozicija-8 && ry<=pozicija+8)
   if(rx<12&&rx>4)
   {
   rx=95;
   ry=-50;
   tone(9,100,100);
 zivoti=zivoti-1;
   }

        if(ry2>=pozicija-8 && ry2<=pozicija+8)
   if(rx2<12&&rx2>4)
   {
   rx2=-50;
   ry2=-50;
   tone(9,100,100);
 zivoti=zivoti-1;
   }

      if(ry3>=pozicija-8 && ry3<=pozicija+8)
   if(rx3<12&&rx3>4)
   {
   rx3=-50;
   ry3=-50;
   tone(9,100,100);
 zivoti=zivoti-1;
   }

      if(ry4>=pozicija-8 && ry4<=pozicija+8)
   if(rx4<12&&rx4>4)
   {
   rx4=200;
   ry4=-50;
   ispaljeno=0;
   tone(9,100,100);
 zivoti=zivoti-1;
   }
 
if(rx4<1){
   ispaljeno=0;
   rx4=200;}

   if(zivoti==0)
   go=1;
  }

  if(go==1)
  {
    if(zivoti==0){
     tone(9,200,300);
     delay(300);
      tone(9,250,200);
      delay(200);
       tone(9,300,300);
       delay(300);
       zivoti=5;
    }
   display.clearDisplay();
   display.setFont();  
 display.setTextSize(2);
  display.setTextColor(WHITE);
    display.setCursor(7,10);
  display.println("GAME OVER!");
   display.setTextSize(1);
  display.setCursor(7,30);
   display.println("score:");
    display.setCursor(44,30);
    display.println(bodovi);
    display.setCursor(7,40);
    display.println("level:");
     display.setCursor(44,40);
     display.println(nivo);
     display.setCursor(7,50);
     display.println("time(s):");
       display.setCursor(60,50);
       
       display.println(trenutno/1000);
  display.display();

    if(digitalRead(3)==0)
    {
       tone(9,280,300);
     delay(300);
      tone(9,250,200);
      delay(200);
       tone(9,370,300);
       delay(300);
      ponovo();
    }
    }
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619
【Proteus仿真】【Arduino单片机】星球大战游戏_第1张图片
【Proteus仿真】【Arduino单片机】星球大战游戏_第2张图片
【Proteus仿真】【Arduino单片机】星球大战游戏_第3张图片


联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(proteus,单片机,游戏,Arduino编程,星球大战游戏)