Jusuf Delalić / Mbed 2 deprecated PONG

Dependencies:   mbed N5110

Files at this revision

API Documentation at this revision

Comitter:
2019US_JusufDelalic
Date:
Sun Jun 16 21:48:29 2019 +0000
Commit message:
pong

Changed in this revision

N5110.lib Show annotated file Show diff for this revision Revisions of this file
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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/N5110.lib	Sun Jun 16 21:48:29 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/2019US_JusufDelalic/code/N5110/#a97b1765c3e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 16 21:48:29 2019 +0000
@@ -0,0 +1,1196 @@
+#include "mbed.h"
+#include "N5110.h"
+
+#define X_MAX 83
+#define Y_MAX 47
+
+#define dp23 P0_0
+
+DigitalIn taster(dp1);
+bool off = true;
+
+N5110 display(dp4, dp24, dp23, dp25, dp2, dp6, dp18);
+
+
+class Lopta;
+
+class Reket;
+
+class Ekran;
+
+enum FillType {
+    FILL_TRANSPARENT, ///< Transparent with outline
+    FILL_BLACK,       ///< Filled black
+    FILL_WHITE,       ///< Filled white (no outline)
+};
+
+
+AnalogIn lijeviVRy(dp10);                                                      //joystick
+AnalogIn desniVRy(dp11);
+DigitalIn lijeviSW(dp9);
+DigitalIn desniSW(dp13);
+
+enum Pozicija {
+    Gore = 1, Centar = 0, Dolje = -1
+} pozicijaLijevi = Centar, pozicijaDesni = Centar; // provejriti je li dekalsrisano.,.........
+
+float lijeviJoy = lijeviVRy; // vrijednost od 0 do 1
+float desniJoy = desniVRy;   // vrijednost od 0 do 1
+
+DigitalOut enableLed(dp14);
+
+int tasterPressed(bool &off)
+{
+    if (off && taster) {
+        off = false;
+        return 1;
+    } else if (!taster)
+        off = true;
+
+    return 0;
+}
+
+
+void azurirajPozicijuLijevi()
+{
+    lijeviJoy = lijeviVRy;
+    Pozicija novaPozicija;
+
+    if (lijeviJoy < 1.0 / 3.0 + 0.08) novaPozicija = Dolje;
+    else if (lijeviJoy > 2.0 / 3.0 - 0.08) novaPozicija = Gore;
+    else
+        novaPozicija = Centar;
+
+    if (novaPozicija != pozicijaLijevi)
+        pozicijaLijevi = novaPozicija;
+
+}
+
+void azurirajPozicijuDesni()
+{
+    desniJoy = desniVRy;
+    Pozicija novaPozicija;
+
+    if (desniJoy < 1.0 / 3.0 + 0.08) novaPozicija = Dolje;
+    else if (desniJoy > 2.0 / 3.0 - 0.08) novaPozicija = Gore;
+    else
+        novaPozicija = Centar;
+
+    if (novaPozicija != pozicijaDesni)
+        pozicijaDesni = novaPozicija;
+};
+
+
+class Lopta
+{
+    int x, y;                        // koordinate centra
+    int radius;                      // poluprecnik lopte
+    int delta_x, delta_y;            // pomjeraj - ovisi o modu igre ? // ili wait promijeniti?
+
+public:
+
+    Lopta(int x, int y, int radius, int delta_x, int delta_y) : x(x), y(y), radius(radius), delta_x(delta_x),
+        delta_y(delta_y) {}
+
+    int getX() const
+    {
+        return x;
+    }
+
+    void setX(int x)
+    {
+        Lopta::x = x;
+    }
+
+    int getY() const
+    {
+        return y;
+    }
+
+    void setY(int y)
+    {
+        Lopta::y = y;
+    }
+
+    int getRadius() const
+    {
+        return radius;
+    }
+
+
+    int getDelta_x() const
+    {
+        return delta_x;
+    }
+
+    void setDelta_x(int delta_x)
+    {
+        Lopta::delta_x = delta_x;
+    }
+
+    int getDelta_y() const
+    {
+        return delta_y;
+    }
+
+    void setDelta_y(int delta_y)
+    {
+        Lopta::delta_y = delta_y;
+    }
+
+    void pomjeri(N5110 &display)
+    {
+        display.drawCircle(x, y, radius, FILL_BLACK);                // brisemo li staru vrijendost
+        x += delta_x;                                                // crta staru vrijednost i azurira koordinate
+        y += delta_y;
+    }
+
+    void nacrtaj(N5110 &display)           // crtamo na zeljenoj koordinati koju navodimu paremtrima
+    {
+        display.drawCircle(x, y, radius, FILL_BLACK);
+    }
+
+    void obrniY()
+    {
+        delta_y *= -1;
+    }
+
+
+    bool isUdarilaDesniReket(Reket &desniReket);
+
+    bool isUdarilaLijeviReket(Reket &lijeviReket);
+
+    bool udarilaGornjiOkvir()
+    {
+
+        return y - radius <= 0;
+
+    }
+
+    bool udarilaDonjiOkvir()
+    {
+
+        return y + radius >= Y_MAX;
+
+    }
+
+    // u ovisnosti od ugla odbijanja lopte (ako je udarila reket) ili ako je udarila u okvir, azuriraju se vrijednosti pomaka
+    void promijeniKretanje(Reket &lijeviReket, Reket &desniReket);
+
+    // ugao pod kojim se vraca prilikom odbijanja od reket, poziva se samo ako znamo da je lopta udarila u reket
+    int dajUgao(int y_R, int h)
+    {
+
+        if (y <= y_R - h + 4. / 10 * h) return 60;
+        else if (y <= y_R - h + 8. / 10 * h) return 45;
+        else if (y <= y_R - h + 12. / 10 * h) return 0;
+        else if (y <= y_R - h + 16. / 10 * h) return -45;
+        return -60;
+
+    }
+
+
+    void neIzlaziVanOkvira()
+    {
+
+        if (x + radius >= X_MAX)
+            x = X_MAX - radius;
+
+        if (x - radius <= 0)
+            x = radius;
+
+        if (y + radius >= Y_MAX)
+            y = Y_MAX - radius;
+
+        if (y - radius <= 0)
+            y = radius;
+
+
+    }
+
+};
+
+
+class Reket
+{
+    int x, y;              // koordinate centra
+    int h, d;              // visina reketa od centra-> pozitivna vrijednost, d -> debljina reketa (2 piksela zasad)
+    int bodovi;            // ostvareni bodovi igraca
+
+public:
+
+    Reket(int x, int y, int h, int d) : x(x), y(y), h(h), d(d), bodovi(0) {}
+
+    void setX(int x)
+    {
+        Reket::x = x;
+    }
+
+    int getY() const
+    {
+        return y;
+    }
+
+    void setY(int y)
+    {
+        Reket::y = y;
+    }
+
+    int getH() const
+    {
+        return h;
+    }
+
+    int getBodovi() const
+    {
+        return bodovi;
+    }
+
+    int getD() const
+    {
+        return d;
+    }
+
+    void pomjeri(N5110 &display, int delta)
+    {
+        // delta predstavlja inkrement prilikom razicitih modova
+        display.drawRect(x - d / 2, y - h, d, 2 * h, FILL_BLACK);
+        y += delta;
+    }
+
+    void nacrtaj(N5110 &display)
+    {
+        display.drawRect(x - d / 2, y - h, d, 2 * h, FILL_BLACK);
+    }
+
+    // da li je lijevi reket osvojio poen
+    bool osvojioPoenLijeviReket(Lopta &lopta, Reket &desniReket);
+
+    bool osvojioPoenDesniReket(Lopta &lopta, Reket &lijeviReket);
+
+    void dodajPoen()
+    {
+
+        ++bodovi;
+
+    }
+
+    void neIzlaziVanOkvira()
+    {
+
+        if (y + h >= Y_MAX)
+            y = Y_MAX - h;
+
+        if (y - h <= 0)
+            y = h;
+
+
+    }
+
+};
+
+
+bool Lopta::isUdarilaDesniReket(Reket &desniReket)
+{
+
+    return ((x + radius >= X_MAX - desniReket.getD()) && (delta_x > 0) &&
+            (y + radius >= desniReket.getY() - desniReket.getH()) &&
+            (y - radius <= desniReket.getY() + desniReket.getH()));
+
+}
+
+bool Lopta::isUdarilaLijeviReket(Reket &lijeviReket)
+{
+
+    return ((x - radius <= lijeviReket.getD()) && (delta_x < 0) &&
+            (y + radius >= lijeviReket.getY() - lijeviReket.getH()) &&
+            (y - radius <= lijeviReket.getY() + lijeviReket.getH()));
+
+}
+
+
+// OVA METODA SE POZIVA ZA KRETANJE LOPTE
+
+void Lopta::promijeniKretanje(Reket &lijeviReket, Reket &desniReket)
+{
+
+    int ugao(0);
+
+    if (isUdarilaLijeviReket(lijeviReket)) {
+
+        ugao = dajUgao(lijeviReket.getY(), lijeviReket.getH());
+
+        if (ugao == 0) {
+
+            delta_x = 1;
+            delta_y = 0;
+
+        } else if (ugao == 45) {
+
+            delta_x = 1;
+            delta_y = -1;
+
+        } else if (ugao == 60) {
+
+            delta_x = 1;
+            delta_y = -2;
+
+        } else if (ugao == -45) {
+
+            delta_x = 1;
+            delta_y = 1;
+
+        } else if (ugao == -60) {
+
+            delta_x = 1;
+            delta_y = 2;
+
+        }
+
+    } else if (isUdarilaDesniReket(desniReket)) {
+
+        ugao = 180 - dajUgao(desniReket.getY(), desniReket.getH());
+
+        if (ugao == 180) {
+
+            delta_x = -1;
+            delta_y = 0;
+
+        } else if (ugao == 135) {
+
+            delta_x = -1;
+            delta_y = -1;
+
+        } else if (ugao == 120) {
+
+            delta_x = -1;
+            delta_y = -2;
+
+        } else if (ugao == 225) {
+
+            delta_x = -1;
+            delta_y = 1;
+
+        } else if (ugao == 240) {
+
+            delta_x = -1;
+            delta_y = 2;
+
+        }
+
+    } else if (udarilaGornjiOkvir() || udarilaDonjiOkvir())
+        obrniY();
+
+
+}
+
+
+bool Reket::osvojioPoenLijeviReket(Lopta &lopta, Reket &desniReket)
+{
+
+    return (lopta.getX() + lopta.getRadius() >= X_MAX && lopta.getY() - lopta.getRadius() >= 0 &&
+            lopta.getY() + lopta.getRadius() <= Y_MAX) && !lopta.isUdarilaDesniReket(desniReket);
+
+}
+
+bool Reket::osvojioPoenDesniReket(Lopta &lopta, Reket &lijeviReket)
+{
+
+    return (lopta.getX() - lopta.getRadius() <= 0 && lopta.getY() - lopta.getRadius() >= 0 &&
+            lopta.getY() + lopta.getRadius() <= Y_MAX) && !lopta.isUdarilaLijeviReket(lijeviReket);
+
+}
+
+
+class Ekran
+{
+    N5110 display;
+
+public:
+
+
+    Ekran(PinName vcc, PinName sce, PinName rst, PinName dc, PinName mosi, PinName sclk, PinName led) :
+        display(vcc,
+                sce,
+                rst,
+                dc,
+                mosi,
+                sclk,
+                led) {}
+
+    void init()
+    {
+
+        display.init();
+
+    }
+
+    void refresh()
+    {
+
+
+        display.refresh();
+
+    }
+
+    void clear()
+    {
+
+        display.clear();
+
+    }
+
+    void turnOff()
+    {
+        display.turnOff();
+    }
+
+    N5110 &getDisplay()
+    {
+
+        return this->display;
+
+    }
+
+    void nacrtajMrezu()
+    {
+        display.drawLine(X_MAX / 2, 0, X_MAX / 2, Y_MAX, 2);
+    }
+
+
+    void InitialScreen()                                                          // ispisuje imena
+    {
+
+        clear();
+        char ime1[] = "Jusuf Delalic";
+        char ime2[] = "Medin Paldum";
+
+        display.printString(ime1, 3, 2);
+        display.printString(ime2, 6, 3);
+        refresh();
+    }
+
+
+    // opcija ovisi od joysitcka
+    void StartMenu(int opcija)                                                  // 1 = start, 0 = exit
+    {
+        display.clear();
+        // opcija je broj koji govori na kojem nivou je joystick
+
+        char startMenu[] = "Start menu";
+        char exitOption[] = "Exit";
+        char start[] = "Start";
+
+        display.printString(startMenu, 12, 0);
+
+        display.printString(start, 42, 2);
+
+        display.printString(exitOption, 42, 3);
+
+
+        if (opcija == 1) {
+            display.drawLine(27, 16, 39, 16, 2);                           //linija na start
+        } else {
+            display.drawLine(27, 28, 39, 28, 2);                           // linija na exit
+        }
+
+        display.refresh();
+    }
+
+
+    void SelectMode(int opcija)                                              // 1 - single, 2 - multi
+    {
+
+        display.clear();
+
+
+        display.printString("Select mode", 12, 0);
+        display.printString("Single", 42, 2);
+        display.printString("Multi", 42, 3);
+
+        if (opcija == 1) {
+            display.drawLine(27, 16, 39, 16, 2);        // linija na single
+
+        } else { // izmjena
+            display.drawLine(27, 28, 39, 28, 2);        // linija na multi
+
+
+        }
+
+        display.refresh();
+
+    };
+
+
+    void SelectDifficulty(int opcija)                                          // 1 - east, 2 - medium, 3 - hard
+    {
+
+        display.clear();
+        char select[] = "Select mode";
+        char easy[] = "Easy";
+        char medium[] = "Medium";
+        char hard[] = "Hard";
+
+        display.printString(select, 12, 0);
+
+        display.printString(easy, 36, 2);
+
+        display.printString(medium, 36,3);
+
+        display.printString(hard, 36, 4);
+
+        switch (opcija) {
+            case 1:
+                display.drawLine(21, 21, 33, 21, 2);                        //easy
+                break;
+
+            case 2:
+                display.drawLine(21, 27, 33, 27, 2);                        //medium
+                break;
+
+            default:
+                display.drawLine(21, 33, 33, 33, 2);                        //hard
+                break;
+        }
+
+        display.refresh();
+
+    }
+
+
+    void postaviCentrirano(Reket &lijeviReket, Reket &desniReket, Lopta &lopta)
+    {
+
+        display.clear();
+
+        lijeviReket.setX(lijeviReket.getD() / 2);
+        lijeviReket.setY(Y_MAX / 2);
+
+        desniReket.setX(X_MAX - desniReket.getD() / 2);
+        desniReket.setY(Y_MAX / 2);
+
+        lopta.setX(X_MAX / 2);
+        lopta.setY(Y_MAX / 2);
+
+        lijeviReket.nacrtaj(display);
+
+        desniReket.nacrtaj(display);
+        lopta.nacrtaj(display);
+
+        display.refresh();
+
+
+    }
+
+    void ispisiBodove(Reket &lijeviReket, Reket &desniReket)
+    {
+
+        int xLijevo = 3 / 8 * X_MAX - 6;
+        int xDesno = 5 / 8 * X_MAX;
+
+
+        // ne clear jer imamo rekete i loptu
+
+        if (lijeviReket.getBodovi() >=
+                10) {                                                    // ispisivanje rezultata
+            // (pazimo kada je u pitanju dvocifren broj)
+
+            display.printChar(xLijevo + 6, 0, '1');
+            display.printChar(xLijevo + 6, 0, '0' + lijeviReket.getBodovi() % 10);
+
+        } else {
+            display.printChar(xLijevo + 6, 0, '0' + lijeviReket.getBodovi());
+            display.refresh();
+        }
+
+
+        if (desniReket.getBodovi() >= 10) {
+            display.printChar(xDesno, 0, '1' + lijeviReket.getBodovi() % 10);
+            display.printChar(xDesno + 6, 0, '0' + lijeviReket.getBodovi() % 10);
+        } else {
+            display.printChar(xDesno, 0, '0' + desniReket.getBodovi());
+        }
+
+        display.refresh();
+    }
+
+
+    void GameOver(int mode, int winner)                                      // mode 1 -> igrac; mode 2 -> computer
+    {
+        display.clear();
+        // winner = {1,2}
+        display.printString("Game over", 15, 0);
+
+
+        if (mode == 1) {
+            if (winner == 1) {
+                display.printString("Player won", 12, 2);
+
+            } else {
+                display.printString("Computer won", 6, 2);
+
+            }
+
+        } else {
+            if (winner == 1) {
+                display.printString("Player 1 won", 6, 2);
+
+            } else {
+                display.printString("Player 2 won", 6, 2);
+
+            }
+
+        }
+
+        display.refresh();
+
+    }
+
+    /* Prilikom ispisivanja teksta na ekran pretpostavili smo da kao koordinate pocetka saljemo donji lijevi pixel */
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class Pong
+{
+
+    int tokIgre;                         // pocetak igre
+    int mode;                            // signle player
+    int tezina;                          // easy / medium / hard
+    int zapocetiIgru;                    // start/exit
+    int pobjednik;
+
+    Lopta lopta;
+    Reket lijeviReket, desniReket;          // lijevi - Pl1 / desni - Pl2
+
+    Ekran display;
+
+public:
+
+    Pong(int &tokIgre, Lopta &lopta, Reket &lijeviReket, Reket &desniReket, Ekran &display) :
+        tokIgre(tokIgre), lopta(lopta), lijeviReket(lijeviReket), desniReket(desniReket), display(display)
+    {
+        tokIgre = 0;
+        mode = 1;
+        tezina = 1;
+        zapocetiIgru = 1;
+        pobjednik = 0;
+    }
+
+    void setMode(int mode)
+    {
+        Pong::mode = mode;
+    }
+
+    void setTezina(int tezina)
+    {
+        Pong::tezina = tezina;
+    }
+
+    void setPobjednik(int pobjednik)
+    {
+        Pong::pobjednik = pobjednik;
+    }
+
+
+    void setZapocetiIgru(int zapocetiIgru)
+    {
+        Pong::zapocetiIgru = zapocetiIgru;
+    }
+
+    void inicijalnoStanje()
+    {
+        // display.InitialScreen(display);
+        wait(3);
+        ++tokIgre;
+    }
+
+    void startGameStanje(int odabir)
+    {
+        //  display.StartMenu(odabir); // izmjena - true
+    }
+
+    void modeStanje(int mode)
+    {
+        //  display.SelectMode(mode);
+        // pritisnut taster
+        this->mode = mode;
+    }
+
+    void tezinaStanje(int tezina)
+    {
+        //  display.SelectDifficulty(tezina);
+        // pritisnut taster
+        this->tezina = tezina;
+    }
+
+    void igraStanje()
+    {
+        if (lijeviReket.getBodovi() >= 11 || desniReket.getBodovi() >= 11) {
+            tokIgre++;
+        } else {
+
+            int osvojioBod = 1;                         // centrirati loptu i rekete
+            bool centrirano = true;
+            if (lijeviReket.osvojioPoenLijeviReket(lopta, desniReket)) {
+                lijeviReket.dodajPoen();
+                osvojioBod = 1;
+                centrirano = true;
+
+            } else if (desniReket.osvojioPoenDesniReket(lopta, lijeviReket)) {
+                desniReket.dodajPoen();
+                osvojioBod = 1;
+                centrirano = true;
+            }
+
+            if (centrirano) {
+                if (tasterPressed(off)) {
+                    centrirano = false;
+                    if (osvojioBod == 1) {
+                        lopta.setDelta_x(-1);
+                        lopta.setDelta_y(-1);
+                    } else if (osvojioBod == 2) {
+                        lopta.setDelta_x(1);
+                        lopta.setDelta_y(1);
+                    }
+                }
+            }
+            lopta.promijeniKretanje(lijeviReket, desniReket);
+            //     lopta.pomjeri(display.getDisplay());
+
+            lijeviReket.setY(lijeviReket.getY() + pozicijaLijevi);
+            desniReket.setY(desniReket.getY() + pozicijaDesni);
+
+            //   lijeviReket.pomjeri(display.getDisplay(), mode);
+            //  desniReket.pomjeri(display.getDisplay(), mode);
+        }
+
+
+    }
+
+    void gameOverStanje()
+    {
+        //   display.GameOver(mode, pobjednik);
+        wait(3);
+
+        tokIgre = 1;                         // vrati na odabir
+        mode = 1;                            // signle player
+        tezina = 1;                          // easy / medium / hard
+        zapocetiIgru = 1;                    // start/exit
+        pobjednik = 0;
+    }
+
+    void izadjiStanje()
+    {
+//       display.getDisplay().clear();
+    }
+
+
+};
+
+
+Ekran ekran(dp4, dp24, dp23, dp25, dp2, dp6, dp18);
+//Pong igra(tokIgre, lopta, lijevi, desni, ekran);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+int main()
+{
+
+    enableLed = 1;                                                                  // gasimo ledice
+    lijeviSW.mode(PullUp);
+    desniSW.mode(PullUp);
+
+    ekran.init();
+    ekran.clear();
+
+    int tokIgre = 0;
+    Reket lijevi(1, Y_MAX / 2, 6, 2);                              // kreiramo desni, lijevi reket i loptu
+    Reket desni(82, Y_MAX / 2, 6, 2);
+    Lopta lopta(X_MAX / 2, Y_MAX / 2, 1, 0, 0);
+
+
+    int biranjeOpcije = 1;
+
+    ekran.InitialScreen(); // ----------------------------------------------------------------------------------------------------------------------------
+    wait(3);
+
+
+    pozicijaLijevi = Centar;
+    pozicijaDesni = Centar;
+
+    tokIgre++;
+
+    bool pritisnutTaster = false;
+
+    int mode = 1; // single player
+    int winner = 1; // player1
+    int difficulty = 1; // easy
+
+    //bool poIelaIgra = false;
+
+    while (1) {
+
+        biranjeOpcije = 1; // start
+        // Start/Exit
+        while (tokIgre == 1) {
+
+            pritisnutTaster = tasterPressed(off);
+            pozicijaLijevi = Centar;
+            pozicijaDesni = Centar;
+
+
+            ekran.clear();
+            ekran.StartMenu(biranjeOpcije);
+            wait(0.5);
+
+            ekran.refresh();
+
+
+            azurirajPozicijuLijevi();
+
+            if (pozicijaLijevi % 2 != 0) {
+
+                if (biranjeOpcije == 1)
+                    biranjeOpcije = 0;
+
+                else biranjeOpcije = 1;
+
+            }
+
+            if (pritisnutTaster) {
+                if (biranjeOpcije == 0) {
+                    ekran.clear();
+                    ekran.turnOff();
+                    return 0;
+
+                } else {
+
+                    ++tokIgre;
+                }
+
+            }
+
+        }
+
+
+        biranjeOpcije = 1;
+        // Singleplayer, Multiplayer
+        while (tokIgre == 2) {
+
+            ekran.clear();
+
+            pritisnutTaster = tasterPressed(off);
+            // single player
+            pozicijaLijevi = Centar;
+            pozicijaDesni = Centar;
+
+
+            ekran.SelectMode(biranjeOpcije);
+            ekran.refresh();
+            wait(0.5);
+
+
+            azurirajPozicijuLijevi();
+
+            if (pozicijaLijevi % 2 != 0) {
+
+                if (biranjeOpcije == 1)
+                    biranjeOpcije = 0;
+                else biranjeOpcije = 1;
+
+            }
+
+
+            if (pritisnutTaster) {
+                if (biranjeOpcije == 0) mode = 2; // multiplayer
+                else if (biranjeOpcije == 1) mode = 1; // single player
+
+
+                ++tokIgre;
+            }
+
+
+        }
+
+
+        biranjeOpcije = 0;
+        // Easy - 1, Medium - 2, Hard - 3
+        while (tokIgre == 3) {
+
+            ekran.clear();
+            pritisnutTaster = tasterPressed(off);
+
+            pozicijaLijevi = Centar;
+            pozicijaDesni = Centar;
+
+
+            if (biranjeOpcije == 0) {
+                ekran.SelectDifficulty(1);
+
+            } else if (biranjeOpcije == 1) {
+                ekran.SelectDifficulty(3);
+
+            } else if (biranjeOpcije == 2) {
+                ekran.SelectDifficulty(biranjeOpcije);
+
+            }
+
+            azurirajPozicijuLijevi(); // mozda na ticker...
+
+            if (pozicijaLijevi == Dolje)
+                biranjeOpcije++;
+
+            else if (pozicijaLijevi == Gore)
+                biranjeOpcije--;
+
+            while (biranjeOpcije < 0)
+                biranjeOpcije += 3;
+
+            biranjeOpcije %= 3;
+
+
+            if (pritisnutTaster) {
+                //igra.setTezina(biranjeOpcije + 1);
+                if (biranjeOpcije == 0) difficulty = 1;
+                else if (biranjeOpcije == 1) difficulty = 3;
+                else difficulty = 2;
+
+                ekran.clear();
+                ekran.refresh();
+                ++tokIgre;
+            }
+
+            ekran.refresh();
+            wait(0.5);
+
+
+        }
+
+        // pocetno stanje igre...
+        if (tokIgre == 4) {
+
+            ekran.clear();
+            ekran.postaviCentrirano(lijevi, desni, lopta);
+            ekran.ispisiBodove(lijevi, desni);
+            ekran.refresh();
+
+            wait(1.5);
+
+            lopta.setDelta_x(2);
+            lopta.setDelta_y(2);
+        }
+
+
+        while (tokIgre == 4) {
+            
+
+            if (mode == 1) {
+
+                // Single player
+                ekran.clear();
+                if (lijevi.osvojioPoenLijeviReket(lopta, desni) || desni.osvojioPoenDesniReket(lopta, lijevi)) {
+
+                    ekran.clear();
+                    ekran.postaviCentrirano(lijevi, desni, lopta);
+                    lopta.setDelta_x(2);
+                    lopta.setDelta_y(2);
+                
+
+                    if (lijevi.osvojioPoenLijeviReket(lopta, desni))
+                        lijevi.dodajPoen();
+
+                    else desni.dodajPoen();
+
+                    ekran.ispisiBodove(lijevi, desni);
+                    ekran.refresh();
+
+                    wait(1.5); // prikazujemo centrirano 1.5 sekundi nakon cega lopta pocinje kretanje prema nekom od igraca
+
+                }
+
+
+                if (lijevi.getBodovi() >= 11 || desni.getBodovi() >= 11)
+                    ++tokIgre;
+
+                if (tokIgre != 4)
+                    break;
+
+                azurirajPozicijuLijevi();
+
+                int delta_lijevi = pozicijaLijevi * 2;
+                int delta_desni;
+
+                if (lopta.getY() > desni.getY())
+                    delta_desni = 2; // idi dolje
+
+                else if (lopta.getY() > desni.getY())
+                    delta_desni = -2; // idi gore
+
+                else delta_desni = 0;
+
+                lopta.promijeniKretanje(lijevi, desni);
+
+
+                lopta.neIzlaziVanOkvira();
+                lijevi.neIzlaziVanOkvira();
+                desni.neIzlaziVanOkvira();
+
+                ekran.clear();
+
+                lijevi.pomjeri(ekran.getDisplay(), delta_lijevi);
+                desni.pomjeri(ekran.getDisplay(), delta_desni);
+                lopta.pomjeri(ekran.getDisplay());
+                ekran.ispisiBodove(lijevi, desni);
+
+                if (difficulty == 2) {
+
+                    lopta.setDelta_y(lopta.getDelta_y() * 1.5);
+                    lopta.setDelta_x(lopta.getDelta_x() * 1.5);
+
+                    delta_desni *= 1.5;
+                } else if (difficulty == 3) {
+
+                    lopta.setDelta_y(lopta.getDelta_y() * 2.5);
+                    lopta.setDelta_x(lopta.getDelta_x() * 2.5);
+
+                    delta_desni *= 2.5;
+
+                }
+
+                ekran.refresh();
+                wait(0.2);
+
+            } else {
+
+                ekran.clear();
+
+
+                if (lijevi.osvojioPoenLijeviReket(lopta, desni) || desni.osvojioPoenDesniReket(lopta, lijevi)) {
+
+                    ekran.clear();
+                    ekran.postaviCentrirano(lijevi, desni, lopta);
+                    lopta.setDelta_x(2);
+                    lopta.setDelta_y(2);
+
+                    if (lijevi.osvojioPoenLijeviReket(lopta, desni))
+                        lijevi.dodajPoen();
+
+                    else desni.dodajPoen();
+
+                    ekran.ispisiBodove(lijevi, desni);
+                    ekran.refresh();
+
+                    wait(1.5); // prikazujemo centrirano 1.5 sekundi nakon cega lopta pocinje kretanje prema nekom od igraca
+
+                }
+
+
+                if (lijevi.getBodovi() >= 11 || desni.getBodovi() >= 11)
+                    ++tokIgre;
+
+                if (tokIgre != 4)
+                    break;
+
+
+                azurirajPozicijuDesni();
+                azurirajPozicijuLijevi();
+
+                int delta_lijevi = pozicijaLijevi * 2;// neka funkcija od lijevog joysticka koja se poziva tickerom
+                int delta_desni = pozicijaDesni * 2;// neka funkcija od desnog joysticka koja se poziva tickerom
+                lopta.promijeniKretanje(lijevi, desni);
+
+                lopta.neIzlaziVanOkvira();
+                lijevi.neIzlaziVanOkvira();
+                desni.neIzlaziVanOkvira();
+
+
+                ekran.clear();
+
+                lijevi.pomjeri(ekran.getDisplay(), delta_lijevi);
+                desni.pomjeri(ekran.getDisplay(), delta_desni);
+                lopta.pomjeri(ekran.getDisplay());
+                ekran.ispisiBodove(lijevi, desni);
+
+                ekran.refresh();
+
+                if (difficulty == 2) {
+
+                    lopta.setDelta_y(lopta.getDelta_y() * 1.5);
+                    lopta.setDelta_x(lopta.getDelta_x() * 1.5);
+
+                    delta_desni *= 1.5;
+                    delta_lijevi *= 1.5;
+
+
+                } else if (difficulty == 3) {
+
+                    lopta.setDelta_y(lopta.getDelta_y() * 2.5);
+                    lopta.setDelta_x(lopta.getDelta_x() * 2.5);
+
+                    delta_desni *= 2.5;
+                    delta_lijevi *= 2.5;
+
+
+                }
+
+                wait(0.3);
+
+            }
+
+
+        }
+        biranjeOpcije = 1;
+        // Game Over
+        if (tokIgre == 5) {
+
+            ekran.clear();
+            if (lijevi.getBodovi() == 11)
+                winner = 1;
+            else winner = 2;
+
+            ekran.GameOver(mode, winner);
+            ekran.refresh();
+            wait(3);
+            tokIgre = 1;
+        }
+
+
+    } // kraj beskonacne while petlje
+
+} // kraj main -a
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Jun 16 21:48:29 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file