Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:59961b55c453, 2019-06-15 (annotated)
- Committer:
- 2019US_DenisSelimovi
- Date:
- Sat Jun 15 23:11:24 2019 +0000
- Revision:
- 0:59961b55c453
//
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| 2019US_DenisSelimovi | 0:59961b55c453 | 1 | #include "mbed.h" | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 2 | #include "SPI_TFT_ILI9341.h" | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 3 | #include "Arial12x12.h" | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 4 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 5 | #define dp23 P0_0 | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 6 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 7 | //deklaracija display-a | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 8 | SPI_TFT_ILI9341 display(dp2, dp1, dp6, dp24, dp23, dp25, "TFT"); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 9 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 10 | //analogni ulazi za joystick | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 11 | AnalogIn VRx(dp11); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 12 | AnalogIn VRy(dp10); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 13 | //taster na joysticku za rotaciju | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 14 | InterruptIn taster(dp9); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 15 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 16 | AnalogIn random(dp13); //analogni ulaz za generisanje random vrijednosti | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 17 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 18 | //ticker za spustanje figure | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 19 | //timer za debouncing tastera na joysticku | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 20 | Ticker game, joystick; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 21 | Timer debounceTaster; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 22 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 23 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 24 | unsigned char level = 0; //mora biti tipa usigned char jer inače se može desiti da level bude manji od 0, a i da ne trošimo memoriju | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 25 | const float delays[3] = {1.2, 1, 0.7}; //svakih koliko se spusti jedan red, ovo provjeriti da li je presporo ili prebrzo, ovisi o levelu | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 26 | char leftBoundary = 1, rightBoundary = 5, downBoundary = 1, upBoundary = 5;// sada je ovo tipa char | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 27 | unsigned int score = 0; //stavio sam ovo unsigned int za veći opseg, mada je jako teško da se i int premaši, ali nmvz | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 28 | bool firstTime = true; //ako je prvi put, figura se crta u Tickeru | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 29 | bool gameStarted = false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 30 | unsigned char nextFigure = 1; //ovo je sad globalna varijabla, da bi mogli unaprijed generisati sljedeću figuru radi prikaza | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 31 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 32 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 33 | //white - no figure | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 34 | //I - BLUE | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 35 | //O - YELLOW | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 36 | //T - PURPLE | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 37 | //S - GREEN | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 38 | //Z - RED | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 39 | //J - MAROON | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 40 | //L - ORANGE | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 41 | const int colors[8] = {White, Blue, Yellow, Purple, Green, Red, Maroon, Orange}; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 42 | const short DIMENSION = 16; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 43 | const short DIMENSION_NEXT = 12; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 44 | short board[20][10] = {0}; //matrica boja, 0 - 7 indeksi boja | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 45 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 46 | short figuresX[7][4] = {{0,0,0,0}, {0,0,1,1}, {0,1,1,1}, {1,1,0,0}, {0,1,0,1}, {1,1,1,0}, {1,1,1,0}}; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 47 | short figuresY[7][4] = {{0,1,2,3}, {1,0,0,1}, {1,1,2,0}, {0,1,1,2}, {0,1,1,2}, {2,1,0,0}, {0,1,2,2}}; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 48 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 49 | unsigned int GenerateRandomSeed() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 50 | unsigned int randomNumber = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 51 | for(int i = 0; i <= 32; i += 2) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 52 | randomNumber += ((random.read_u16() % 3) << i); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 53 | wait_us(10); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 54 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 55 | return randomNumber; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 56 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 57 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 58 | void Init() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 59 | //ovo su zajedničke osobine za sve prikaze na display-u | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 60 | //nikad se ne mijenjaju i pozvat ćemo je jednom prije petlje | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 61 | display.claim(stdout); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 62 | display.set_orientation(2); // 2 ili 0, zavisi kako okrenemo display, provjerit ćemo na labu kako nam je najlakše povezat | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 63 | display.set_font((unsigned char*) Arial12x12); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 64 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 65 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 66 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 67 | void ShowScore() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 68 | //pomocna funkcija za prikazivanje score-a | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 69 | display.fillrect(165, 20, 235, 50, White); //popunimo pravugaonik da obrišemo stari score | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 70 | display.locate(200, 35); //valjda je na sredini pravougaonika | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 71 | printf("%d", score); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 72 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 73 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 74 | void ShowNextFigure() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 75 | //prikaz sljedeće figure koristeći pomoćnu varijablu nextFigure | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 76 | display.fillrect(165, 70, 235, 120, White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 77 | int upperLeftX = 176, upperLeftY = 83; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 78 | for(int i = 0; i < 4; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 79 | int x = upperLeftX + DIMENSION_NEXT * figuresY[nextFigure - 1][i], y = upperLeftY + DIMENSION_NEXT * figuresX[nextFigure - 1][i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 80 | display.fillrect(x, y, x + DIMENSION_NEXT, y + DIMENSION_NEXT, colors[nextFigure]); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 81 | display.rect(x, y, x + DIMENSION_NEXT, y + DIMENSION_NEXT, Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 82 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 83 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 84 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 85 | //funkcija za crtanje cursora za odabir levela | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 86 | void DrawCursor(int color, unsigned char lev) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 87 | display.fillrect(60, (lev + 1) * 100 - 50, 72, (lev + 1) * 100 - 50 + 12, color); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 88 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 89 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 90 | void ShowLevelMenu() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 91 | //ovdje inicijalizujemo display | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 92 | display.cls(); // brišemo prethodno | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 93 | display.background(Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 94 | display.foreground(White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 95 | display.locate(80, 50); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 96 | printf("LEVEL 1"); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 97 | display.locate(80, 150); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 98 | printf("LEVEL 2"); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 99 | display.locate(80, 250); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 100 | printf("LEVEL 3"); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 101 | DrawCursor(White, level); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 102 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 103 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 104 | void ReadJoystickForLevel(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 105 | unsigned char old = level; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 106 | if(VRy < downBoundary / 6.0){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 107 | upBoundary = 4; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 108 | (level == 0) ? level = 2 : level--; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 109 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 110 | else if(VRy > upBoundary / 6.0){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 111 | //ne radi ona prethodna varijanta jer % vraća i negastivni rezultat | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 112 | //to što ne koristimo unsigned tip ne pomaže jer će doći do overflow-a | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 113 | downBoundary = 2; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 114 | level = (level + 1) % 3; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 115 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 116 | else { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 117 | downBoundary = 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 118 | upBoundary = 5; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 119 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 120 | DrawCursor(Black, old); //na prethodni level popunimo bojom pozadine | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 121 | DrawCursor(White, level); //na novi level popunimo bijelom bojom - pozadina je crna | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 122 | //koristio sam fillrect, jer njega svakako moramo koristiti, jer možda budemo morali da brišemo fillcircle iz biblioteke | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 123 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 124 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 125 | void EndPlay() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 126 | joystick.detach(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 127 | score = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 128 | firstTime = true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 129 | gameStarted = false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 130 | for(int i = 0; i < 20; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 131 | for(int j = 0; j < 10; j++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 132 | board[i][j] = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 133 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 134 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 135 | ShowLevelMenu(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 136 | joystick.attach(&ReadJoystickForLevel, 0.3); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 137 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 138 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 139 | void StartGame() | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 140 | { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 141 | display.cls(); // brišemo ShowLevelMenu | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 142 | display.background(White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 143 | display.foreground(Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 144 | display.fillrect(0, 0, 160, 320, White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 145 | display.fillrect(160, 0, 240, 320, Black); //dio za prikazivanje rezultata će biti crni pravougaonik, a tabla je bijeli | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 146 | ShowScore(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 147 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 148 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 149 | void copyCoordinates(short X[], short Y[], unsigned char index) | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 150 | { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 151 | //umjesto one prošle metode za kopiranje, ova prima index, čisto da nam olakša život | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 152 | for(int i = 0; i < 4; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 153 | X[i] = figuresX[index][i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 154 | Y[i] = figuresY[index][i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 155 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 156 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 157 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 158 | bool BottomEdge(int x){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 159 | return x > 19; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 160 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 161 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 162 | bool LeftEdge(int y){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 163 | return y < 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 164 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 165 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 166 | bool RightEdge(int y){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 167 | return y > 9; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 168 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 169 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 170 | bool OutOfBounds(int y, int x){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 171 | return y < 0 || y > 9 || x > 19; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 172 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 173 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 174 | void PutBorders(short x, short y) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 175 | for(int i = x - 1; i <= x + 1; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 176 | for(int j = y - 1; j <= y + 1; j++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 177 | if(i < 0 || i > 9 || j < 0 || j > 19 || board[j][i] == 0) continue; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 178 | display.rect(i * DIMENSION, j * DIMENSION, (i + 1) * DIMENSION, (j + 1) * DIMENSION, Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 179 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 180 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 181 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 182 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 183 | class Tetromino{ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 184 | private: | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 185 | short X[4]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 186 | short Y[4]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 187 | short boardX, boardY; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 188 | unsigned char colorIndex;//dodao sam colorIndex zasad, jer nema drugog načina da popunimo matricu sa indeksima boja | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 189 | //ovo je najbezbolnija varijanta što se memorije tiče | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 190 | public: | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 191 | Tetromino(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 192 | unsigned char r = rand() % 7 + 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 193 | Initialize(r); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 194 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 195 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 196 | Tetromino(unsigned char colorIndex) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 197 | Initialize(colorIndex); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 198 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 199 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 200 | void Initialize(unsigned char colorIndex) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 201 | Tetromino::colorIndex = colorIndex; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 202 | boardX = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 203 | boardY = 4; //3,4 ili 5 najbolje da vidimo kad imamo display | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 204 | copyCoordinates(X, Y, colorIndex - 1); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 205 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 206 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 207 | void Rotate(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 208 | short pivotX = X[1], pivotY = Y[1]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 209 | //prvi elemnti u matrici su pivoti oko koje rotiramo | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 210 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 211 | short newX[4]; //pozicije blokova nakon rotiranja ako sve bude ok | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 212 | short newY[4]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 213 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 214 | for(int i = 0; i < 4; i++){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 215 | short tmp = X[i], tmp2 = Y[i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 216 | newX[i] = pivotX + pivotY - tmp2; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 217 | newY[i] = tmp + pivotX - pivotY; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 218 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 219 | if(OutOfBounds(boardY + newY[i], boardX + newX[i]) || board[boardX + newX[i]][boardY + newY[i]] != 0) return; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 220 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 221 | DeleteFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 222 | for(int i = 0; i < 4; i++){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 223 | X[i] = newX[i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 224 | Y[i] = newY[i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 225 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 226 | DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 227 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 228 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 229 | void DrawFigure() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 230 | for(int i = 0; i < 4; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 231 | //display je deklarisani display logy iz biblioteke one | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 232 | //računamo gornji lijevi pixel po x i y | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 233 | //donji desni dobijemo kad dodamo DIMENZIJU | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 234 | //stavio sam 16 za početak, možemo se opet skontati na labu | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 235 | //ovo pretpostavlja da nema margina, mogu se lagano dodati uz neku konstantu kao offset | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 236 | int upperLeftX = (boardX + X[i]) * DIMENSION, upperLeftY = (boardY + Y[i]) * DIMENSION; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 237 | display.fillrect( upperLeftY, upperLeftX, upperLeftY + DIMENSION, upperLeftX + DIMENSION, colors[colorIndex]); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 238 | //ovo boji granice blokova u crno, možemo skloniti ako ti se ne sviđa | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 239 | display.rect( upperLeftY, upperLeftX, upperLeftY + DIMENSION, upperLeftX + DIMENSION, Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 240 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 241 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 242 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 243 | void DeleteFigure() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 244 | for(int i = 0; i < 4; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 245 | //ista logika kao u DrawFigure, samo popunjavamo sve blokove sa bijelim pravougaonicima | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 246 | short upperLeftX = (boardX + X[i]) * DIMENSION, upperLeftY = (boardY + Y[i]) * DIMENSION; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 247 | display.fillrect( upperLeftY, upperLeftX, upperLeftY + DIMENSION, upperLeftX + DIMENSION, White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 248 | PutBorders(upperLeftY, upperLeftX); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 249 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 250 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 251 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 252 | void OnAttached() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 253 | //metoda se poziva kad figura prestanje da se krece | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 254 | //popunimo matricu indeksom boje | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 255 | for(int i = 0; i < 4; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 256 | board[boardX + X[i]][boardY + Y[i]] = colorIndex; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 257 | //btw board bi mogao biti niz tipa unsigned char, ali to ćemo vidjet kasnije | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 258 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 259 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 260 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 261 | bool MoveDown(char delta = 1){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 262 | if(!InCollisionDown(delta)){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 263 | DeleteFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 264 | boardX+=delta; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 265 | DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 266 | return true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 267 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 268 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 269 | return false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 270 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 271 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 272 | void MoveLeft(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 273 | if(!InCollisionLeft()){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 274 | DeleteFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 275 | boardY--; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 276 | DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 277 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 278 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 279 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 280 | void MoveRight(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 281 | if(!InCollisionRight()){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 282 | DeleteFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 283 | boardY++; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 284 | DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 285 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 286 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 287 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 288 | void SoftDrop() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 289 | //ovo je funkcija za soft drop | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 290 | //obrisemo figuru, postavimo novu poziciju dva reda ispod, nacrtamo figuru | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 291 | DeleteFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 292 | MoveDown(2); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 293 | DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 294 | //treba još vidjeti koje izmjene u tickeru trebaju | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 295 | score += 2 * (level +1); //prema igrici koju smo igrali, dobije se 14 poena kad se uradi hard drop | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 296 | ShowScore(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 297 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 298 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 299 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 300 | bool InCollisionDown(char delta = 1){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 301 | int newX, newY; //da bi bilo citljivije | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 302 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 303 | for(int i = 0; i < 4; i++){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 304 | newX = boardX + X[i] + delta; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 305 | newY = boardY + Y[i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 306 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 307 | if(BottomEdge(newX) || board[newX][newY] != 0){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 308 | return true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 309 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 310 | //jedna figura je u koliziji ako | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 311 | //pozicija na koju zelimo da pomjerimo bilo koji blok dotakne dno ili lijevu ili desnu ivicu ekrana | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 312 | //ili ako je pozicija na koju zelimo da pomjerimo bilo koji od blokova vec zauzeta a da nije dio figure prije pomijeranja | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 313 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 314 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 315 | return false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 316 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 317 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 318 | bool InCollisionLeft(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 319 | int newX, newY; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 320 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 321 | for(int i = 0; i < 4; i++){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 322 | newX = boardX + X[i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 323 | newY = boardY + Y[i] - 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 324 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 325 | if(LeftEdge(newY) || board[newX][newY] != 0){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 326 | return true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 327 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 328 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 329 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 330 | return false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 331 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 332 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 333 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 334 | bool InCollisionRight(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 335 | int newX, newY; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 336 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 337 | for(int i = 0; i < 4; i++){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 338 | newX = boardX + X[i]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 339 | newY = boardY + Y[i] + 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 340 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 341 | if(RightEdge(newY) || board[newX][newY] != 0){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 342 | return true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 343 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 344 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 345 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 346 | return false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 347 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 348 | }; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 349 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 350 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 351 | Tetromino currentTetromino; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 352 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 353 | void ReadJoystickForFigure() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 354 | if(VRx < leftBoundary / 6.0) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 355 | leftBoundary = 2; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 356 | currentTetromino.MoveLeft(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 357 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 358 | else if(VRx > rightBoundary / 6.0) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 359 | rightBoundary = 4; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 360 | currentTetromino.MoveRight(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 361 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 362 | else if(VRy < downBoundary / 6.0) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 363 | downBoundary = 2; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 364 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 365 | else if(VRy > upBoundary / 6.0) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 366 | upBoundary = 4; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 367 | currentTetromino.SoftDrop(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 368 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 369 | else { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 370 | leftBoundary = 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 371 | rightBoundary = 5; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 372 | downBoundary = 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 373 | upBoundary = 5; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 374 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 375 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 376 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 377 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 378 | void CheckLines(short &firstLine, short &numberOfLines) | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 379 | { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 380 | //vraća preko reference prvu liniju koja je popunjena do kraja, kao i takvih linija | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 381 | firstLine = -1; //postavljen na -1 jer ako nema linija koje treba brisati ispod u UpdateBoard neće se ući u petlju | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 382 | numberOfLines = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 383 | for(int i = 19; i >= 0; i--) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 384 | short temp = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 385 | for(int j = 0; j < 10; j++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 386 | if(board[i][j] == 0) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 387 | if(numberOfLines > 0) return; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 388 | break; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 389 | }//ako je makar jedna bijela, prekida se brojanje | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 390 | temp++; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 391 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 392 | if(temp == 10) { //ako je temo došao do 10, niti jedna bijela - puna linija | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 393 | numberOfLines++; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 394 | if(firstLine == -1) firstLine = i; //ovo mijenjamo samo prvi put | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 395 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 396 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 397 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 398 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 399 | unsigned int UpdateScore (short numOfLines){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 400 | unsigned int newIncrement = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 401 | switch(numOfLines) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 402 | case 1 : newIncrement = 40; break; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 403 | case 2 : newIncrement = 100; break; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 404 | case 3 : newIncrement = 300; break; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 405 | case 4 : newIncrement = 1200; break; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 406 | default : newIncrement = 0; break; //update funkcije za score, još sam vratio ovo na 0 | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 407 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 408 | return newIncrement * (level + 1); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 409 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 410 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 411 | void UpdateBoard() | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 412 | { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 413 | short firstLine, numberOfLines; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 414 | //pozivamo funkciju | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 415 | do { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 416 | CheckLines(firstLine, numberOfLines); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 417 | for(int i = firstLine; i >= numberOfLines; i--) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 418 | for(int j = 0; j < 10; j++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 419 | board[i][j] = board[i - numberOfLines][j]; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 420 | board[i - numberOfLines][j] = 0; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 421 | short tmp = i - numberOfLines; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 422 | display.fillrect( j * DIMENSION,i * DIMENSION, (j + 1) * DIMENSION , (i + 1) * DIMENSION , colors[board[i][j]]); // bojimo novi blok | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 423 | display.fillrect( j * DIMENSION, tmp * DIMENSION,(j + 1) * DIMENSION, (tmp + 1) * DIMENSION , White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 424 | if(board[i][j] != 0) | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 425 | display.rect( j * DIMENSION,i * DIMENSION, (j + 1) * DIMENSION , (i + 1) * DIMENSION , Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 426 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 427 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 428 | score += UpdateScore(numberOfLines); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 429 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 430 | while(numberOfLines != 0); //ovdje se mijenja globalna varijabla score | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 431 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 432 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 433 | bool IsOver() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 434 | for(int i = 0; i < 10; i++) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 435 | if(board[0][i] != 0) return true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 436 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 437 | return false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 438 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 439 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 440 | void ShowGameOverScreen() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 441 | display.cls(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 442 | display.background(Black); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 443 | display.foreground(White); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 444 | display.locate(50, 120); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 445 | printf("GAME OVER"); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 446 | display.locate(30, 150); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 447 | printf("YOUR SCORE IS %d", score); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 448 | wait(3); //ovaj prikaz traje 3s (možemo mijenjati) a nakon toga se ponovo prikazuje meni sa levelima | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 449 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 450 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 451 | void InitGame() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 452 | if(firstTime) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 453 | currentTetromino.DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 454 | nextFigure = rand() % 7 + 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 455 | ShowNextFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 456 | firstTime = false; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 457 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 458 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 459 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 460 | void PlayGame(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 461 | InitGame(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 462 | if(!currentTetromino.MoveDown()){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 463 | currentTetromino.OnAttached(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 464 | UpdateBoard(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 465 | ShowScore(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 466 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 467 | currentTetromino = Tetromino(nextFigure); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 468 | currentTetromino.DrawFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 469 | nextFigure = rand() % 7 + 1; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 470 | ShowNextFigure(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 471 | if(IsOver()) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 472 | //ako je igra završena brišemo sve sa displey-a, prikazujemo poruku i score | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 473 | //takođe moramo dettach-at ticker | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 474 | game.detach(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 475 | ShowGameOverScreen(); //prikaz da je kraj igre, ima wait od 3s | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 476 | EndPlay(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 477 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 478 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 479 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 480 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 481 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 482 | void OnTasterPressed(){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 483 | if(debounceTaster.read_ms() > 200) { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 484 | if(gameStarted){ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 485 | currentTetromino.Rotate(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 486 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 487 | else{ | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 488 | joystick.detach(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 489 | gameStarted = true; | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 490 | StartGame(); //pocinje igra, prikazuje se tabla | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 491 | joystick.attach(&ReadJoystickForFigure, 0.3); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 492 | game.attach(&PlayGame, delays[level]); //svakih nekoliko spusta figuru jedan red nize | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 493 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 494 | debounceTaster.reset(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 495 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 496 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 497 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 498 | void SetTaster() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 499 | taster.mode(PullUp); //mora se aktivirati pull up otpornik na tasteru joystick-a | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 500 | taster.fall(&OnTasterPressed); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 501 | debounceTaster.reset(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 502 | debounceTaster.start(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 503 | } | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 504 | |
| 2019US_DenisSelimovi | 0:59961b55c453 | 505 | int main() { | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 506 | srand(GenerateRandomSeed()); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 507 | Init(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 508 | ShowLevelMenu(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 509 | joystick.attach(&ReadJoystickForLevel, 0.3); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 510 | SetTaster(); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 511 | while(1); | 
| 2019US_DenisSelimovi | 0:59961b55c453 | 512 | } |