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

Committer:
amarkovi1
Date:
Thu Dec 01 20:20:48 2022 +0000
Revision:
0:9717f3a1d93e
Projektni zadatak - Andrija Markovic

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amarkovi1 0:9717f3a1d93e 1
amarkovi1 0:9717f3a1d93e 2 #include "mbed.h"
amarkovi1 0:9717f3a1d93e 3
amarkovi1 0:9717f3a1d93e 4 // 3 digitalna in-a za botune
amarkovi1 0:9717f3a1d93e 5 InterruptIn tipka1(D2);
amarkovi1 0:9717f3a1d93e 6 InterruptIn tipka2(PC_3);
amarkovi1 0:9717f3a1d93e 7 InterruptIn tipka3(PC_2);
amarkovi1 0:9717f3a1d93e 8
amarkovi1 0:9717f3a1d93e 9 // za generiranje nasumicnog broja
amarkovi1 0:9717f3a1d93e 10 AnalogIn analog (A1);
amarkovi1 0:9717f3a1d93e 11
amarkovi1 0:9717f3a1d93e 12 // print u tera term
amarkovi1 0:9717f3a1d93e 13 Serial pc(USBTX, USBRX);
amarkovi1 0:9717f3a1d93e 14
amarkovi1 0:9717f3a1d93e 15 // za pomoć pri programiranju
amarkovi1 0:9717f3a1d93e 16 DigitalOut led1(LED1);
amarkovi1 0:9717f3a1d93e 17 InterruptIn tester(PC_13); // B1
amarkovi1 0:9717f3a1d93e 18
amarkovi1 0:9717f3a1d93e 19 // PWM za buzzer
amarkovi1 0:9717f3a1d93e 20 PwmOut buzzer(PB_3);
amarkovi1 0:9717f3a1d93e 21
amarkovi1 0:9717f3a1d93e 22 // debounce timer za tipkala
amarkovi1 0:9717f3a1d93e 23 Timer debounce;
amarkovi1 0:9717f3a1d93e 24
amarkovi1 0:9717f3a1d93e 25 // 7 seg display bus i fja
amarkovi1 0:9717f3a1d93e 26 BusOut Seg1(D5,D6,D7,D8,D9,D10,D11,D12);
amarkovi1 0:9717f3a1d93e 27 char SegConvert(char SegValue);
amarkovi1 0:9717f3a1d93e 28
amarkovi1 0:9717f3a1d93e 29
amarkovi1 0:9717f3a1d93e 30 // varijable
amarkovi1 0:9717f3a1d93e 31 int r = 4; // nasumican broj 1-4
amarkovi1 0:9717f3a1d93e 32 int t = 4;
amarkovi1 0:9717f3a1d93e 33 int rp = 4; // varijabla za tipkalo 1-3
amarkovi1 0:9717f3a1d93e 34 int igra_li_se = 1;
amarkovi1 0:9717f3a1d93e 35 int c = 0; // counter pogodaka
amarkovi1 0:9717f3a1d93e 36 int kraj = 0;
amarkovi1 0:9717f3a1d93e 37
amarkovi1 0:9717f3a1d93e 38
amarkovi1 0:9717f3a1d93e 39 // interrupti za botune
amarkovi1 0:9717f3a1d93e 40 void zaustavi_igru(void); // tester
amarkovi1 0:9717f3a1d93e 41 void t1(void);
amarkovi1 0:9717f3a1d93e 42 void t2(void);
amarkovi1 0:9717f3a1d93e 43 void t3(void);
amarkovi1 0:9717f3a1d93e 44
amarkovi1 0:9717f3a1d93e 45
amarkovi1 0:9717f3a1d93e 46 // funkcije
amarkovi1 0:9717f3a1d93e 47 void start_sekvenca(){ // start fja
amarkovi1 0:9717f3a1d93e 48 // 7 seg spin
amarkovi1 0:9717f3a1d93e 49 int s;
amarkovi1 0:9717f3a1d93e 50 for (s = 0; s < 4; s++){
amarkovi1 0:9717f3a1d93e 51 Seg1=SegConvert(10);
amarkovi1 0:9717f3a1d93e 52
amarkovi1 0:9717f3a1d93e 53 wait(0.05);
amarkovi1 0:9717f3a1d93e 54 Seg1=SegConvert(11);
amarkovi1 0:9717f3a1d93e 55 wait(0.05);
amarkovi1 0:9717f3a1d93e 56 Seg1=SegConvert(12);
amarkovi1 0:9717f3a1d93e 57 wait(0.05);
amarkovi1 0:9717f3a1d93e 58 Seg1=SegConvert(13);
amarkovi1 0:9717f3a1d93e 59 wait(0.05);
amarkovi1 0:9717f3a1d93e 60 Seg1=SegConvert(14);
amarkovi1 0:9717f3a1d93e 61 wait(0.05);
amarkovi1 0:9717f3a1d93e 62 Seg1=SegConvert(15);
amarkovi1 0:9717f3a1d93e 63 wait(0.05);
amarkovi1 0:9717f3a1d93e 64 }
amarkovi1 0:9717f3a1d93e 65 Seg1=SegConvert(10);
amarkovi1 0:9717f3a1d93e 66 wait(0.05);
amarkovi1 0:9717f3a1d93e 67 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 68 wait(0.2);
amarkovi1 0:9717f3a1d93e 69
amarkovi1 0:9717f3a1d93e 70 Seg1=SegConvert(98);
amarkovi1 0:9717f3a1d93e 71 wait(0.1);
amarkovi1 0:9717f3a1d93e 72 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 73 wait(0.1);
amarkovi1 0:9717f3a1d93e 74 Seg1=SegConvert(98);
amarkovi1 0:9717f3a1d93e 75 wait(0.1);
amarkovi1 0:9717f3a1d93e 76 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 77 wait(0.1);
amarkovi1 0:9717f3a1d93e 78
amarkovi1 0:9717f3a1d93e 79 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 80 wait(0.5);
amarkovi1 0:9717f3a1d93e 81
amarkovi1 0:9717f3a1d93e 82 // buzzer countdown
amarkovi1 0:9717f3a1d93e 83 buzzer.period(1/(349.2));
amarkovi1 0:9717f3a1d93e 84 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 85 wait(0.5);
amarkovi1 0:9717f3a1d93e 86 buzzer = 0;
amarkovi1 0:9717f3a1d93e 87 wait(0.5);
amarkovi1 0:9717f3a1d93e 88 buzzer.period(1/(349.2));
amarkovi1 0:9717f3a1d93e 89 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 90 wait(0.5);
amarkovi1 0:9717f3a1d93e 91 buzzer = 0;
amarkovi1 0:9717f3a1d93e 92 wait(0.5);
amarkovi1 0:9717f3a1d93e 93 buzzer.period(1/(349.2));
amarkovi1 0:9717f3a1d93e 94 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 95 wait(0.5);
amarkovi1 0:9717f3a1d93e 96 buzzer = 0;
amarkovi1 0:9717f3a1d93e 97 wait(0.5);
amarkovi1 0:9717f3a1d93e 98 buzzer.period(1/(698.5));
amarkovi1 0:9717f3a1d93e 99 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 100 wait(1);
amarkovi1 0:9717f3a1d93e 101 buzzer = 0;
amarkovi1 0:9717f3a1d93e 102 }
amarkovi1 0:9717f3a1d93e 103
amarkovi1 0:9717f3a1d93e 104 void end_sekvenca(){
amarkovi1 0:9717f3a1d93e 105 buzzer.period(1/(698.5));
amarkovi1 0:9717f3a1d93e 106 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 107 wait(0.5);
amarkovi1 0:9717f3a1d93e 108 buzzer.period(1/(659.3));
amarkovi1 0:9717f3a1d93e 109 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 110 wait(0.5);
amarkovi1 0:9717f3a1d93e 111 buzzer.period(1/(622.2));
amarkovi1 0:9717f3a1d93e 112 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 113 wait(0.5);
amarkovi1 0:9717f3a1d93e 114 buzzer.period(1/(587.3));
amarkovi1 0:9717f3a1d93e 115 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 116 wait(0.5);
amarkovi1 0:9717f3a1d93e 117 buzzer.period(1/(554.4));
amarkovi1 0:9717f3a1d93e 118 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 119 wait(1.5);
amarkovi1 0:9717f3a1d93e 120 buzzer = 0;
amarkovi1 0:9717f3a1d93e 121 }
amarkovi1 0:9717f3a1d93e 122
amarkovi1 0:9717f3a1d93e 123 // generira nasaumičan broj
amarkovi1 0:9717f3a1d93e 124 unsigned int nasumican (void){
amarkovi1 0:9717f3a1d93e 125 unsigned int rd = 0;
amarkovi1 0:9717f3a1d93e 126 unsigned int dugi = 0;
amarkovi1 0:9717f3a1d93e 127 for (rd = 0; rd <= 32; rd += 2){
amarkovi1 0:9717f3a1d93e 128 dugi += ((analog.read_u16() ) << rd);
amarkovi1 0:9717f3a1d93e 129 }
amarkovi1 0:9717f3a1d93e 130 return dugi;
amarkovi1 0:9717f3a1d93e 131 }
amarkovi1 0:9717f3a1d93e 132
amarkovi1 0:9717f3a1d93e 133
amarkovi1 0:9717f3a1d93e 134 // ticker za odbrojavanje vremena između generiranja krtica
amarkovi1 0:9717f3a1d93e 135 Ticker nova_krtica;
amarkovi1 0:9717f3a1d93e 136
amarkovi1 0:9717f3a1d93e 137 // generira nove krtice i uspoređuje
amarkovi1 0:9717f3a1d93e 138 void krtica(){
amarkovi1 0:9717f3a1d93e 139
amarkovi1 0:9717f3a1d93e 140 if(r == t){
amarkovi1 0:9717f3a1d93e 141 c++;
amarkovi1 0:9717f3a1d93e 142 if(t != 4){
amarkovi1 0:9717f3a1d93e 143 buzzer.period(1/(587.3));
amarkovi1 0:9717f3a1d93e 144 buzzer = 0.5;
amarkovi1 0:9717f3a1d93e 145 wait(0.05);
amarkovi1 0:9717f3a1d93e 146 buzzer = 0;
amarkovi1 0:9717f3a1d93e 147 }
amarkovi1 0:9717f3a1d93e 148 igra_li_se = 1;
amarkovi1 0:9717f3a1d93e 149 }
amarkovi1 0:9717f3a1d93e 150
amarkovi1 0:9717f3a1d93e 151 else if(r != t){
amarkovi1 0:9717f3a1d93e 152 igra_li_se = 0;
amarkovi1 0:9717f3a1d93e 153 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 154 }
amarkovi1 0:9717f3a1d93e 155
amarkovi1 0:9717f3a1d93e 156 rp = r;
amarkovi1 0:9717f3a1d93e 157
amarkovi1 0:9717f3a1d93e 158 r = nasumican() % 4 + 1;
amarkovi1 0:9717f3a1d93e 159
amarkovi1 0:9717f3a1d93e 160 if(r == rp){
amarkovi1 0:9717f3a1d93e 161 r++;
amarkovi1 0:9717f3a1d93e 162 }
amarkovi1 0:9717f3a1d93e 163 if(r > 4){
amarkovi1 0:9717f3a1d93e 164 r = 1;
amarkovi1 0:9717f3a1d93e 165 }
amarkovi1 0:9717f3a1d93e 166
amarkovi1 0:9717f3a1d93e 167 switch(r){
amarkovi1 0:9717f3a1d93e 168 case 1 : Seg1=SegConvert(10);break;
amarkovi1 0:9717f3a1d93e 169 case 2 : Seg1=SegConvert(16);break;
amarkovi1 0:9717f3a1d93e 170 case 3 : Seg1=SegConvert(13);break;
amarkovi1 0:9717f3a1d93e 171 case 4 : Seg1=SegConvert(99);t=4;break; // t je 4, ako se stisne tipkalo ispadaš
amarkovi1 0:9717f3a1d93e 172 }
amarkovi1 0:9717f3a1d93e 173
amarkovi1 0:9717f3a1d93e 174 }
amarkovi1 0:9717f3a1d93e 175
amarkovi1 0:9717f3a1d93e 176
amarkovi1 0:9717f3a1d93e 177 // main
amarkovi1 0:9717f3a1d93e 178 int main() {
amarkovi1 0:9717f3a1d93e 179
amarkovi1 0:9717f3a1d93e 180 pc.printf("\n\r\n\r\n\r\n\r\n\r\n\r\n\r");
amarkovi1 0:9717f3a1d93e 181 pc.printf("\n\r\n\r-----------\n\r\n\r NOVA IGRA\n\r\n\r-----------\n\r");
amarkovi1 0:9717f3a1d93e 182 pc.printf("\n\r\n\r\n\r\n\r\n\r\n\r\n\r");
amarkovi1 0:9717f3a1d93e 183
amarkovi1 0:9717f3a1d93e 184 start_sekvenca();
amarkovi1 0:9717f3a1d93e 185
amarkovi1 0:9717f3a1d93e 186 debounce.start();
amarkovi1 0:9717f3a1d93e 187
amarkovi1 0:9717f3a1d93e 188 tipka1.mode(PullUp);
amarkovi1 0:9717f3a1d93e 189 tipka2.mode(PullUp);
amarkovi1 0:9717f3a1d93e 190 tipka3.mode(PullUp);
amarkovi1 0:9717f3a1d93e 191
amarkovi1 0:9717f3a1d93e 192 nova_krtica.attach(&krtica,0.7);
amarkovi1 0:9717f3a1d93e 193
amarkovi1 0:9717f3a1d93e 194 while(1) {
amarkovi1 0:9717f3a1d93e 195 tester.rise(&zaustavi_igru);
amarkovi1 0:9717f3a1d93e 196 tipka1.rise(&t1);
amarkovi1 0:9717f3a1d93e 197 tipka2.rise(&t2);
amarkovi1 0:9717f3a1d93e 198 tipka3.rise(&t3);
amarkovi1 0:9717f3a1d93e 199 if(igra_li_se == 1){
amarkovi1 0:9717f3a1d93e 200 // pc.printf("tipka %i segment%i\n\r", t, r);
amarkovi1 0:9717f3a1d93e 201 }
amarkovi1 0:9717f3a1d93e 202 else if(igra_li_se == 0){
amarkovi1 0:9717f3a1d93e 203 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 204 nova_krtica.detach();
amarkovi1 0:9717f3a1d93e 205 if(kraj==0){
amarkovi1 0:9717f3a1d93e 206 end_sekvenca();
amarkovi1 0:9717f3a1d93e 207 kraj++;
amarkovi1 0:9717f3a1d93e 208 }
amarkovi1 0:9717f3a1d93e 209 led1 = !led1;
amarkovi1 0:9717f3a1d93e 210 t = 0;
amarkovi1 0:9717f3a1d93e 211 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));
amarkovi1 0:9717f3a1d93e 212 wait(10);
amarkovi1 0:9717f3a1d93e 213 }
amarkovi1 0:9717f3a1d93e 214
amarkovi1 0:9717f3a1d93e 215 }
amarkovi1 0:9717f3a1d93e 216 }
amarkovi1 0:9717f3a1d93e 217
amarkovi1 0:9717f3a1d93e 218
amarkovi1 0:9717f3a1d93e 219 //prekidi
amarkovi1 0:9717f3a1d93e 220
amarkovi1 0:9717f3a1d93e 221 // prekid za B1 u svrhe testiranja
amarkovi1 0:9717f3a1d93e 222 void zaustavi_igru(void){
amarkovi1 0:9717f3a1d93e 223 if(debounce.read_ms()>100){
amarkovi1 0:9717f3a1d93e 224 led1 = !led1;
amarkovi1 0:9717f3a1d93e 225 // igra_li_se = 0;
amarkovi1 0:9717f3a1d93e 226 debounce.reset();
amarkovi1 0:9717f3a1d93e 227 }
amarkovi1 0:9717f3a1d93e 228 }
amarkovi1 0:9717f3a1d93e 229
amarkovi1 0:9717f3a1d93e 230 //tipka1
amarkovi1 0:9717f3a1d93e 231 void t1(void){
amarkovi1 0:9717f3a1d93e 232 if(debounce.read_ms()>100){
amarkovi1 0:9717f3a1d93e 233
amarkovi1 0:9717f3a1d93e 234 t = 1;
amarkovi1 0:9717f3a1d93e 235 led1 = !led1;
amarkovi1 0:9717f3a1d93e 236 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 237
amarkovi1 0:9717f3a1d93e 238 debounce.reset();
amarkovi1 0:9717f3a1d93e 239 }
amarkovi1 0:9717f3a1d93e 240 }
amarkovi1 0:9717f3a1d93e 241
amarkovi1 0:9717f3a1d93e 242 //tipka2
amarkovi1 0:9717f3a1d93e 243 void t2(void){
amarkovi1 0:9717f3a1d93e 244 if(debounce.read_ms()>100){
amarkovi1 0:9717f3a1d93e 245
amarkovi1 0:9717f3a1d93e 246 t = 2;
amarkovi1 0:9717f3a1d93e 247 led1 = !led1;
amarkovi1 0:9717f3a1d93e 248 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 249
amarkovi1 0:9717f3a1d93e 250 debounce.reset();
amarkovi1 0:9717f3a1d93e 251 }
amarkovi1 0:9717f3a1d93e 252 }
amarkovi1 0:9717f3a1d93e 253
amarkovi1 0:9717f3a1d93e 254 //tipka3
amarkovi1 0:9717f3a1d93e 255 void t3(void){
amarkovi1 0:9717f3a1d93e 256 if(debounce.read_ms()>100){
amarkovi1 0:9717f3a1d93e 257
amarkovi1 0:9717f3a1d93e 258 t = 3;
amarkovi1 0:9717f3a1d93e 259 led1 = !led1;
amarkovi1 0:9717f3a1d93e 260 Seg1=SegConvert(99);
amarkovi1 0:9717f3a1d93e 261
amarkovi1 0:9717f3a1d93e 262 debounce.reset();
amarkovi1 0:9717f3a1d93e 263 }
amarkovi1 0:9717f3a1d93e 264 }
amarkovi1 0:9717f3a1d93e 265
amarkovi1 0:9717f3a1d93e 266
amarkovi1 0:9717f3a1d93e 267 // 7 seg konverter
amarkovi1 0:9717f3a1d93e 268 char SegConvert(char SegValue) { // A 10 (D5), G 16 (D11), D 13 (D8)
amarkovi1 0:9717f3a1d93e 269 char SegByte=0x00;
amarkovi1 0:9717f3a1d93e 270 switch (SegValue) { //DPGFEDCBA
amarkovi1 0:9717f3a1d93e 271 case 0 : SegByte = 0x3F;break; // 00111111 binary
amarkovi1 0:9717f3a1d93e 272 case 1 : SegByte = 0x06;break; // 00000110 binary
amarkovi1 0:9717f3a1d93e 273 case 2 : SegByte = 0x5B;break; // 01011011 binary
amarkovi1 0:9717f3a1d93e 274 case 3 : SegByte = 0x4F;break; // 01001111 binary
amarkovi1 0:9717f3a1d93e 275 case 4 : SegByte = 0x66;break; // 01100110 binary
amarkovi1 0:9717f3a1d93e 276 case 5 : SegByte = 0x6D;break; // 01101101 binary
amarkovi1 0:9717f3a1d93e 277 case 6 : SegByte = 0x7D;break; // 01111101 binary
amarkovi1 0:9717f3a1d93e 278 case 7 : SegByte = 0x07;break; // 00000111 binary
amarkovi1 0:9717f3a1d93e 279 case 8 : SegByte = 0x7F;break; // 01111111 binary
amarkovi1 0:9717f3a1d93e 280 case 9 : SegByte = 0x6F;break; // 01101111 binary
amarkovi1 0:9717f3a1d93e 281
amarkovi1 0:9717f3a1d93e 282 case 10: SegByte = 0x01;break; // 00000001 A
amarkovi1 0:9717f3a1d93e 283 case 11: SegByte = 0x02;break; // 00000010 B
amarkovi1 0:9717f3a1d93e 284 case 12: SegByte = 0x04;break; // 00000100 C
amarkovi1 0:9717f3a1d93e 285 case 13: SegByte = 0x08;break; // 00001000 D
amarkovi1 0:9717f3a1d93e 286 case 14: SegByte = 0x10;break; // 00010000 E
amarkovi1 0:9717f3a1d93e 287 case 15: SegByte = 0x20;break; // 00100000 F
amarkovi1 0:9717f3a1d93e 288 case 16: SegByte = 0x40;break; // 01000000 G
amarkovi1 0:9717f3a1d93e 289 case 98: SegByte = 0x49;break; // 01001001 AGD
amarkovi1 0:9717f3a1d93e 290 case 99: SegByte = 0x00;break; // 00000000 /
amarkovi1 0:9717f3a1d93e 291 }
amarkovi1 0:9717f3a1d93e 292 return SegByte;
amarkovi1 0:9717f3a1d93e 293 }