Jogo da Cobrinha desenvolvido como avaliação da disciplina de Sistemas Embarcados do curso de Inovação e Desenvolvimento Mobile e Web do IFPE.
main.cpp@0:6ca395acc2a5, 2016-12-10 (annotated)
- Committer:
- renangueiros
- Date:
- Sat Dec 10 13:43:27 2016 +0000
- Revision:
- 0:6ca395acc2a5
final-commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
renangueiros | 0:6ca395acc2a5 | 1 | #ifndef _COLORS_ |
renangueiros | 0:6ca395acc2a5 | 2 | #define _COLORS_ |
renangueiros | 0:6ca395acc2a5 | 3 | |
renangueiros | 0:6ca395acc2a5 | 4 | /* FOREGROUND */ |
renangueiros | 0:6ca395acc2a5 | 5 | #define RST "\x1B[0m" |
renangueiros | 0:6ca395acc2a5 | 6 | #define KRED "\x1B[31m" |
renangueiros | 0:6ca395acc2a5 | 7 | #define KGRN "\x1B[32m" |
renangueiros | 0:6ca395acc2a5 | 8 | #define KYEL "\x1B[33m" |
renangueiros | 0:6ca395acc2a5 | 9 | #define KBLU "\x1B[34m" |
renangueiros | 0:6ca395acc2a5 | 10 | #define KMAG "\x1B[35m" |
renangueiros | 0:6ca395acc2a5 | 11 | #define KCYN "\x1B[36m" |
renangueiros | 0:6ca395acc2a5 | 12 | #define KWHT "\x1B[37m" |
renangueiros | 0:6ca395acc2a5 | 13 | |
renangueiros | 0:6ca395acc2a5 | 14 | #define FRED(x) KRED x RST |
renangueiros | 0:6ca395acc2a5 | 15 | #define FGRN(x) KGRN x RST |
renangueiros | 0:6ca395acc2a5 | 16 | #define FYEL(x) KYEL x RST |
renangueiros | 0:6ca395acc2a5 | 17 | #define FBLU(x) KBLU x RST |
renangueiros | 0:6ca395acc2a5 | 18 | #define FMAG(x) KMAG x RST |
renangueiros | 0:6ca395acc2a5 | 19 | #define FCYN(x) KCYN x RST |
renangueiros | 0:6ca395acc2a5 | 20 | #define FWHT(x) KWHT x RST |
renangueiros | 0:6ca395acc2a5 | 21 | |
renangueiros | 0:6ca395acc2a5 | 22 | #define BOLD(x) "\x1B[1m" x RST |
renangueiros | 0:6ca395acc2a5 | 23 | #define UNDL(x) "\x1B[4m" x RST |
renangueiros | 0:6ca395acc2a5 | 24 | |
renangueiros | 0:6ca395acc2a5 | 25 | #endif /* _COLORS_ */ |
renangueiros | 0:6ca395acc2a5 | 26 | |
renangueiros | 0:6ca395acc2a5 | 27 | #include "mbed.h" |
renangueiros | 0:6ca395acc2a5 | 28 | #include "TermControl.h" |
renangueiros | 0:6ca395acc2a5 | 29 | #include "rtos.h" |
renangueiros | 0:6ca395acc2a5 | 30 | |
renangueiros | 0:6ca395acc2a5 | 31 | DigitalOut buzz(A0); |
renangueiros | 0:6ca395acc2a5 | 32 | |
renangueiros | 0:6ca395acc2a5 | 33 | Serial saida(USBTX, USBRX); |
renangueiros | 0:6ca395acc2a5 | 34 | Serial entrada(USBTX, USBRX); |
renangueiros | 0:6ca395acc2a5 | 35 | |
renangueiros | 0:6ca395acc2a5 | 36 | TermControl terminal; |
renangueiros | 0:6ca395acc2a5 | 37 | |
renangueiros | 0:6ca395acc2a5 | 38 | unsigned char atualiza_stk[1024]; |
renangueiros | 0:6ca395acc2a5 | 39 | unsigned char controle_stk[1024]; |
renangueiros | 0:6ca395acc2a5 | 40 | |
renangueiros | 0:6ca395acc2a5 | 41 | Thread atualiza_thread(osPriorityNormal, 1024, &atualiza_stk[0]); |
renangueiros | 0:6ca395acc2a5 | 42 | Thread controle_thread(osPriorityNormal, 1024, &controle_stk[0]); |
renangueiros | 0:6ca395acc2a5 | 43 | |
renangueiros | 0:6ca395acc2a5 | 44 | char tecla; |
renangueiros | 0:6ca395acc2a5 | 45 | |
renangueiros | 0:6ca395acc2a5 | 46 | int x; |
renangueiros | 0:6ca395acc2a5 | 47 | int direcao; |
renangueiros | 0:6ca395acc2a5 | 48 | int cobraX[500]; |
renangueiros | 0:6ca395acc2a5 | 49 | int cobraY[500]; |
renangueiros | 0:6ca395acc2a5 | 50 | int tamanho; |
renangueiros | 0:6ca395acc2a5 | 51 | int macaX; |
renangueiros | 0:6ca395acc2a5 | 52 | int macaY; |
renangueiros | 0:6ca395acc2a5 | 53 | int velocidade; |
renangueiros | 0:6ca395acc2a5 | 54 | int aceleracao; |
renangueiros | 0:6ca395acc2a5 | 55 | int pontuacao; |
renangueiros | 0:6ca395acc2a5 | 56 | int statusJogo; |
renangueiros | 0:6ca395acc2a5 | 57 | |
renangueiros | 0:6ca395acc2a5 | 58 | static void atualiza_task(void) |
renangueiros | 0:6ca395acc2a5 | 59 | { |
renangueiros | 0:6ca395acc2a5 | 60 | for (;;) { |
renangueiros | 0:6ca395acc2a5 | 61 | |
renangueiros | 0:6ca395acc2a5 | 62 | buzz = 0; |
renangueiros | 0:6ca395acc2a5 | 63 | |
renangueiros | 0:6ca395acc2a5 | 64 | for (x = tamanho; x > 0; x--) { |
renangueiros | 0:6ca395acc2a5 | 65 | cobraX[x] = cobraX[x - 1]; |
renangueiros | 0:6ca395acc2a5 | 66 | cobraY[x] = cobraY[x - 1]; |
renangueiros | 0:6ca395acc2a5 | 67 | } |
renangueiros | 0:6ca395acc2a5 | 68 | |
renangueiros | 0:6ca395acc2a5 | 69 | if (direcao == 0) |
renangueiros | 0:6ca395acc2a5 | 70 | cobraX[0]--; |
renangueiros | 0:6ca395acc2a5 | 71 | if (direcao == 1) |
renangueiros | 0:6ca395acc2a5 | 72 | cobraY[0]--; |
renangueiros | 0:6ca395acc2a5 | 73 | if (direcao == 2) |
renangueiros | 0:6ca395acc2a5 | 74 | cobraX[0]++; |
renangueiros | 0:6ca395acc2a5 | 75 | if (direcao == 3) |
renangueiros | 0:6ca395acc2a5 | 76 | cobraY[0]++; |
renangueiros | 0:6ca395acc2a5 | 77 | |
renangueiros | 0:6ca395acc2a5 | 78 | terminal.SetCursor(cobraX[tamanho], cobraY[tamanho]); |
renangueiros | 0:6ca395acc2a5 | 79 | saida.printf(" "); |
renangueiros | 0:6ca395acc2a5 | 80 | |
renangueiros | 0:6ca395acc2a5 | 81 | if (macaX == cobraX[0] && macaY == cobraY[0]) { |
renangueiros | 0:6ca395acc2a5 | 82 | tamanho++; |
renangueiros | 0:6ca395acc2a5 | 83 | pontuacao++; |
renangueiros | 0:6ca395acc2a5 | 84 | |
renangueiros | 0:6ca395acc2a5 | 85 | buzz = 1; |
renangueiros | 0:6ca395acc2a5 | 86 | saida.putc('\a'); |
renangueiros | 0:6ca395acc2a5 | 87 | |
renangueiros | 0:6ca395acc2a5 | 88 | macaX = 2 + (rand() % 77); |
renangueiros | 0:6ca395acc2a5 | 89 | macaY = 4 + (rand() % 18); |
renangueiros | 0:6ca395acc2a5 | 90 | |
renangueiros | 0:6ca395acc2a5 | 91 | aceleracao -= 10; |
renangueiros | 0:6ca395acc2a5 | 92 | velocidade += 10; |
renangueiros | 0:6ca395acc2a5 | 93 | } |
renangueiros | 0:6ca395acc2a5 | 94 | |
renangueiros | 0:6ca395acc2a5 | 95 | terminal.SetCursor(cobraX[0], cobraY[0]); |
renangueiros | 0:6ca395acc2a5 | 96 | saida.printf(FGRN("%c"), 219); |
renangueiros | 0:6ca395acc2a5 | 97 | |
renangueiros | 0:6ca395acc2a5 | 98 | terminal.SetCursor(macaX, macaY); |
renangueiros | 0:6ca395acc2a5 | 99 | saida.printf(FRED("%c"), 219); |
renangueiros | 0:6ca395acc2a5 | 100 | |
renangueiros | 0:6ca395acc2a5 | 101 | terminal.SetCursor(0, 0); |
renangueiros | 0:6ca395acc2a5 | 102 | saida.printf("Velocidade: %d", velocidade); |
renangueiros | 0:6ca395acc2a5 | 103 | |
renangueiros | 0:6ca395acc2a5 | 104 | terminal.SetCursor(20, 0); |
renangueiros | 0:6ca395acc2a5 | 105 | saida.printf("Pontos: %d", pontuacao); |
renangueiros | 0:6ca395acc2a5 | 106 | |
renangueiros | 0:6ca395acc2a5 | 107 | Thread::wait(aceleracao); |
renangueiros | 0:6ca395acc2a5 | 108 | |
renangueiros | 0:6ca395acc2a5 | 109 | for (x = 1; x < tamanho; x++) { |
renangueiros | 0:6ca395acc2a5 | 110 | if (cobraX[0] == cobraX[x] && cobraY[0] == cobraY[x]) { |
renangueiros | 0:6ca395acc2a5 | 111 | statusJogo = 0; |
renangueiros | 0:6ca395acc2a5 | 112 | return; |
renangueiros | 0:6ca395acc2a5 | 113 | } |
renangueiros | 0:6ca395acc2a5 | 114 | } |
renangueiros | 0:6ca395acc2a5 | 115 | |
renangueiros | 0:6ca395acc2a5 | 116 | if (cobraY[0] == 2 || cobraY[0] == 22 || cobraX[0] == 1 || cobraX[0] == 79) { |
renangueiros | 0:6ca395acc2a5 | 117 | statusJogo = 0; |
renangueiros | 0:6ca395acc2a5 | 118 | return; |
renangueiros | 0:6ca395acc2a5 | 119 | } |
renangueiros | 0:6ca395acc2a5 | 120 | } |
renangueiros | 0:6ca395acc2a5 | 121 | } |
renangueiros | 0:6ca395acc2a5 | 122 | |
renangueiros | 0:6ca395acc2a5 | 123 | static void controle_task(void) |
renangueiros | 0:6ca395acc2a5 | 124 | { |
renangueiros | 0:6ca395acc2a5 | 125 | for(;;) { |
renangueiros | 0:6ca395acc2a5 | 126 | |
renangueiros | 0:6ca395acc2a5 | 127 | tecla = entrada.getc(); |
renangueiros | 0:6ca395acc2a5 | 128 | |
renangueiros | 0:6ca395acc2a5 | 129 | if (tecla == 'a' || tecla == 'A') |
renangueiros | 0:6ca395acc2a5 | 130 | direcao = 0; |
renangueiros | 0:6ca395acc2a5 | 131 | if (tecla == 'w' || tecla == 'W') |
renangueiros | 0:6ca395acc2a5 | 132 | direcao = 1; |
renangueiros | 0:6ca395acc2a5 | 133 | if (tecla == 'd' || tecla == 'D') |
renangueiros | 0:6ca395acc2a5 | 134 | direcao = 2; |
renangueiros | 0:6ca395acc2a5 | 135 | if (tecla == 's' || tecla == 'S') |
renangueiros | 0:6ca395acc2a5 | 136 | direcao = 3; |
renangueiros | 0:6ca395acc2a5 | 137 | } |
renangueiros | 0:6ca395acc2a5 | 138 | } |
renangueiros | 0:6ca395acc2a5 | 139 | |
renangueiros | 0:6ca395acc2a5 | 140 | void resetaJogo() |
renangueiros | 0:6ca395acc2a5 | 141 | { |
renangueiros | 0:6ca395acc2a5 | 142 | |
renangueiros | 0:6ca395acc2a5 | 143 | atualiza_thread.terminate(); |
renangueiros | 0:6ca395acc2a5 | 144 | controle_thread.terminate(); |
renangueiros | 0:6ca395acc2a5 | 145 | |
renangueiros | 0:6ca395acc2a5 | 146 | statusJogo = 1; |
renangueiros | 0:6ca395acc2a5 | 147 | |
renangueiros | 0:6ca395acc2a5 | 148 | memset(cobraX, 0, sizeof(cobraX)); |
renangueiros | 0:6ca395acc2a5 | 149 | memset(cobraY, 0, sizeof(cobraY)); |
renangueiros | 0:6ca395acc2a5 | 150 | cobraX[0] = 2; |
renangueiros | 0:6ca395acc2a5 | 151 | cobraY[0] = 12; |
renangueiros | 0:6ca395acc2a5 | 152 | |
renangueiros | 0:6ca395acc2a5 | 153 | tamanho = 1; |
renangueiros | 0:6ca395acc2a5 | 154 | |
renangueiros | 0:6ca395acc2a5 | 155 | direcao = 2; |
renangueiros | 0:6ca395acc2a5 | 156 | |
renangueiros | 0:6ca395acc2a5 | 157 | aceleracao = 200; |
renangueiros | 0:6ca395acc2a5 | 158 | velocidade = 10; |
renangueiros | 0:6ca395acc2a5 | 159 | |
renangueiros | 0:6ca395acc2a5 | 160 | pontuacao = 0; |
renangueiros | 0:6ca395acc2a5 | 161 | } |
renangueiros | 0:6ca395acc2a5 | 162 | |
renangueiros | 0:6ca395acc2a5 | 163 | void novoJogo() |
renangueiros | 0:6ca395acc2a5 | 164 | { |
renangueiros | 0:6ca395acc2a5 | 165 | resetaJogo(); |
renangueiros | 0:6ca395acc2a5 | 166 | |
renangueiros | 0:6ca395acc2a5 | 167 | terminal.Reset(); |
renangueiros | 0:6ca395acc2a5 | 168 | terminal.Clear(); |
renangueiros | 0:6ca395acc2a5 | 169 | |
renangueiros | 0:6ca395acc2a5 | 170 | for (x = 2; x < 22; x++) { |
renangueiros | 0:6ca395acc2a5 | 171 | terminal.SetCursor(0, x); |
renangueiros | 0:6ca395acc2a5 | 172 | saida.printf(FBLU("%c"), 219); |
renangueiros | 0:6ca395acc2a5 | 173 | } |
renangueiros | 0:6ca395acc2a5 | 174 | |
renangueiros | 0:6ca395acc2a5 | 175 | for (x = 0; x < 79; x++) { |
renangueiros | 0:6ca395acc2a5 | 176 | terminal.SetCursor(x, 2); |
renangueiros | 0:6ca395acc2a5 | 177 | saida.printf(FBLU("%c"), 219); |
renangueiros | 0:6ca395acc2a5 | 178 | } |
renangueiros | 0:6ca395acc2a5 | 179 | |
renangueiros | 0:6ca395acc2a5 | 180 | for (x = 2; x < 22; x++) { |
renangueiros | 0:6ca395acc2a5 | 181 | terminal.SetCursor(79, x); |
renangueiros | 0:6ca395acc2a5 | 182 | saida.printf(FBLU("%c"), 219); |
renangueiros | 0:6ca395acc2a5 | 183 | } |
renangueiros | 0:6ca395acc2a5 | 184 | |
renangueiros | 0:6ca395acc2a5 | 185 | for (x = 0; x < 80; x++) { |
renangueiros | 0:6ca395acc2a5 | 186 | terminal.SetCursor(x, 22); |
renangueiros | 0:6ca395acc2a5 | 187 | saida.printf(FBLU("%c"), 219); |
renangueiros | 0:6ca395acc2a5 | 188 | } |
renangueiros | 0:6ca395acc2a5 | 189 | |
renangueiros | 0:6ca395acc2a5 | 190 | srand(time(NULL)); |
renangueiros | 0:6ca395acc2a5 | 191 | macaX = 2 + (rand() % 77); |
renangueiros | 0:6ca395acc2a5 | 192 | macaY = 4 + (rand() % 18); |
renangueiros | 0:6ca395acc2a5 | 193 | |
renangueiros | 0:6ca395acc2a5 | 194 | do { |
renangueiros | 0:6ca395acc2a5 | 195 | atualiza_thread.start(atualiza_task); |
renangueiros | 0:6ca395acc2a5 | 196 | controle_thread.start(controle_task); |
renangueiros | 0:6ca395acc2a5 | 197 | } while(statusJogo != 0); |
renangueiros | 0:6ca395acc2a5 | 198 | |
renangueiros | 0:6ca395acc2a5 | 199 | terminal.Reset(); |
renangueiros | 0:6ca395acc2a5 | 200 | terminal.Clear(); |
renangueiros | 0:6ca395acc2a5 | 201 | |
renangueiros | 0:6ca395acc2a5 | 202 | terminal.SetCursor(0, 0); |
renangueiros | 0:6ca395acc2a5 | 203 | |
renangueiros | 0:6ca395acc2a5 | 204 | saida.printf(FGRN("\r██████████████████████████████████████████████████████████████████████████████\r\n█ █\r\n█ █\r\n█ ████ ██ █ \r\n█ █ ████ █ ███ █ █ █ █ ███ █ ███ █ \r\n█ █ █ █████ █ █ █ █ █ █ █ █ ██ █\r\n█ █ ███ █████ █ █ █ █████ █ █ █ █ █████ █ █\r\n█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █\r\n█ ████ ███ █ █ █ ████ ██ █ ████ █ █\r\n█ █\r\n█ █\r\n█ █\r\n█ Pontuação: %d █\r\n█ █\r\n█ █\r\n█ Sua cobra ficou muito pequena! █\r\n█ █\r\n█ Pressione ENTER para tentar aumentar sua cobra. █\r\n█ █\r\n██████████████████████████████████████████████████████████████████████████████"), pontuacao); |
renangueiros | 0:6ca395acc2a5 | 205 | |
renangueiros | 0:6ca395acc2a5 | 206 | resetaJogo(); |
renangueiros | 0:6ca395acc2a5 | 207 | |
renangueiros | 0:6ca395acc2a5 | 208 | do { |
renangueiros | 0:6ca395acc2a5 | 209 | tecla = entrada.getc(); |
renangueiros | 0:6ca395acc2a5 | 210 | } while((tecla != 13)); |
renangueiros | 0:6ca395acc2a5 | 211 | |
renangueiros | 0:6ca395acc2a5 | 212 | novoJogo(); |
renangueiros | 0:6ca395acc2a5 | 213 | } |
renangueiros | 0:6ca395acc2a5 | 214 | |
renangueiros | 0:6ca395acc2a5 | 215 | int main() |
renangueiros | 0:6ca395acc2a5 | 216 | { |
renangueiros | 0:6ca395acc2a5 | 217 | saida.baud(115200); |
renangueiros | 0:6ca395acc2a5 | 218 | entrada.baud(115200); |
renangueiros | 0:6ca395acc2a5 | 219 | |
renangueiros | 0:6ca395acc2a5 | 220 | terminal.SetTerminal(&saida); |
renangueiros | 0:6ca395acc2a5 | 221 | terminal.Reset(); |
renangueiros | 0:6ca395acc2a5 | 222 | terminal.Clear(); |
renangueiros | 0:6ca395acc2a5 | 223 | |
renangueiros | 0:6ca395acc2a5 | 224 | terminal.SetCursor(0, 0); |
renangueiros | 0:6ca395acc2a5 | 225 | |
renangueiros | 0:6ca395acc2a5 | 226 | saida.printf(FGRN("\r██████████████████████████████████████████████████████████████████████████████\r\n█ █\r\n█ █\r\n█ █\r\n█ ██████ █ █\r\n█ ██ █ █ ███ ████ █ █ ███ █\r\n█ ██ ██ █ █ █ █ █ █ █\r\n█ ██ █ █ █████ ███ █████ █\r\n█ █ ██ █ █ █ █ █ █ █ █\r\n█ ██████ █ █ ███ █ █ ████ █\r\n█ █\r\n█ █\r\n█ █\r\n█ █\r\n█ █\r\n█ █\r\n█ Sua cobra pode ser realmente grande? █\r\n█ █\r\n█ Pressione ENTER para tentar aumentar sua cobra █\r\n█ █\r\n██████████████████████████████████████████████████████████████████████████████")); |
renangueiros | 0:6ca395acc2a5 | 227 | |
renangueiros | 0:6ca395acc2a5 | 228 | do { |
renangueiros | 0:6ca395acc2a5 | 229 | tecla = entrada.getc(); |
renangueiros | 0:6ca395acc2a5 | 230 | } while((tecla != 13)); |
renangueiros | 0:6ca395acc2a5 | 231 | |
renangueiros | 0:6ca395acc2a5 | 232 | novoJogo(); |
renangueiros | 0:6ca395acc2a5 | 233 | |
renangueiros | 0:6ca395acc2a5 | 234 | } |