Jogo da Cobrinha desenvolvido como avaliação da disciplina de Sistemas Embarcados do curso de Inovação e Desenvolvimento Mobile e Web do IFPE.

Dependencies:   TermControl

Committer:
renangueiros
Date:
Sat Dec 10 13:43:27 2016 +0000
Revision:
0:6ca395acc2a5
final-commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }