Igrica Marko Spremic 2020/0066

Dependencies:   mbed Adafruit_GFX

main.cpp

Committer:
markospremic
Date:
2021-11-22
Revision:
0:8e0860720b09

File content as of revision 0:8e0860720b09:

/*
 *Marko Spremic 2020/0066
 *Igrica domaci iz pima
 * Pravila igre:
 *Pomocu potenciometara se krece tackica po ekranu. Cilj je da tackica skuplja "vockice" ( vece tackice po enranu).
 *Pritiskom na taster sw1 igra se zavrsava i prikazuje se rezultat na led displeju. Da bi se ponovo pokrenula igrica potrebno je opet kliknuti taster sw1.
 *Pritiskom na taster sw2 generise se nova vockica na ekranu.
**/
#include "mbed.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GFX_Config.h"
#include "Adafruit_SSD1306.h"


 //I2C bus:
#define SCL PB_13
#define SDA PB_14

//I2C address:
#define I2C_ADDRESS 0x3c
#define I2C_ADD_MBED I2C_ADDRESS<<1
#define I2C_freq 400000

//oled dimensions:
#define OLED_HEIGHT_PX 64
#define OLED_WIDTH_PX 128
 
//definisanje glavnih promenljivih
BusOut led_dis(PA_10, PA_9, PA_8, PB_10, PB_5, PB_4, PB_3, PA_2);
DigitalOut SEL2(PC_7);
DigitalOut SEL1(PB_6);
InterruptIn sw1(PC_9);
InterruptIn sw2(PC_8);
AnalogIn pot1(PA_0);
AnalogIn pot2(PA_1);
I2C i2c_obj(SDA, SCL);
Adafruit_SSD1306_I2c myOLED(i2c_obj, PB_5, I2C_ADD_MBED, OLED_HEIGHT_PX, OLED_WIDTH_PX);
//funkcija za generisanje random broja
int random(int lower, int upper)
{

    return (rand() % (upper - lower + 1)) + lower;
}
//definisanje funkcija
void error(); 
void write_num(int broj);
void end_game();
int x, y, x_obj, y_obj; char endgame = 0;

//glavna funkcija
int main()
{
    sw2.fall(&error);
    sw1.fall(&end_game);
    myOLED.begin();
    i2c_obj.frequency(I2C_freq);
    myOLED.clearDisplay();
    myOLED.display();
    unsigned char count = 0;
    srand(time(0));
    x = 0, y = 0, x_obj = random(0, 127) , y_obj = random(0, 63); char check = 0, d1 = 0, d2 = 0;
    while(1)
    {
        //dok traje igra
        if(!endgame)
        {
            SEL2.write(1);
            SEL1.write(1);
            x = pot1 * 128; y = pot2 * 64;
            myOLED.clearDisplay();
            myOLED.fillRect(x, y, 2, 2, WHITE);
            myOLED.fillRect(x_obj, y_obj, 4, 4, WHITE);
            for(int i = 0; i < 4; i++)
                for(int j = 0; j < 4; j++)
                    if( x == x_obj+i && y == y_obj+j)
                    {
                        check = 1;
                        break;
                    }
            myOLED.display();
            if(check)
            {
                x_obj = random(0, 127) , y_obj = random(0, 63);
                myOLED.display();
                count++;
                d1 = count/10; d2 = count%10;
                d1 = (d1 == 0)? -1: d1;
                check = 0;
            }
        }
        //prikazivanje prednosti u toku pauze izmedju dve igre
        else
        {
            SEL2.write(1);
            SEL1.write(0);
            write_num(d1);
            wait_ms(8);
        
            SEL2.write(0);
            SEL1.write(1);
            write_num(d2);
            wait_ms(8);
            count = 0;
        }
    }
    
}
//generisanje nove vockice
void error()
{
    x_obj = random(0, 127) , y_obj = random(0, 63);
}
//ispisivanje vrednosti na led displeju
void write_num(int broj)
{
    switch(broj)
    {
        case 0: led_dis = 0xC0; break;
        case 1: led_dis = 0xF9; break;
        case 2: led_dis = 0xA4; break;
        case 3: led_dis = 0xB0; break;
        case 4: led_dis = 0x99; break;
        case 5: led_dis = 0x92; break;
        case 6: led_dis = 0x82; break;
        case 7: led_dis = 0xF8; break;
        case 8: led_dis = 0x80; break;
        case 9: led_dis = 0x90; break;
        default: led_dis = 0xFF;
    }
}
//zavrsavanje igrice
void end_game()
{
    endgame++;
    endgame = (endgame > 1) ? 0 : endgame;
}