Skip to content

feat: finaliza controles, adiciona pausa e reinício da partida - #4

Merged
deniselmatos merged 3 commits into
mainfrom
feature/controls
Oct 12, 2026
Merged

deniselmatos merged 3 commits into
mainfrom
feature/controls

Conversation

@deniselmatos

Copy link
Copy Markdown
Collaborator

Descrição

Adiciona novos controles de teclado ao Tetris, permitindo utilizar as teclas A, D, W e S como alternativa às teclas direcionais. Também adiciona o comando de queda imediata da peça, pausa e retomada da partida e reinício com confirmação.

O objetivo é oferecer mais opções de controle ao jogador e tornar as ações durante a partida mais acessíveis.

O que mudou

Todas as alterações estão no inde.html:

  • Controles alternativos: as teclas A e D movimentam a peça para a esquerda e para a direita, W gira a peça e S acelera sua descida. As teclas direcionais continuam disponíveis.
  • Queda imediata: a tecla Espaço faz a peça descer até sua posição final de encaixe, em vez de funcionar como comando de pausa.
  • Pausa e retomada: a tecla P pausa a partida e permite retomá-la. A tecla Enter também permite retomar o jogo quando ele está pausado.
  • Reinício com confirmação: a tecla R abre uma tela de confirmação durante uma partida em andamento ou pausada, informando que o progresso atual será perdido.
  • Tela de confirmação: foram adicionados os botões "Reiniciar" e "Cancelar". Enter confirma o reinício, enquanto Esc cancela a ação.
  • Preservação do estado anterior: ao cancelar o reinício, o jogo retorna ao estado em que estava antes da solicitação, seja em andamento ou pausado.
Captura de tela 2026-10-11 135527

Como testar

  1. Abrir o inde.html no navegador.
  2. Movimentação: iniciar uma partida e testar as setas direcionais, A, D, W e S. Verificar se as peças se movimentam, giram e descem conforme esperado.
  3. Queda imediata: pressionar Espaço e verificar se a peça desce até a posição final de encaixe.
  4. Pausa e retomada: pressionar P durante a partida. Verificar se a peça para de descer e se a partida retoma ao pressionar P novamente.
  5. Reinício durante a partida: pressionar R e verificar se a tela de confirmação é exibida. Confirmar com Enter ou pelo botão "Reiniciar" e verificar se uma nova partida começa.
  6. Cancelamento durante a partida: pressionar R e depois Esc. Verificar se a partida continua do ponto em que estava.
  7. Reinício durante a pausa: pausar a partida, pressionar R e cancelar. Verificar se o jogo continua pausado.
  8. Verificação de estados: conferir se os comandos não iniciam ações incompatíveis com a tela atual e se o jogo não apresenta erros durante a execução.

Critérios de aceite

  • As teclas direcionais continuam funcionando normalmente.
  • A movimenta a peça para a esquerda.
  • D movimenta a peça para a direita.
  • W gira a peça.
  • S acelera a descida da peça.
  • Espaço faz a peça descer imediatamente até a posição final de encaixe.
  • P pausa a partida.
  • P novamente retoma a partida.
  • R abre a confirmação de reinício durante uma partida em andamento ou pausada.
  • Enter e o botão "Reiniciar" confirmam o reinício.
  • Esc e o botão "Cancelar" cancelam o reinício.
  • Ao cancelar, o estado anterior da partida é preservado.
  • Durante a pausa, a peça não continua descendo.

Observações

  • Arquivo alterado: inde.html.
  • Branch: feature/controls.
  • Commit: feat: finaliza controles, adiciona pausa e reinício da partida.
  • Compatibilidade: os controles direcionais existentes foram mantidos, e as novas teclas funcionam como alternativas ou comandos adicionais.
  • Reinício após Game Over: o comportamento atual permite iniciar ou reiniciar a partida com Enter. A tecla R abre a confirmação quando a partida está em andamento ou pausada.

@ZeCarlos18 ZeCarlos18 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testei a branch e as funcionalidades estão funcionando bem. Peço alterações porque o PR está em conflito com a main, que agora tem a peça fantasma (#2) e o cronômetro (#3), e a resolução precisa de alguns cuidados para não quebrar essas funcionalidades.

O que testei (Edge headless, sem erros no console)

  • Movimento: setas e A/D/W/S movem e giram a peça.
  • Espaço: faz a queda imediata (fixa a peça no fundo e soma +10).
  • Pausa: P pausa e continua, e Enter também continua. Na pausa a peça não desce.
  • Reinício com R: a confirmação congela o jogo. Cancelar com ESC ou com o botão volta ao estado anterior (em jogo ou pausado). Confirmar com Enter ou com o botão começa uma partida zerada.
  • Limpeza de linhas: a reescrita do removeLine() / removeLines() está correta. 2 linhas completas somam +200 e os blocos de cima descem. Ainda corrigiu um detalhe antigo: o loop original nunca verificava a linha do topo (y=0).
  • Telas pequenas: com os 8 controles, as telas inicial e de pausa cabem em 300px e 450px.

Precisa resolver: conflito com a main (5 trechos no inde.html)

  1. KEY / CONTROLS: incluir a tecla da peça fantasma: G: 71 no KEY e { keys: ['G'], action: 'ligar / desligar sombra' } no CONTROLS.
  2. addEvents(): manter os dois lados, ou seja, os listeners de mode-button / mode-options (cronômetro) e os de confirm-restart-button / cancel-restart-button.
  3. keydown(): usar o seu switch novo, mas acrescentar case KEY.G: toggleGhost(); handled = true; break; no bloco if (playing). Senão a tecla G da peça fantasma deixa de funcionar.
  4. lose(): manter as suas funções requestRestart() / confirmRestart() / cancelRestart() e a assinatura function lose(timeout). ⚠️ Se a resolução ficar com function lose(), o corpo da função continua usando timeout e o jogo gera ReferenceError toda vez que a partida termina.
  5. Depois de dropPiece(): manter o landingY() da peça fantasma e o seu removeLine().

Depois de resolver, vale rodar o jogo e conferir: tecla G, modo Contra o Tempo até "Tempo esgotado!", R durante a contagem regressiva (o cronômetro fica parado na confirmação) e ESC → Game Over.

Precisa conferir depois do merge: layout em 300px

Simulei a tela inicial da main com os 9 controles (os 8 deste PR + G) e o seletor de modo do cronômetro. Em 300px, o título "TETRIS" fica cortado no topo e não dá para alcançá-lo com a rolagem, por causa do justify-content: center do .overlay, e ainda aparece uma barra de rolagem horizontal. Em 450px cabe. Algumas opções:

  • trocar no .overlay para justify-content: safe center;;
  • ou deixar a lista de controles em duas colunas;
  • ou esconder a lista de controles na tela inicial nos tamanhos menores.

Sugestões (não bloqueiam)

  • Reformatação de código existente: KEY, CONTROLS, keydown(), addEvents() e removeLines() foram reformatados (alinhamento em colunas → uma instrução por linha). Isso aumenta muito o diff e os conflitos com as outras branches, e destoa do estilo do resto do arquivo. Se possível, mantenha o estilo original e mude só as linhas necessárias.
  • hardDrop(): com a peça fantasma na main, dá para reaproveitar o landingY(): current.y = landingY(); invalidate(); drop();.
  • Detalhes de formatação:
    • var restartWasPlaying / restartWasPaused estão com 8 espaços de indentação; o resto do bloco usa 4.
    • Há linhas em branco sobrando e uma linha só com espaços depois do CONTROLS.
    • Os botões da #restart-screen estão quebrados em várias linhas.
  • Comentários perdidos: // displayed on the start and pause screens, // prevent arrow keys from scrolling the page e // 1: 100, 2: 200, 3: 400, 4: 800. Ajudam a entender o código; vale manter.
  • Mudança de comportamento do Espaço: antes pausava e iniciava a partida, agora faz a queda imediata (e só Enter inicia). Faz sentido e está documentado no PR. Só vale a equipe estar de acordo, porque muda o que foi definido no PR #1.

@deniselmatos
deniselmatos merged commit 7775a9b into main Oct 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants