Whack-a-mole tip arkadne igre. Igrač mora stiskati odgovarajuće tipke u zadanome vremenu. Cilj je ostvariti što veći rezultat. 7 segment display prikazuje ''krtice'' a na igraču je da reagira na vrijeme i pritisne točnu tipku. U slučaju da odabere točno i unutar vremenskog prozora igra se nastavlja, a u suprotnom se igra zaustavlja. Osim vizualnih signala, igraču buzzer signalizira točno pritisnutu tipku te početak i kraj igre. Kada igra završi rezultat se printa u konzolu.
Dependencies: mbed
El. shema i prezentacija
Revision 0:9717f3a1d93e, committed 22 months ago
- Comitter:
- amarkovi1
- Date:
- Thu Dec 01 20:20:48 2022 +0000
- Commit message:
- Projektni zadatak - Andrija Markovic
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 9717f3a1d93e main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Dec 01 20:20:48 2022 +0000 @@ -0,0 +1,293 @@ + +#include "mbed.h" + +// 3 digitalna in-a za botune +InterruptIn tipka1(D2); +InterruptIn tipka2(PC_3); +InterruptIn tipka3(PC_2); + +// za generiranje nasumicnog broja +AnalogIn analog (A1); + +// print u tera term +Serial pc(USBTX, USBRX); + +// za pomoć pri programiranju +DigitalOut led1(LED1); +InterruptIn tester(PC_13); // B1 + +// PWM za buzzer +PwmOut buzzer(PB_3); + +// debounce timer za tipkala +Timer debounce; + +// 7 seg display bus i fja +BusOut Seg1(D5,D6,D7,D8,D9,D10,D11,D12); +char SegConvert(char SegValue); + + +// varijable +int r = 4; // nasumican broj 1-4 +int t = 4; +int rp = 4; // varijabla za tipkalo 1-3 +int igra_li_se = 1; +int c = 0; // counter pogodaka +int kraj = 0; + + +// interrupti za botune +void zaustavi_igru(void); // tester +void t1(void); +void t2(void); +void t3(void); + + +// funkcije +void start_sekvenca(){ // start fja + // 7 seg spin + int s; + for (s = 0; s < 4; s++){ + Seg1=SegConvert(10); + + wait(0.05); + Seg1=SegConvert(11); + wait(0.05); + Seg1=SegConvert(12); + wait(0.05); + Seg1=SegConvert(13); + wait(0.05); + Seg1=SegConvert(14); + wait(0.05); + Seg1=SegConvert(15); + wait(0.05); + } + Seg1=SegConvert(10); + wait(0.05); + Seg1=SegConvert(99); + wait(0.2); + + Seg1=SegConvert(98); + wait(0.1); + Seg1=SegConvert(99); + wait(0.1); + Seg1=SegConvert(98); + wait(0.1); + Seg1=SegConvert(99); + wait(0.1); + + Seg1=SegConvert(99); + wait(0.5); + + // buzzer countdown + buzzer.period(1/(349.2)); + buzzer = 0.5; + wait(0.5); + buzzer = 0; + wait(0.5); + buzzer.period(1/(349.2)); + buzzer = 0.5; + wait(0.5); + buzzer = 0; + wait(0.5); + buzzer.period(1/(349.2)); + buzzer = 0.5; + wait(0.5); + buzzer = 0; + wait(0.5); + buzzer.period(1/(698.5)); + buzzer = 0.5; + wait(1); + buzzer = 0; +} + +void end_sekvenca(){ + buzzer.period(1/(698.5)); + buzzer = 0.5; + wait(0.5); + buzzer.period(1/(659.3)); + buzzer = 0.5; + wait(0.5); + buzzer.period(1/(622.2)); + buzzer = 0.5; + wait(0.5); + buzzer.period(1/(587.3)); + buzzer = 0.5; + wait(0.5); + buzzer.period(1/(554.4)); + buzzer = 0.5; + wait(1.5); + buzzer = 0; +} + +// generira nasaumičan broj +unsigned int nasumican (void){ + unsigned int rd = 0; + unsigned int dugi = 0; + for (rd = 0; rd <= 32; rd += 2){ + dugi += ((analog.read_u16() ) << rd); + } + return dugi; +} + + +// ticker za odbrojavanje vremena između generiranja krtica +Ticker nova_krtica; + +// generira nove krtice i uspoređuje +void krtica(){ + + if(r == t){ + c++; + if(t != 4){ + buzzer.period(1/(587.3)); + buzzer = 0.5; + wait(0.05); + buzzer = 0; + } + igra_li_se = 1; + } + + else if(r != t){ + igra_li_se = 0; + Seg1=SegConvert(99); + } + + rp = r; + + r = nasumican() % 4 + 1; + + if(r == rp){ + r++; + } + if(r > 4){ + r = 1; + } + + switch(r){ + case 1 : Seg1=SegConvert(10);break; + case 2 : Seg1=SegConvert(16);break; + case 3 : Seg1=SegConvert(13);break; + case 4 : Seg1=SegConvert(99);t=4;break; // t je 4, ako se stisne tipkalo ispadaš + } + +} + + +// main +int main() { + + pc.printf("\n\r\n\r\n\r\n\r\n\r\n\r\n\r"); + pc.printf("\n\r\n\r-----------\n\r\n\r NOVA IGRA\n\r\n\r-----------\n\r"); + pc.printf("\n\r\n\r\n\r\n\r\n\r\n\r\n\r"); + + start_sekvenca(); + + debounce.start(); + + tipka1.mode(PullUp); + tipka2.mode(PullUp); + tipka3.mode(PullUp); + + nova_krtica.attach(&krtica,0.7); + + while(1) { + tester.rise(&zaustavi_igru); + tipka1.rise(&t1); + tipka2.rise(&t2); + tipka3.rise(&t3); + if(igra_li_se == 1){ + // pc.printf("tipka %i segment%i\n\r", t, r); + } + else if(igra_li_se == 0){ + Seg1=SegConvert(99); + nova_krtica.detach(); + if(kraj==0){ + end_sekvenca(); + kraj++; + } + led1 = !led1; + t = 0; + pc.printf("\n\r!!! GAME OVER !!!\n\r\n\rPOGODILI STE %i PUTA! WOW!\n\r\n\r??? IGRAJ OPET ???\n\r\n\r", (c-1)); + wait(10); + } + + } +} + + +//prekidi + +// prekid za B1 u svrhe testiranja +void zaustavi_igru(void){ + if(debounce.read_ms()>100){ + led1 = !led1; +// igra_li_se = 0; + debounce.reset(); + } +} + +//tipka1 +void t1(void){ + if(debounce.read_ms()>100){ + + t = 1; + led1 = !led1; + Seg1=SegConvert(99); + + debounce.reset(); + } +} + +//tipka2 +void t2(void){ + if(debounce.read_ms()>100){ + + t = 2; + led1 = !led1; + Seg1=SegConvert(99); + + debounce.reset(); + } +} + +//tipka3 +void t3(void){ + if(debounce.read_ms()>100){ + + t = 3; + led1 = !led1; + Seg1=SegConvert(99); + + debounce.reset(); + } +} + + +// 7 seg konverter +char SegConvert(char SegValue) { // A 10 (D5), G 16 (D11), D 13 (D8) + char SegByte=0x00; + switch (SegValue) { //DPGFEDCBA + case 0 : SegByte = 0x3F;break; // 00111111 binary + case 1 : SegByte = 0x06;break; // 00000110 binary + case 2 : SegByte = 0x5B;break; // 01011011 binary + case 3 : SegByte = 0x4F;break; // 01001111 binary + case 4 : SegByte = 0x66;break; // 01100110 binary + case 5 : SegByte = 0x6D;break; // 01101101 binary + case 6 : SegByte = 0x7D;break; // 01111101 binary + case 7 : SegByte = 0x07;break; // 00000111 binary + case 8 : SegByte = 0x7F;break; // 01111111 binary + case 9 : SegByte = 0x6F;break; // 01101111 binary + + case 10: SegByte = 0x01;break; // 00000001 A + case 11: SegByte = 0x02;break; // 00000010 B + case 12: SegByte = 0x04;break; // 00000100 C + case 13: SegByte = 0x08;break; // 00001000 D + case 14: SegByte = 0x10;break; // 00010000 E + case 15: SegByte = 0x20;break; // 00100000 F + case 16: SegByte = 0x40;break; // 01000000 G + case 98: SegByte = 0x49;break; // 01001001 AGD + case 99: SegByte = 0x00;break; // 00000000 / + } + return SegByte; +} \ No newline at end of file
diff -r 000000000000 -r 9717f3a1d93e mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Dec 01 20:20:48 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file