int movimento(Tela* tela, int* pontuacao){ int locked, resultado, cont, cont2, fechou = 0, gravidade = 1; // gravidade é o número de células que a peça cai a cada segundo. peca* tetromino = nova_peca(tela); struct pollfd poll1 = { STDIN_FILENO, POLLIN|POLLPRI }; if(tetromino == NULL) return 1; mostra_tela(tela); refresh(); locked = 0; while(locked == 0) { if(poll(&poll1, 1, (1000/gravidade))) { switch(getch()) { case KEY_UP: rotaciona_peca(tela,tetromino); break; case KEY_LEFT: move_peca_x(tela, tetromino, -1); break; case KEY_RIGHT: move_peca_x(tela, tetromino, 1); break; case KEY_DOWN: gravidade = gravidade*2; break; case 'q': // 'q' de "Quit" return 1; break; default: break; } } else { resultado = move_peca_y(tela, tetromino); if (resultado < 5){ locked = 1; } } mostra_tela(tela); refresh(); } for(cont = 0; cont < 15; cont++){ fechou = 0; for(cont2=0; cont2 < 25; cont2++){ if(tela->matriz_gui[cont][cont2].caracter == 'X') fechou++; } if(fechou == 23){ *pontuacao += 1; deleta_linha(tela, cont); } } return 0; }
int main(){ inicia_ncurses(); WINDOW* game = cria_tela(); enable_keypad(game); cria_borda(game); tela_inicio(game); mostra_tela(game); int i; i = pega_input(game); formata_tela(game); cria_borda(game); tela_jogo(game); tp_peca peca = nova_peca(); while(i!='q'){ if(fim_do_movimento(game, &peca)){ peca = nova_peca(); } escreve_peca(game, peca); mostra_tela(game); apaga_peca(game, peca); if(movimento_valido(game, &peca, i)){ mover_peca(&peca, i); } escreve_peca(game, peca); mostra_tela(game); i = pega_input(game); if(fim_do_movimento(game, &peca)&&limite_superior(&peca)){ break; } } formata_tela(game); cria_borda(game); tela_fim(game); mostra_tela(game); i = pega_input(game); finaliza_ncurses(); return 0; }
EXT_MOD_GAME void start_game(int difficulty) { Tela *tela; Peca *peca, *prox_peca; int end=0, in; WINDOW* main; srand(time(NULL)); tela = nova_tela(); prox_peca = nova_peca(tela, -TELA_LARGURA/2, TELA_ALTURA/8-1); while(!end) { clock_t ini; peca = prox_peca; prox_peca = nova_peca(tela, -TELA_LARGURA/2, TELA_ALTURA/8-1); peca_move_x(peca, TELA_LARGURA); if(peca_touching(peca, tela, 's')) { deleta_peca(peca); break; } ini = clock(); while(!end) { clock_t now; mostra_tela(tela); mostra_peca(peca); mostra_peca(prox_peca); refresh(); in = pega_input(1); switch(in) { case 'S': case 's': if(!peca_touching(peca, tela, 's')) peca_move_y(peca, 1); break; case 'A': case 'a': if(!peca_touching(peca, tela, 'a')) peca_move_x(peca, -1); break; case 'D': case 'd': if (!peca_touching(peca, tela, 'd')) peca_move_x(peca, 1); break; case ENTER: prende_peca(peca, tela); break; case 'q': case 'Q': end = 1; break; case ESC: set_color(COR_TELA); mvaddstr(tela->y + TELA_ALTURA/2 -1, tela->x + TELA_LARGURA/2 + 2, "PAUSED"); do {in = getch();} while(in != ESC && in!='q' && in!='Q'); if(in == 'q' || in == 'Q') { end = 1; deleta_peca(peca); } break; } clear(); if(end) break; now = clock(); if(now - ini > 5) { peca_move_y(peca, 1); ini = clock(); } if(peca_touching(peca, tela, 's')) { prende_peca(peca, tela); deleta_peca(peca); break; } } if(endgame(tela)) { end = 1; deleta_tela(tela); } } }