Skip to content

feat: cronômetro com modo Contra o Tempo - #3

Merged
ZeCarlos18 merged 6 commits into
mainfrom
feature/cronômetro-modo-tempo
Oct 12, 2026

Hidden character warning

The head ref may contain hidden characters: "feature/cron\u00f4metro-modo-tempo"
Merged

ZeCarlos18 merged 6 commits into
mainfrom
feature/cronômetro-modo-tempo

Conversation

@ZeCarlos18

Copy link
Copy Markdown
Collaborator

Descrição

Adiciona um cronômetro visível durante a partida e um novo modo de jogo, o Contra o Tempo.

  • Modo Padrão: o cronômetro conta o tempo decorrido da partida. O jogo continua igual ao de antes.
  • Modo Contra o Tempo: o jogador escolhe um tempo limite e o cronômetro faz contagem regressiva. As peças caem cada vez mais rápido conforme o tempo acaba, e a partida termina em 00:00.

O objetivo é dar ao jogador noção do tempo de partida e oferecer um modo mais desafiador, com pressão de tempo e dificuldade crescente.

O que mudou

Tudo está no inde.html:

  • Cronômetro no menu lateral: linha tempo 00:00 abaixo de "rows", com o mesmo estilo de score e rows. Segue o padrão de invalidação que já existia (invalidateTimer() / drawTimer()), e o DOM só é atualizado quando o segundo exibido muda.
  • Contagem só durante a partida: o tempo soma o idt do update() apenas enquanto a partida está em andamento. Por isso para sozinho na pausa e nas telas de início e fim, e zera no reset().
  • Tela inicial: opções "Padrão" e "Contra o tempo" e seletor de tempo limite (1, 2, 3 ou 5 min, padrão 2), habilitado só no Contra o Tempo. A escolha é lida em play().
  • Velocidade: o cálculo de step foi centralizado em updateStep(). No Padrão a fórmula é exatamente a de antes. No Contra o Tempo a partida começa na velocidade normal e chega a 0,1 s por linha quando o tempo acaba, cerca de 6x mais rápido.
  • Tempo esgotado: em 00:00 a partida termina reaproveitando lose(), e o título da tela de fim muda para "Tempo esgotado!". Empilhar peças ou apertar ESC continua mostrando "Game Over", em qualquer modo.
  • Tela de fim: nova linha "Tempo: mm:ss" com o tempo jogado. Novo botão Trocar modo, que volta para a tela inicial. "Jogar novamente" repete o mesmo modo e tempo.
  • Estilos: o seletor de modo é compacto e cabe no menor tamanho de tela. "Trocar modo" usa um estilo secundário (contorno).

Nenhuma tecla nova foi criada. Enter, Espaço, setas e ESC funcionam como antes.

Como testar

  1. Abrir o inde.html no navegador (ou rodar script/test).
  2. Padrão: clicar em Jogar. O cronômetro começa em 00:00 e conta. Apertar Espaço para pausar: o tempo para. Apertar Espaço de novo: o tempo volta a contar. Apertar ESC: aparece "Game Over" com o tempo jogado. "Jogar novamente" reinicia em 00:00.
  3. Contra o Tempo: clicar em "Trocar modo", marcar "Contra o tempo", escolher 1 min e jogar. O cronômetro começa em 01:00 e conta para trás. As peças aceleram visivelmente perto do fim. Em 00:00 aparece "Tempo esgotado!" com a pontuação final.
  4. No modo Contra o Tempo, deixar as peças empilharem até o topo: aparece "Game Over".
  5. Diminuir a janela do navegador e conferir se a tela inicial e a tela de fim continuam cabendo.

Critérios de aceite

  • Modo Padrão: cronômetro começa em 00:00, conta e reinicia a cada partida
  • Modo Contra o Tempo: tempo limite configurável, contagem regressiva e fim em 00:00
  • Modo Contra o Tempo: peças mais rápidas conforme o tempo acaba; modo Padrão inalterado

Validei com testes automatizados no navegador (Edge headless), sem erros no console, e com prints em 300px, 450px e 1000px.

Observações

  • Conflito com feature/peca-fantasma (PR Feature/peca fantasma #2): é intencional. A atividade pede que a equipe passe por um conflito de PR. Por isso, parte do código do cronômetro foi colocada nos mesmos pontos onde a peça fantasma também insere código. Quando um dos dois PRs entrar na main, o outro vai conflitar em 2 trechos do inde.html:

    1. Logo depois de lose(): a seção CRONÔMETRO / MODO CONTRA O TEMPO e o var ghost / toggleGhost().
    2. Logo depois de drawRows(): drawTimer() e drawGhost().

    Como resolver: manter os dois lados nos dois trechos, já que não há lógica sobreposta. Nos demais pontos o merge é automático (KEY, CONTROLS, keydown() e drawCourt() não foram alterados aqui). Se o PR Feature/peca fantasma #2 entrar primeiro, faço git merge origin/main nesta branch, resolvo mantendo a tecla G e a sombra junto com o cronômetro, e testo de novo.

  • Aba em segundo plano: o requestAnimationFrame para, e o cronômetro congela junto com o jogo. É o mesmo comportamento do resto do jogo.

  • Decisões técnicas:

    • O cronômetro usa uma variável própria, elapsed, e não a dt. A dt tem o comentário "time since starting this game", mas na verdade é o acumulador da queda da peça.
    • lose() ganhou um parâmetro opcional (lose(true) = tempo esgotado). As chamadas existentes continuam iguais.

Mostra o tempo da partida no menu lateral (mm:ss). O cronômetro só conta
enquanto a partida está em andamento, para na pausa e reinicia em 00:00 a
cada nova partida. O DOM só é atualizado quando o segundo exibido muda.
A tela inicial passa a ter as opções Padrão e Contra o tempo e um seletor
de tempo limite (1, 2, 3 ou 5 minutos), habilitado só no modo Contra o
Tempo. No modo Contra o Tempo o cronômetro faz contagem regressiva a partir
do tempo limite. A tela de fim ganha o botão Trocar modo, que volta para a
tela inicial; Jogar novamente repete o mesmo modo e tempo.
…ntra o Tempo

Centraliza o cálculo de step em updateStep(). No modo Padrão a fórmula é
exatamente a de antes (acelera só com as linhas completadas). No modo Contra
o Tempo a partida começa na velocidade normal e chega à velocidade máxima
(0,1 s por linha) quando o tempo acaba, recalculando a cada frame.
No modo Contra o Tempo, quando o cronômetro chega em 00:00 a partida
termina reaproveitando lose(), e a tela de fim mostra "Tempo esgotado!".
Derrota por empilhar peças ou ESC continua mostrando "Game Over", em
qualquer modo. A tela de fim também passa a mostrar o tempo jogado.
O cronômetro segue o mesmo estilo de score e rows. As opções de modo e o
seletor de tempo limite ficam compactos para caber no menor tamanho de
tela, e o botão Trocar modo usa um estilo secundário (contorno).

@Caique-Souza1 Caique-Souza1 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.

** Revisão concluída e aprovada **

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.

3 participants