亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

UFO 攻击!

组件和用品

Arduino UNO
× 1
MAX7219 点阵模组四合一显示
× 1
公插头螺丝螺母连接器 DB9-G1-01 9 针端子分线板
× 1
通用晶体管 NPN
× 1
面包板(通用)
× 1
Adafruit 被动压电蜂鸣器
× 1
公/母跳线
× 5
跳线(通用)
× 10
电阻 1k ohm
× 1
Atari 兼容操纵杆 9Pin
× 1

关于这个项目

我使用 Arduino UNO 构建了这个游戏,这是一组“4 合 1”的 MAXX7219 矩阵和来自 Arduino 入门套件的组件。

代码由我编写,使用了 Max72xxPanel、Adafruit GFX 和 SPI 库。

试一试,炸掉一些不明飞行物! :-)

每个级别都有目标数量的不明飞行物在老板出现之前杀死。

游戏需要兼容 Atari 的 9 针操纵杆。所以如果你有一个旧的,你可以把它放回去使用。或者你可以自己制作。我正在努力在未来的版本中将其变成手持设备。

代码

  • UFO 攻击代码
UFO 攻击代码C/C++
/*UFO 攻击! - 由安东尼克拉克撰写。 *///*一些特定的代码行是从开源示例程序中提取的。这些标记在注释中。*/#include #include #include const int pinCS =10; // 将 CS 连接到此引脚,将 DIN 连接到 MOSI,将 CLK 连接到 SCK(参见 http://arduino.cc/en/Reference/SPI)const int numberOfHorizo​​ntalDisplays =4;const int numberOfVerticalDisplays =1;Max72xxPanel matrix =Max72xxPanel(pinCS, numberOfHorizo​​ ntalDisplays, numberOfVerticalDisplays);// 'ship', 8x8pxconst unsigned char ship [] PROGMEM ={ 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// 'UFOx', 8x8pxconst unsigned char ship [] PROGMEM ={ ={ 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// 'explosion', 8x8pxconst unsigned char 爆炸[] PROGMEM ={ 0xe0, 0xe0, 0xe0,0,0x0,0x0,0x0,0x0,0x0,0x0;// 'Bouncer', 8x8pxconst unsigned char Bouncer [] PROGMEM ={ 0x60, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00};// 'Boss1', 8x8pxconst PRO unsigned char boss, {0x60, 0xc0, 0x60, 0x00, 0x24, 0x42, 0xff, 0x24, 0xff, 0x7e, 0x3c};// 'Faller', 8x8pxconst unsigned char faller [] PROGMEM ={ 0x80, 0xc0, 0xe0, 0x00, 0x00, 0x00;// Riser', 8x8pxconst unsigned charriser [] PROGMEM ={ 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00};// 'LT', 8x8pxconst unsigned char LT [] PROGMEM ={ 0x78, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00};// pxconst 'UFO 无符号激光[] PROGMEM ={ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// 'BossBoom', 8x8pxconst unsigned char bossBoom1 [] PROGMEM ={ 0xaa, 0x5a,0x5a,0x5a,0x5a,0x00} , 0x55};// 'BossBoom2', 8x8pxconst unsigned char bossBoom2 [] PROGMEM ={ 0x55, 0xaa, 0x45, 0x8a, 0x51, 0xa2, 0x55, 0xaa};//游戏开始变量bool gameStart =false pinint up =2;int down =3;int left =4;int right =5;int trigger =6;//标题代码变量..从代码示例中无耻地窃取:PString tape ="UFO ATTACK! - 按火启动";int wait =40; //以毫秒为单位int separator =1;int width =5 + separator; //字体宽度为5像素//船和激光位置变量int shipx =0;int shipy =0;int lasx;int lasy;//Lives counterint living =5;//laserexistense variablebool lasExist;//UFO激光位置变量int ufoLas1x;int ufoLas1y;int ufoLas2x;int ufoLas2y;int ufoLas3x;int ufoLas3y;int ufoLas3y;int ufoLas3y;int;//UFO 激光存在变量bool ufoLasExist1 =false;bool ufoLasExist2 =false;bool ufoLasExist3 =false;bool ufoLasExist4 =false;//UFO 激光选择变量int selection;int lastSelection;//Boss Minion 选择变量int minionSelection;//UFO 位置变量int ufo1x;int ufo1y;int ufo2x;int ufo2y;int ufo3x;int ufo3y;//保镖位置变量intbouncer1x;intbouncer1y;intbouncer2x;intbouncer2y;intbouncer3x;intbouncer3y;intbouncer4x;intbouncer4y;//intFall坠落者1x;int faller1y;int faller2x;int faller2y;int faller3x;int faller3y;int faller4x;i nt faller4y;//下降速度变量int faller1Speedx;int faller1Speedy;int faller2Speedx;int faller2Speedy;int faller3Speedx;int faller3Speedy;int faller4Speedx;int faller4Speedy;int fallerxSpeedTarget =2;int fallerySpeedTarget =2;//Riser 位置变量intriser1x;intriser2x;intriser2y;intriser3x;intriser3y;intriser4x;intriser4y;//Riser速度变量intrisr1Speedx;intriser1Speedy;intriser2Speedx;intriser2Speedy;intriser3Speedx;intriser3Speedy;intriser4Speedx;//RiserLT4 position variableint ltx;int lty;//LT健康变量int ltHealth =3;//LT速度变量int ltxSpeed =0;int ltxSpeedTarget =2;//Boss位置变量int bossx =34;int bossy =0;//Boss移动速度变量int bossxSpeed =0;int bossySpeed =0;int bossxSpeedTarget =3;int bossySpeedTarget =1; //UFO存在变量bool ufo1Exist =false;bool ufo2Exist =false;bool ufo3Exist =false;//Bouncer存在变量boolbouncer1Exist =false;boolbouncer2Exist =false;boolbouncer3Exist =false;boolbouncer4Exist =false;//Faller存在变量bool faller1Exist false;bool faller2Exist =false;bool faller3Exist =false;bool faller4Exist =false;//Riser 存在变量bool Riser1Exist =false;bool Riser2Exist =false;bool Riser3Exist =false;bool Riser4Exist =false;//LT 存在变量bool ltExist =false; //Boss1 存在变量bool boss1Exist =false;//Boss health variableint bossHealth;//Bouncer 顶部或底部variableint BouncerOrigin;//Bouncer 间隙空间变量intbouncerGap =6;//Bouncer 方向变量boolbouncer1Direction;boolbouncer2Direction;boolbouncer3Direction;boolbouncer4Direction;intbouncer1xSpeed;intbouncer2xSpeed;intbouncer3xSpeed;intbouncer4xSpeed;intbouncer1ySpeed;intbouncer2ySpeed;intbouncer3ySpeed;intbouncer4ySpeed;int ySpee d =1;int xSpeed =2;//UFO 敌人的生成计时器和生成时间变量unsigned long startTime;//设置计时器变量unsigned long currentTime;unsigned long spawnTime =3000; //不明飞行物的生成计时器//保镖敌人的生成计时器和生成时间unsigned long startTime2;unsigned long currentTime2;unsigned long spawnTime2 =10000; //保镖的生成计时器//LT迷你老板的生成计时器unsigned long startTime3;unsigned long currentTime3;unsigned long spawnTime3; //LT的Spawn timers//UFO激光的spawn timer unsigned long bossStartTime;unsigned long bossCurrentTime;unsigned long bossStartTime2;unsigned long bossCurrentTime2;unsigned long bossLaserTimer =1000;unsigned long bossMinionTimer =6000;//Spawn enabler变量,需要暂时停止spawning for boss Battlebool spawnEnabled;//Level variableint levelNumber =1;//Score variableint score =0;//等级进度 variablesint kills;int killsTarget;//boss 战斗进行 variablebool bossBattleStarted =false;//玩家船碰撞检测变量bool碰撞检测=true;//硬币翻转为UFOLaser 4 selectionint coinFlip;//声音变量int buzzerPin =9;//老板警报器变量float sinVal; // 定义一个变量来保存正弦值 inttoneVal; // 定义一个变量来保存声音频率 void setup() { //Serial.begin(9600); //设置声音引脚 pinMode(buzzerPin, OUTPUT); // 将蜂鸣器引脚设置为输出模式 //设置 spawntimers // 为操纵杆操作设置引脚模式 pinMode(up, INPUT_PULLUP); //UP pin pinMode(down, INPUT_PULLUP); //DOWN pin pinMode(left, INPUT_PULLUP); //左引脚pinMode(右,INPUT_PULLUP); //右引脚pinMode(触发器,INPUT_PULLUP); //FIRE pin //设置led强度 matrix.setIntensity(0);// 根据自己的需要调整 matrix.setPosition(0, 3, 0); // 第一个显示在 <0, 0> matrix.setPosition(1, 2, 0); // 第二个显示在 <1, 0> matrix.setPosition(2, 1, 0); // 第三个显示在 <2, 0> matrix.setPosition(3, 0, 0); // 最后显示在 <3, 0> // ... matrix.setRotation(0, 3); // 第一个显示位置倒置 matrix.setRotation(1, 3);矩阵.setRotation(2, 3);矩阵.setRotation(3, 3); // 对最后一次显示同样保持 matrix.fillScreen(LOW);}void loop() { if (gameStart ==false) { Ticker(true);产卵定时器();操纵杆控制();飞碟控制();弹跳控制();激光控制();屏幕限制(); BossBattle();老板控制(); UFOLaserControl(); LTControl(); FallerControl();立管控制();船舶碰撞(); //Serial.println(ufoLas1x); matrix.write();//绘制屏幕 delay(50);//speed delay matrix.fillScreen(LOW);//清屏,必须每一帧都做。 }void Level(int level){ if (level ==1) { spawnEnabled =true; //启用产卵 spawnTime =3000; // UFO'a spawnTime2 =10000000 的生成计时器; //保镖的生成计时器设置得太高,它们永远不会出现 spawnTime3 =10000000; // LT 的生成计时器设置得如此之高,因此它们永远不会出现 killsTarget =10; //设置击杀目标。当目标到达boss时应生成bossHealth =10; bossLaserTimer =1000; } if (level ==2) { spawnEnabled =true;产卵时间 =3000;产卵时间2 =8000; spawnTime3 =10000000;杀死目标 =20;老板健康 =15; bossLaserTimer =900; } if (level ==3) { spawnEnabled =true;产卵时间 =2000;产卵时间2 =6000; spawnTime3 =8000;杀死目标 =30;老板健康 =20; bossLaserTimer =800; } if (level ==4) { spawnEnabled =true;产卵时间 =2000; spawnTime2 =5000; spawnTime3 =7000;杀死目标 =40;老板健康 =25; bossLaserTimer =700; bossMinionTimer =6000; } if (level ==5) { spawnEnabled =true;产卵时间 =1800; spawnTime2 =4500; spawnTime3 =6000;杀死目标 =50;老板健康 =30; bossLaserTimer =600; bossMinionTimer =5500; } if (level ==6) { spawnEnabled =true;产卵时间 =2000; spawnTime2 =5000; spawnTime3 =7000;杀死目标 =60;老板健康 =35; bossLaserTimer =500; bossMinionTimer =5000; } if (level ==7) { spawnEnabled =true;产卵时间 =2000; spawnTime2 =5000; spawnTime3 =7000;杀死目标 =70;老板健康 =40; bossLaserTimer =400; bossMinionTimer =4000; } if (level ==8) { spawnEnabled =true;产卵时间 =2000; spawnTime2 =5000; spawnTime3 =7000;杀死目标 =80;老板健康 =45; bossLaserTimer =300; bossMinionTimer =3000; } if (level ==9) { spawnEnabled =true;产卵时间 =2000; spawnTime2 =5000; spawnTime3 =7000;杀死目标 =90;老板健康 =50; bossLaserTimer =200; bossMinionTimer =2000; } if (level ==10) { spawnEnabled =true;产卵时间 =2000; spawnTime2 =5000; spawnTime3 =7000;杀死目标 =100;老板健康 =55; bossLaserTimer =100; bossMinionTimer =1000; } //需要添加祝贺信息以通过第 10 级}void Ticker(bool resetKills) //从 Ticker 示例中无耻地窃取的 Ticker 代码。用于标题和得分和游戏结束{ while (gameStart ==false) { for ( int i =0; i =0 &&letter>=0 ) { if ( letter  29) { shipx =29; } if (shipy <0) { shipy =0; } if (shipy> 6) { shipy =6; } if (lasExist ==true) //当它离开屏幕时停止绘制并将其标记为不存在 { if (lasx> 31) { lasExist=false; } if (lasy <0) { lasy =0; } if (lasy> 7) { lasy =7; } } //UFO激光屏幕限制控制 if (ufoLas1x <-2) { ufoLasExist1 =false; } if (ufoLas2x <-2) { ufoLasExist2 =false; } if (ufoLas3x <-2) { ufoLasExist3 =false; } if (ufoLas4x <-2) { ufoLasExist4 =false; } //UFO 屏幕限制控件。如果 UFO 离开左侧,则在右侧的随机 Y 坐标处自动重生 UFO if (ufo1Exist ==true &&ufo1x <-3) { ufo1x =33; //如果UFO离开左侧,它会再次移动到右侧 ufo1y =random(0,7); // 需要某种排序代码来阻止 ufo 的重叠 } if (ufo2Exist ==true &&ufo2x <-3) { ufo2x =33; //如果 UFO 从左侧消失,它会再次移到右侧 ufo2y =random(0,7); // 需要某种排序代码来阻止 ufo 的重叠 } if (ufo3Exist ==true &&ufo3x <-3) { ufo3x =33; //如果 UFO 从左侧消失,它会再次移到右侧 ufo3y =random(0,7); // 需要某种排序代码来阻止 ufo 的重叠 } //Bouncer 屏幕限制控件。当保镖击中顶部或底部时,方向变量会发生变化。当离开左侧时,它们会从存在中消失并在稍后重生。如果(bouncer1Exist ==true &&bouncer1y> 5){bouncer1Direction =false; } else if (bouncer1Exist ==true &&bouncer1y <0) {ouncer1Direction =true; } if (bouncer2Exist ==true &&bouncer2y> 5) {ouncer2Direction =false; } else if (bouncer2Exist ==true &&bouncer2y <0) {ouncer2Direction =true; } if (bouncer3Exist ==true &&bouncer3y> 5) {ouncer3Direction =false; } else if (bouncer3Exist ==true &&bouncer3y <0) {ouncer3Direction =true; } if (bouncer4Exist ==true &&bouncer4y> 5) {ouncer4Direction =false; } else if (bouncer4Exist ==true &&bouncer4y <0) {ouncer4Direction =true; } // 如果保镖离开左侧,它们会随着消失而消失 if (bouncer1x <0) {ouncer1Exist =false; } if (bouncer2x <0) {ouncer2Exist =false; } if (bouncer3x <0) {ouncer3Exist =false; } if (bouncer4x <0) {ouncer4Exist =false; } //LT 屏幕限制控制 if (ltExist ==true &<x <-6) { ltx =33; //如果 LT 离开左侧,它会再次移到右侧 lty =random(0,6); } //Riser 的屏幕限制控制 if (faller1Exist ==true &&faller1y> 7) { faller1Exist =false; } if (faller2Exist ==true &&faller2y> 7) { faller2Exist =false; } if (faller3Exist ==true &&faller3y> 7) { faller3Exist =false; } if (faller4Exist ==true &&faller4y> 7) { faller4Exist =false; } //Screen limit controls for Risers if (riser1Exist ==true &&riser1y <-2) { riser1Exist =false; } if (riser2Exist ==true &&riser2y <-2) { riser2Exist =false; } if (riser3Exist ==true &&riser3y <-2) { riser3Exist =false; } if (riser4Exist ==true &&riser4y <-2) { riser4Exist =false; } }void SpawnTimer(){ if (spawnEnabled ==true) { //Counting spawn timer currentTime =millis(); //get the current time in milliseconds currentTime2 =millis();//same again for second timer currentTime3 =millis();//and again if (currentTime - startTime>=spawnTime) //Uses the currentTime, startTime and spawnTime variables to spawn enemies on set times { //spawn UFO SpawnUFO(); //reset timer startTime =currentTime; //Saves the start time of the spawn so the if statement works } if (currentTime2 - startTime2>=spawnTime2) { //spawn bouncer squad SpawnBouncer(); //reset timer startTime2 =currentTime2; //Saves the start time of the spawn so the if statement works } if (currentTime3 - startTime3>=spawnTime3) { //spawn LT SpawnLT(); //reset timer startTime3 =currentTime3; //Saves the start time of the spawn so the if statement works } } }void SpawnUFO(){ if (ufo1Exist ==false) { ufo1x =32; //Spawn off the right side of the screen ufo1y =random(0,7); //Spawn at a random Y coord ufo1Exist =true; } else if (ufo2Exist ==false) { ufo2x =32; //Spawn off the right side of the screen ufo2y =random(0,7); //Spawn at a random Y coord ufo2Exist =true; } else if (ufo3Exist ==false) { ufo3x =32; //Spawn off the right side of the screen ufo3y =random(0,7); //Spawn at a random Y coord ufo3Exist =true; } }void UfoControl(){ //If the UFO exists then draw its bitmap if (ufo1Exist ==true) { ufo1x--; matrix.drawBitmap(ufo1x,ufo1y,ufo,3,2,1); } if (ufo2Exist ==true) { ufo2x--; matrix.drawBitmap(ufo2x,ufo2y,ufo,3,2,1); } if (ufo3Exist ==true) { ufo3x--; matrix.drawBitmap(ufo3x,ufo3y,ufo,3,2,1); }}void SpawnBouncer(){ if (bouncer1Exist ==false &&bouncer2Exist ==false &&bouncer3Exist ==false &&bouncer4Exist ==false) { bouncer1x =32; //Spawn off the right side of the screen bouncer2x =bouncer1x+bouncerGap;//spawn other bouncers spaced out on the x axis bouncer3x =bouncer2x+bouncerGap; bouncer4x =bouncer3x+bouncerGap; bouncerOrigin =random(0,2); if (bouncerOrigin =0) { bouncer1y =0; //Spawn at top of screen bouncer2y =1; bouncer3y =2; bouncer4y =3; } if (bouncerOrigin =1) { bouncer1y =7; //Spawn at bottom bouncer2y =6; bouncer3y =5; bouncer4y =4; } bouncer1Exist =true; bouncer2Exist =true; bouncer3Exist =true; bouncer4Exist =true; }}void BouncerControl(){ //Bouncer move across to the left and up or down depending opn direction variable. That variable is changed in ScreenLimit() if (bouncer1Exist ==true) //If bouncer exists then increment bouncer x and y counters. These are used to slow the movement. { bouncer1xSpeed++; bouncer1ySpeed++; if (bouncer1xSpeed> xSpeed) //When the counter goes above the speed value then IF statement executes { bouncer1x--; bouncer1xSpeed =0; } if (bouncer1Direction ==true) { if (bouncer1ySpeed> ySpeed) { bouncer1y++; bouncer1ySpeed =0; } } else if (bouncer1Direction ==false) { if (bouncer1ySpeed> ySpeed) { bouncer1y--; bouncer1ySpeed =0; } } matrix.drawBitmap(bouncer1x,bouncer1y,bouncer,2,3,1); } if (bouncer2Exist ==true) { bouncer2xSpeed++; bouncer2ySpeed++; if (bouncer2xSpeed> xSpeed) { bouncer2x--; bouncer2xSpeed =0; } if (bouncer2Direction ==true) { if (bouncer2ySpeed> ySpeed) { bouncer2y++; bouncer2ySpeed =0; } } else if (bouncer2Direction ==false) { if (bouncer2ySpeed> 2) { bouncer2y--; bouncer2ySpeed =0; } } matrix.drawBitmap(bouncer2x,bouncer2y,bouncer,2,3,1); } if (bouncer3Exist ==true) { bouncer3xSpeed++; bouncer3ySpeed++; if (bouncer3xSpeed> xSpeed) { bouncer3x--; bouncer3xSpeed =0; } if (bouncer3Direction ==true) { if (bouncer3ySpeed> ySpeed) { bouncer3y++; bouncer3ySpeed =0; } } else if (bouncer3Direction ==false) { if (bouncer3ySpeed> 2) { bouncer3y--; bouncer3ySpeed =0; } } matrix.drawBitmap(bouncer3x,bouncer3y,bouncer,2,3,1); } if (bouncer4Exist ==true) { bouncer4xSpeed++; bouncer4ySpeed++; if (bouncer4xSpeed> xSpeed) { bouncer4x--; bouncer4xSpeed =0; } if (bouncer4Direction ==true) { if (bouncer4ySpeed> 2) { bouncer4y++; bouncer4ySpeed =0; } } else if (bouncer4Direction ==false) { if (bouncer4ySpeed> ySpeed) { bouncer4y--; bouncer4ySpeed =0; } } matrix.drawBitmap(bouncer4x,bouncer4y,bouncer,2,3,1); }}void SpawnFaller(){ if (faller1Exist ==false &&faller2Exist ==false &&faller3Exist ==false &&faller4Exist ==false) { faller1x =15; //Spawn above the boss off the top of the screen faller2x =faller1x+bouncerGap;//spawn other bouncers spaced out on the x axis faller3x =faller2x+bouncerGap; faller4x =faller3x+bouncerGap; faller1y =-1; //Spawn at top of screen faller2y =-2; faller3y =-3; faller4y =-4; faller1Exist =true; faller2Exist =true; faller3Exist =true; faller4Exist =true; }}void FallerControl(){ //Fallers are spawned by the Boss during battle after level 4. Timer for spawning is in the BossControl function. //Control routines for faller 1 if (faller1Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller1Speedx++; faller1Speedy++; if (faller1Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller1x--; faller1Speedx =0; } if (faller1Speedy> fallerySpeedTarget) { faller1y++; faller1Speedy =0; } matrix.drawBitmap(faller1x,faller1y,faller,3,3,1); }// Control routines for faller 2 if (faller2Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller2Speedx++; faller2Speedy++; if (faller2Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller2x--; faller2Speedx =0; } if (faller2Speedy> fallerySpeedTarget) { faller2y++; faller2Speedy =0; } matrix.drawBitmap(faller2x,faller2y,faller,3,3,1); } // Control routines for faller 3 if (faller3Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller3Speedx++; faller3Speedy++; if (faller3Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller3x--; faller3Speedx =0; } if (faller3Speedy> fallerySpeedTarget) { faller3y++; faller3Speedy =0; } matrix.drawBitmap(faller3x,faller3y,faller,3,3,1); } // Control routines for faller 4 if (faller4Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller4Speedx++; faller4Speedy++; if (faller4Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller4x--; faller4Speedx =0; } if (faller4Speedy> fallerySpeedTarget) { faller4y++; faller4Speedy =0; } matrix.drawBitmap(faller4x,faller4y,faller,3,3,1); } }void SpawnRiser(){ if (riser1Exist ==false &&riser2Exist ==false &&riser3Exist ==false &&riser4Exist ==false) { riser1x =15; //Spawn above the boss off the top of the screen riser2x =riser1x+bouncerGap;//spawn other bouncers spaced out on the x axis riser3x =riser2x+bouncerGap; riser4x =riser3x+bouncerGap; riser1y =7; //Spawn at Bottom of screen riser2y =8; riser3y =9; riser4y =10; riser1Exist =true; riser2Exist =true; riser3Exist =true; riser4Exist =true; }}void RiserControl(){ //Risers are spawned by the Boss during battle after level 5. Timer for spawning is in the BossControl function. //Control routines for riser 1 if (riser1Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser1Speedx++; riser1Speedy++; if (riser1Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser1x--; riser1Speedx =0; } if (riser1Speedy> fallerySpeedTarget) { riser1y--; riser1Speedy =0; } matrix.drawBitmap(riser1x,riser1y,riser,3,3,1); } //Control routines for riser 2 if (riser2Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser2Speedx++; riser2Speedy++; if (riser2Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser2x--; riser2Speedx =0; } if (riser2Speedy> fallerySpeedTarget) { riser2y--; riser2Speedy =0; } matrix.drawBitmap(riser2x,riser2y,riser,3,3,1); } //Control routines for riser 3 if (riser3Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser3Speedx++; riser3Speedy++; if (riser3Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser3x--; riser3Speedx =0; } if (riser3Speedy> fallerySpeedTarget) { riser3y--; riser3Speedy =0; } matrix.drawBitmap(riser3x,riser3y,riser,3,3,1); } //Control routines for riser 4 if (riser4Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser4Speedx++; riser4Speedy++; if (riser4Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser4x--; riser4Speedx =0; } if (riser4Speedy> fallerySpeedTarget) { riser4y--; riser4Speedy =0; } matrix.drawBitmap(riser4x,riser4y,riser,3,3,1); }}void SpawnLT(){ if (ltExist ==false) { ltx =32; //Spawn off the right side of the screen lty =random(0,6); //Spawn at a random Y coord ltExist =true; }}void LTControl(){ //If the UFO exists then draw its bitmap if (ltExist ==true) { ltxSpeed++; if (ltxSpeed ==ltxSpeedTarget) { ltxSpeed =0; ltx--; } matrix.drawBitmap(ltx, lty, LT, 6, 3, 1); } if (ltHealth <=0) { ltExist =false; Boom(ltx,lty,false,3); //Calls Boom() function to add score. Kills are added manually below. kills=kills+3; ltHealth =3; }}void BossBattle()//Sounds the warning siren then spawns boss. Still need to finish movement{ if (kills> killsTarget &&bossBattleStarted ==false) { bossBattleStarted =true; spawnEnabled =false; //Turns off spawning for other UFO types for(int i =5; i> 0; i--) //Play alarm sound { for (int x =0; x <360; x++) // X from 0 degree->360 degree { sinVal =sin(x * (PI / 180)); // Calculate the sine of x toneVal =2000 + sinVal * 500; // Calculate sound frequency according to the sine of x tone(buzzerPin, toneVal); // Output sound frequency to buzzerPin delay(1); } } tone(buzzerPin, 0, 5); //This is to stop the tone sound. It sticks around otherwise. if (boss1Exist ==false) { matrix.drawBitmap(bossx, bossy, boss, 8 ,8 ,1); boss1Exist =true; bossStartTime =millis(); //Set start timer for boss weapons bossStartTime =millis(); //Set start timer for boss minions } }}void BossControl(){ if (boss1Exist ==true) { bossxSpeed++; if (bossxSpeed> bossxSpeedTarget &&bossx> 24) //When the counter goes above the speed value then IF statement executes { bossx--; //Move the boss x cords to the left bossxSpeed =0; } matrix.drawBitmap(bossx, bossy, boss, 8, 8, 1); //Draw the boss bitmap at the new coords if (bossx ==24) { //Counting shoot timer bossCurrentTime =millis(); //get the current time in milliseconds bossCurrentTime2 =millis(); if (bossCurrentTime - bossStartTime>=bossLaserTimer) //startTimer is set in BossBattle function { //shoot laser selection =random(1,5);//Select laser cannon at random while (selection ==lastSelection)//While loop to ensure that the same laser isnt fired twice in a row too quick. Prevents timing gaps { selection =random(1,5); } UFOLaserShoot(selection);//Call UFOLaserShoot function with cannon selection //reset timer bossStartTime =bossCurrentTime; //Saves the start time of the spawn so the if statement works } if (levelNumber>=4) { if (bossCurrentTime2 - bossStartTime2>=bossMinionTimer) //startTimer is set in BossBattle function { //Select minions and spawn them minionSelection =random(1,3); if (minionSelection ==1) { SpawnFaller(); } if (minionSelection ==2) { SpawnRiser(); } //reset timer bossStartTime2 =bossCurrentTime2; //Saves the start time of the spawn so the if statement works } } } //Boss health counter hits zero, trigger boss death and new level if (bossHealth <=0) { boss1Exist =false; //Boss no longer exists Boom(bossx,bossy,false,5);//Calls Boom() function to add score matrix.fillScreen(LOW); //Clear screen for (int i =5; i> 0; i--) { matrix.drawBitmap(bossx, bossy, bossBoom1 ,8 ,8, 1); //Boss explosion first frame tone(buzzerPin, 100,100); //Play sound delay(200); //Wait //matrix.fillScreen(LOW); //Clear screen matrix.drawBitmap(bossx, bossy, bossBoom2 ,8 ,8, 1); //Boss explosion second frame tone(buzzerPin, 200,100); //Play second sound delay(200); //Wait } tone(buzzerPin, 1, 1);//Stop beep bossx=39; //Move bossx back to 32 matrix.fillScreen(LOW); //clear the screen gameStart =false; //Mark game as stopped levelNumber++; //increment level if (levelNumber> 10) { GameOver(1); return; } tape ="Level "; //Prepare new tape for ticker function tape +=levelNumber; //Adding level number to ticker string tape +=" Score:"; tape +=score; ufoLasExist1 =false; ufoLasExist2 =false; ufoLasExist3 =false; ufoLasExist4 =false; faller1Exist =false; faller2Exist =false; faller3Exist =false; faller4Exist =false; riser1Exist =false; riser2Exist =false; riser3Exist =false; riser4Exist =false; ufoLas1x=bossx; ufoLas2x=bossx; ufoLas3x=bossx; ufoLas4x=bossx; Ticker(true); //Call ticker function to show score and new level } }}void UFOLaserShoot(int selection){ if (selection ==1) { if (ufoLasExist1 ==false)//Check to see if the UFO laser already exists { ufoLas1x=bossx+1; //spawn laser in the middle ufoLas1y=bossy+4; ufoLasExist1=true; tone(buzzerPin, 200,100);//play laser sound } } if (selection ==2) { if (ufoLasExist2 ==false) { ufoLas2x=bossx+2; //spawn laser at the top side ufoLas2y=bossy+1; ufoLasExist2=true; tone(buzzerPin, 300,100);//play laser sound } } if (selection ==3) { if (ufoLasExist3 ==false) { ufoLas3x=bossx+2; //spawn laser at the bottom side ufoLas3y=bossy+7; ufoLasExist3=true; tone(buzzerPin, 400,100);//play laser sound } } if (selection ==4) { if (ufoLasExist4 ==false)//Planning to make this one random { coinFlip =random(0,2); if (coinFlip ==0) { ufoLas4x=bossx+2; ufoLas4y=bossy+2; ufoLasExist4=true; tone(buzzerPin, 500,100);//play laser sound } if (coinFlip ==1) { ufoLas4x=bossx+2; ufoLas4y=bossy+6; ufoLasExist4=true; tone(buzzerPin, 500,100);//play laser sound } } } }void UFOLaserControl(){ if (ufoLasExist1 ==true) { ufoLas1x--; matrix.drawBitmap(ufoLas1x, ufoLas1y, ufoLaser, 2, 1, 1); } if (ufoLasExist2 ==true) { ufoLas2x--; matrix.drawBitmap(ufoLas2x, ufoLas2y, ufoLaser, 2, 1, 1); } if (ufoLasExist3 ==true) { ufoLas3x--; matrix.drawBitmap(ufoLas3x, ufoLas3y, ufoLaser, 2, 1, 1); } if (ufoLasExist4 ==true) { ufoLas4x--; matrix.drawBitmap(ufoLas4x, ufoLas4y, ufoLaser, 2, 1, 1); } }void ShipCollision(){ if (gameStart ==true &&collisionDetection ==true) { //Collision detection for line 0 of ship //Collision detection for UFO1. Dont need line 0 of UFO because line 0 of ship cannot touch it anyway. if (ufo1Exist ==true) { for (int a =0; a <2; a++) { if (shipx ==ufo1x+a &&shipy ==ufo1y+1) ///Line 1 { ShipHit(); } } //Collision detection for line 1 of ship.................. //Contains extra for loop to loop through all the ship line 1 pixels //Collision detection for UFO1 for (int b =0; b <1; b++) //Had b <2 and the collision detection worked but looked wonky when moving towards ufos { for (int a =0; a <2; a++) { if (shipx+b ==ufo1x+a &&shipy+1 ==ufo1y+1) //Line 1 { ShipHit(); } } for (int a =1; a <3; a++) { if (shipx+b ==ufo1x+a &&shipy+1 ==ufo1y) //Line 0 { ShipHit(); } } } } //Collision detection for line 0 of ship //collision detection for UFO2 if (ufo2Exist ==true) { for (int a =0; a <2; a++) { if (shipx ==ufo2x+a &&shipy ==ufo2y+1) ///Line 1 { ShipHit(); } } //Collision detection for line 1 of ship //Collision detection for UFO2 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) { if (shipx+b ==ufo2x+a &&shipy+1 ==ufo2y+1) //Line 1 { ShipHit(); } } for (int a =1; a <3; a++) { if (shipx+b ==ufo2x+a &&shipy+1 ==ufo2y) //Line 0 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for UFO3 if (ufo3Exist ==true) { for (int a =0; a <2; a++) { if (shipx ==ufo3x+a &&shipy ==ufo3y+1) ///Line 1 { ShipHit(); } } //Contains extra for loop to loop through all the ship line 1 pixels //Collision detection for UFO3 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) { if (shipx+b ==ufo3x+a &&shipy+1 ==ufo3y+1) //Line 1 { ShipHit(); } } for (int a =1; a <3; a++) { if (shipx+b ==ufo3x+a &&shipy+1 ==ufo3y) //Line 0 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer1. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer1Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer1x+a &&shipy ==bouncer1y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer1 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer1x+a &&shipy+1 ==bouncer1y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer1x+a &&shipy+1 ==bouncer1y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer1x+a &&shipy+1 ==bouncer1y+2) //Line 2 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer2. Don't need line 0 and 1 because line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer2Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer2x+a &&shipy ==bouncer2y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer2 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer2x+a &&shipy+1 ==bouncer2y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer2x+a &&shipy+1 ==bouncer2y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer2x+a &&shipy+1 ==bouncer2y+2) //Line 2 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer3. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer3Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer3x+a &&shipy ==bouncer3y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer3 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer3x+a &&shipy+1 ==bouncer3y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer3x+a &&shipy+1 ==bouncer3y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer3x+a &&shipy+1 ==bouncer3y+2) //Line 2 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer4. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer4Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer4x+a &&shipy ==bouncer4y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer4 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer4x+a &&shipy+1 ==bouncer4y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer4x+a &&shipy+1 ==bouncer4y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer4x+a &&shipy+1 ==bouncer4y+2) //Line 2 { ShipHit(); } } } } //Dont need collision detection for lines 0 and 1 of LT and line 0 of ship because they cant touch anyway//Collision detection routines for LT if (ltExist ==true) { for (int a =2; a <4; a++) //Line 2 { if (shipx ==ltx+a &&shipy ==lty+2) { ShipHit(); } } //Collision detection routines for LT and Ship line 1 for (int b =0; b <2; b++) { for (int a =1; a <4; a++) //Top line 0 { if (shipx+b ==ltx+a &&shipy+1 ==lty) { ShipHit(); } } for (int a =0; a <5; a++) //Line 1 { if (shipx+b ==ltx+a &&shipy+1 ==lty+1) { ShipHit(); } } for (int a =2; a <4; a++) //Line 2 { if (shipx+b ==ltx+a &&shipy+1 ==lty+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch//Collision detection for Faller 1 if (faller1Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller1x+a &&shipy ==faller1y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 1 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller1x+a &&shipy+1 ==faller1y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller1x+a &&shipy+1 ==faller1y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller1x+a &&shipy+1 ==faller1y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch //Collision detection for Faller 2 if (faller2Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller2x+a &&shipy ==faller2y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 2 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller2x+a &&shipy+1 ==faller2y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller2x+a &&shipy+1 ==faller2y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller2x+a &&shipy+1 ==faller2y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch //Collision detection for Faller 3 if (faller3Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller3x+a &&shipy ==faller3y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 3 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller3x+a &&shipy+1 ==faller3y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller3x+a &&shipy+1 ==faller3y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller3x+a &&shipy+1 ==faller3y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch //Collision detection for Faller 4 if (faller4Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller4x+a &&shipy ==faller4y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 4 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller4x+a &&shipy+1 ==faller4y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller4x+a &&shipy+1 ==faller4y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller4x+a &&shipy+1 ==faller4y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 1 if (riser1Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser1x+a &&shipy ==riser1y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 1 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser1x+a &&shipy+1 ==riser1y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser1x+0 &&shipy+1 ==riser1y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser1x+a &&shipy+1 ==riser1y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 2 if (riser2Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser2x+a &&shipy ==riser2y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 2 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser2x+a &&shipy+1 ==riser2y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser2x+0 &&shipy+1 ==riser2y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser2x+a &&shipy+1 ==riser2y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 3 if (riser3Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser3x+a &&shipy ==riser3y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 3 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser3x+a &&shipy+1 ==riser3y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser3x+0 &&shipy+1 ==riser3y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser3x+a &&shipy+1 ==riser3y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 4 if (riser4Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser4x+a &&shipy ==riser4y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 4 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser4x+a &&shipy+1 ==riser4y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser4x+0 &&shipy+1 ==riser4y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser4x+a &&shipy+1 ==riser4y+2) { ShipHit(); } } } } //No collision detection for line 0 of ship and boss because they'll never touch anyway. //Collision detection for Boss abd Ship line 1 if (boss1Exist ==true) { for (int b =0; b <1; b++) { for (int a =3; a <5; a++ ) //Top line 0 { if (shipx+b ==bossx+a &&shipy+1 ==bossy) { ShipHit(); } } for (int a =2; a <5; a++) //Line 1 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+1) { ShipHit(); } } for (int a =1; a <6; a++) //Line 2 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+2) { ShipHit(); } } for (int a =0; a <7; a++) //Line 3 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+3) { ShipHit(); } } for (int a =2; a <6; a++) //Line 4 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+4) { ShipHit(); } } for (int a =0; a <7; a++) //Line 5 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+5) { ShipHit(); } } for (int a =1; a <6; a++) //Line 6 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+6) { ShipHit(); } } for (int a =2; a <5; a++) //Line 7 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+7) { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist1 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas1x+a &&shipy ==ufoLas1y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas1x+a &&shipy+1 ==ufoLas1y) ///Line 1 { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist2 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas2x+a &&shipy ==ufoLas2y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas2x+a &&shipy+1 ==ufoLas2y) ///Line 1 { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist3 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas3x+a &&shipy ==ufoLas3y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas3x+a &&shipy+1 ==ufoLas3y) ///Line 1 { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist4 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas4x+a &&shipy ==ufoLas4y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas4x+a &&shipy+1 ==ufoLas4y) ///Line 1 { ShipHit(); } } } } }}void GameOver(int gameStatus){ spawnEnabled =false; if (gameStatus ==0) //Game over due to death { tape ="Game Over :( Your score was "; tape +=score; // Ticker(true); tape ="UFO ATTACK! - Press fire to start "; lives =5; score =0; levelNumber =1; } else if (gameStatus ==1)//Game over due to winning level 10 { tape ="Congratulations! You defeated the alien invasion :) Your total score was "; tape +=score; //Ticker(true); lives =5; score =0; levelNumber =1; } else if (gameStatus ==2)//Life lost { tape ="Ship destroyed! "; tape +="Lives left:"; tape +=lives; } ufo1Exist =false; ufo2Exist =false; ufo3Exist =false; bouncer1Exist =false; bouncer2Exist =false; bouncer3Exist =false; bouncer4Exist =false; faller1Exist =false; faller2Exist =false; faller3Exist =false; faller4Exist =false; riser1Exist =false; riser2Exist =false; riser3Exist =false; riser4Exist =false; ltExist =false; boss1Exist =false; gameStart =false; ufoLasExist1 =false; ufoLasExist2 =false; ufoLasExist3 =false; ufoLasExist4 =false; ufoLas1x =34; ufoLas1y =34; ufoLas2x =34; ufoLas2y =34; ufoLas3x =34; ufoLas3y =34; ufoLas4x =34; ufoLas4y =34; ufo1x =34; ufo2x =34; ufo3x =34; bouncer1x =34; bouncer2x =34; bouncer3x =34; bouncer4x =34; faller1x =34; faller2x =34; faller3x =34; faller4x =34; riser1x =34; riser2x =34; riser3x =34; riser4x =34; ltx =34; bossx =34; shipx =0; shipy =3; lasExist =false; if (gameStatus ==2){ Ticker(false);}else if (gameStatus ==0 || gameStatus ==1){ Ticker(true);}}void ShipHit(){ lives--; for (int i =5000; i> 1; i =i-5) { tone(buzzerPin, i, 1); delay(1); } if (lives> 0) { GameOver(2); } else if (lives <=0) { GameOver(0); }}

示意图

Wiring Schematic for UFO Attack game.

制造工艺

  1. Arduino 数字骰子
  2. 水火
  3. 3D RGB Arduclock
  4. MyRiver
  5. 钢铁侠
  6. 摇杆游戏
  7. 找到我
  8. Arduino 3D 打印机械臂
  9. 便携式测距仪
  10. Arduino 加湿器控制
  11. 小流浪者
  12. Arduino Joystick