#include // hlavi!ckov´y soubor popisuj´ic´i mikrokontrol´er #include // knihovna pot!rebn´a pro p!reru!sen´i #include #define F_OSC 16000000UL // nutna podminka pro knihovnu delay, frekvence oscilatoru #include "delay.c" // delay #define LEDG PORTA // definice portu A #define LEDR PORTC // definice portu C #define MUX PORTB // definice portu B int playp = 1; //podminka hry int play = 1; int konec = 0; int balon = 0b1111111111110111; //umístění balonu v horizontálním směru int balonV = 1; // pozice ve vertikalnim smeru int kontrola = 0; // kontrola horizontalniho smeru int vertical = 0; // kontrola vertikalniho smeru int poleint[7] = {0b1111111100000000, // hrací pole 0b1111111100000000, 0b1111111111111111, 0b1111111111111111, 0b1111111111111111, 0b1111111111111111, 0b1111111111111111}; int letadlo = 0b1111111111100011; //poslední řádek, loď (odrazná deska) int vitez[8] = {0b1111111111111111, // zobrazí se pri vyhre 0b1111111111100111, 0b1111111111011011, 0b1111111110111101, 0b1111111110111101, 0b1111111110111101, 0b1111111111111111, 0b1111111111111111}; int prohra[8] = {0b1111111101111110, // zobrazi pri prohre 0b1111111110111101, 0b1111111111011011, 0b1111111111100111, 0b1111111111100111, 0b1111111111011011, 0b1111111110111101, 0b1111111101111110}; void show() //fce pro vykreslování { int i; // lokální proměná pro indexaci MUX = 0; //nastavení pro vykreslení na poslední řádel (loď, or letadlo) LEDR = letadlo; //vykreslení delay_ms(1); //zpoždění v ms LEDR = 255; //dále nevykreslovat MUX = balonV; // vykresleni micku zelena LED LEDG = balon; //vykreslení míčku delay_ms(1); //zpoždění v ms LEDG = 255; //dále nekreslit for(i=1;i<8;i++) // vykresleni hraci plochy { MUX=i; //multiplex řádků LEDR = poleint[7-i]; //vykreslování řádků delay_ms(1); //zpoždění } } void check() // kontrola stavu hry { if ( poleint[0]==0b1111111111111111 & poleint[1] ==0b1111111111111111 ) { while(1) //nekonečná smyčka { int i; for(i=0;i<8;i++) //úspěšně ukončená hra { MUX=i; // mutliplex radku LEDG = vitez[i]; // vykresleni obrazku vitez delay_ms(1); // zpozdeni } } } //------------------------------- cihla if(balonV ==6 && vertical == 0) // odraz od cihly v druhém řádku od vrchu a ve směru nahoru { int odraz = ~balon & ~poleint[1]; //lokální proměnná pro zjištění zda je v místě balánu cihla if(odraz > 0) { poleint[1] =~poleint[1] & balon; poleint[1]= ~poleint[1]; vertical = 1; } } if(balonV ==7 && vertical == 0) // odraz od stropu { int odraz = ~balon & ~poleint[0]; if(odraz > 0) { poleint[0] =~poleint[0] & balon; poleint[0]= ~poleint[0]; kontrola=!kontrola; //opacne do boku } } if(balonV ==6 && vertical == 1) // odraz od cily smerem z vrchu { int odraz = ~balon & ~poleint[1]; if(odraz > 0) { poleint[1] =~poleint[1] & balon; poleint[1]= ~poleint[1]; vertical = 0; //smer nahoru kontrola=!kontrola; //opacne do boku } } //---------------------- if(balon == 0b1111111111111110) // osetreni kraju kontrola=0; if(balon == 0b1111111101111111) kontrola=1; if(balonV == 7) //osetreni odrazu nahore a dole vertical = 1; if(balonV == 0) vertical = 0; //----------------------------------- if(balonV == 1 && vertical ==1) // kontrola odrazu od lode a konec hry { int pomoc = balon; if(kontrola ==0) // vyhodnoceni micku zprava konec = ~letadlo & ~(pomoc<<=1); if(kontrola ==1) //vyhodnoceni micku zleva konec = ~letadlo & ~(pomoc>>=1); if(konec == 0) //konec hry playp=0; else //pokracovani hry { if(vertical == 0) // zjisteni stredu lodi, pro sposuv micku (kvuli sachovnici) { int lod = ~letadlo; //stred lodi int lod3 = ~letadlo; int lod2 = (lod3<<=1)&(lod>>=1); //ted stred lod2 = lod2 & ~balon; //vetsi nez jedna pokud jsou nad sebou if (lod2 > 0) { if(kontrola ==0) { balon = ~balon; balon<<=balon; balon = ~balon; } else { balon = ~balon; balon>>=balon; balon = ~balon; } } } vertical = 0; // zmena smeru nahoru } } } void game() //start hry { while(play) { show(); //fce zobrazovani check(); if( bit_is_clear( PIND,PD0 )) //stisknute tlacitko je clear { if(letadlo != 0b1111111111111000) { delay_ms(200); //osetreni zakmitu tlacitka letadlo=~letadlo; letadlo>>=1; //posuv lode do prava letadlo = ~letadlo; LEDR = letadlo; } } if( bit_is_clear( PIND,PD1 )) //stisknute tlacitko je clear { delay_ms(200); //osetreni zakmitu tlacitka if(letadlo != 0b1111111100011111) { letadlo=~letadlo; letadlo<<=1; //posuv lode do doleva letadlo = ~letadlo; LEDR = letadlo; } } } } ISR( TIMER1_OVF_vect ) // preruseni citac casovac1 { if(kontrola == 0) //osetreni horizontalniho odrazu { balon = ~balon; balon<<=1; balon = ~balon; } else { balon = ~balon; balon>>=1; balon = ~balon; } //---------------------------------------------- if(vertical == 0) //verticalni kontrola { balonV++; } else { balonV--; } //-----------------------------spodni radek, podminka hry if(playp ==0) { play =0; } } int main() { DDRA = 0xff; //nastaveni portu jako vystupni DDRB = 0xff; DDRC = 0xff; DDRD = 0b11110000 ; //tlacitka jako vstupni TIMSK=(1<