/* * Zapojení drátků * Saimon 1 * 23-log1, 24-X1, 25-log0, 119-X2, 120-log1, 121-log0, 109-log0 * * číslicovka napájení-log1, X3-88,X4-89, X5-90, X6-91 * * * Saimon 4 * Arduino napájení - log1 * * Displej * DIN-12,CS-10,CLK-11,VCC-log1 * * Ostatní * A7-X1, D02-X2, D03-108, D04-X6, D05-X5, D06-X4, D07-X3 * */ const int buzzerPin = 3, pinDIN=12, pinCS=10, pinCLK=11, num8pin=7, num4pin=6, num2pin=5, num1pin=4; #include "LedControl.h" LedControl obrazovka=LedControl(pinDIN,pinCLK,pinCS,1); struct game { int gameMode; }; struct point { int y = 0, x = 0, active = 0, movespeedACT,movespeedSET, sound; void draw(){ obrazovka.setLed(0,y,x,1); } void erase(){ obrazovka.setLed(0,y,x,0); } void death() { active=0; erase(); x=-1; y=-1; } }; struct enemyPoint: point //dedicnost, rozsireni tridy point o dalsi metody { int deathActive; void down(void){ draw(); movespeedACT--;//tohle určuje rychlost if (movespeedACT<=0) //behem tiku, velikost movespeedSET určuje za kolik tiku se udeje vlastní pohyb { erase(); y+=1; draw(); movespeedACT=movespeedSET; } if (y>=7) //pokud vyletí z obrazovky, deaktivujeme { active=0; erase(); } } void playDeathSound (){ deathActive-=8; tone(buzzerPin,sound,8); sound+=10; } void init (){ if (random(0,30)==10) { movespeedACT=movespeedSET; y=0; x=random(0,8); active=1;//tahle nahoda urci, zda se nepřítel znovu objevi } } }; struct shootPoint: point //dedicnost, rozsireni tridy point o dalsi metody { void up(void){ draw(); movespeedACT--; //tohle určuje rychlost if (movespeedACT==0) // //behem tiku, velikost movespeedSET určuje za kolik tiku se udeje vlastní pohyb { erase(); y-=1; draw(); sound-=100; movespeedACT=movespeedSET; //a nastavíme zase výchozí hodnotu } if (y<0) //pokud střela vyletěla z obrazovky, deaktivujeme ji { active=0; } //zde můžeme dodělat zvuk střely tone(buzzerPin,sound,2); } void init(int startX) { active=1; //nastavíme počáteční souřadnice střely a spustíme ji y=6; x=startX; sound=1999; movespeedACT=movespeedSET; } }; struct tank { int y = 0, x = 0,scoreACT,scoreSET; void draw(){ obrazovka.setLed(0,y+0,x+1,1); //tohle zobrazí tank obrazovka.setLed(0,y+1,x+0,1); obrazovka.setLed(0,y+1,x+1,1); obrazovka.setLed(0,y+1,x+2,1); } void erase(){ obrazovka.setLed(0,y+0,x+1,0); //překreslíme tank obrazovka.setLed(0,y+1,x+0,0); obrazovka.setLed(0,y+1,x+1,0); obrazovka.setLed(0,y+1,x+2,0); } void death(){ scoreACT=scoreSET; erase(); } void init (){ scoreACT=scoreSET; } }; enemyPoint enemy; shootPoint shoot; tank player; game spaceInvaders; void showScore(int score){ digitalWrite(num1pin,score&1); digitalWrite(num2pin,score&2); digitalWrite(num4pin,score&4); digitalWrite(num8pin,score&8); } void newGame (){ player.y=6; shoot.active = 0; shoot.movespeedSET=3; enemy.active = 0; enemy.movespeedSET = 20; player.scoreSET=8; obrazovka.clearDisplay(0); player.scoreACT=9; spaceInvaders.gameMode=2; } void setup() { obrazovka.shutdown (0,false); obrazovka.setIntensity(0,8); pinMode (2,INPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); randomSeed(analogRead(0)); spaceInvaders.gameMode=0; } void setPlayerPosition (){ player.x=analogRead(A7)/100; //čteme pozici potenciometru pro pohyb tanku player.x--; //aby mohl vyjet z částečně z okraje if (player.x>6) player.x=6; //nesmí být větší jak šest, aby nevyjel z obrazovky } void gameOver (){ //efekt pro smrt hrace int y=0; int x=0; int zvuk; zvuk=1000; do { x=0; do { obrazovka.setLed (0,y,x,1); x++; tone (buzzerPin,zvuk,10); zvuk=zvuk-10; delay (10); }while(x<8); y++; }while(y<8); delay(1000); spaceInvaders.gameMode=0; } void win (){ int time=100; tone ( buzzerPin, 262, time); delay (time); tone ( buzzerPin, 294, time); delay (time); tone ( buzzerPin, 330, time); delay (time); tone ( buzzerPin, 349, time); delay (time); tone ( buzzerPin, 392, time); delay (time); tone ( buzzerPin, 440, time); delay (time); tone ( buzzerPin, 494, time); delay (time); tone ( buzzerPin, 523, time); delay (time); randomSeed(A0); spaceInvaders.gameMode=0; } void tick (){ setPlayerPosition (); showScore(player.scoreACT); if (player.scoreACT==0) spaceInvaders.gameMode=4; //win player.draw(); if (digitalRead(2)) //pokud stiskneme tlačítko if (!shoot.active) shoot.init(player.x+1); //a pokud neni střela aktivní if (shoot.active) //pokud jsme vystřelili { if (enemy.x==shoot.x) //zde se porovná, jestli jsme střelou trefili if (enemy.y==shoot.y) { //pokud ano shoot.death(); //zruší to střelu enemy.death(); //a zruší to nepřítele enemy.deathActive=100; enemy.sound=350; player.scoreACT--; //odečteme počet nepřátel k sestřelení } } if (shoot.active) //pokud jsme vystřelili, pohybujeme střelou, dokud nevyletí z obrazovky { shoot.up(); //tohle posune střelu o krok dál } if (enemy.active) { enemy.down(); if (enemy.y==player.y) if (enemy.x>=player.x) if (enemy.x<=player.x+2) { player.death(); shoot.death(); enemy.death(); spaceInvaders.gameMode=3; //konec } } if (!enemy.active) if (enemy.deathActive>0) enemy.playDeathSound(); else enemy.init(); delay(25); //tohle je hlaní rychlost hry player.erase(); } void pressStart () { obrazovka.clearDisplay(0); player.x=2; player.y=6; player.draw(); for ( int i=0;i<40;i++) {//cekaci smycka na stisk klavesy pro start if ( digitalRead (2)) spaceInvaders.gameMode=1; delay (10); } player.erase(); for ( int i=0;i<20;i++) { //cekaci smycka na stisk klavesy pro start if ( digitalRead (2)) spaceInvaders.gameMode=1; delay (10); } } void loop() { switch (spaceInvaders.gameMode) { case 0: pressStart();break; case 1: newGame();break; case 2: tick();break; case 3: gameOver();break; case 4: win();break; } }