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

main.cpp

Committer:
amarkovi1
Date:
19 months ago
Revision:
0:9717f3a1d93e

File content as of revision 0:9717f3a1d93e:


#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;
}