Visão geral
Segundo jogo do portfólio, depois do Mario. Diferente do Mario (correção de um jogo já pronto), este foi construído do zero: um rogue-lite de cartas estilo Reigns, escopo pequeno e fechado de propósito, pra ficar 100% polido em vez de grande e raso. 18 cartas (monstro, poção, equipamento, armadilha), o jogador arrasta ou usa o teclado pra decidir entre a escolha segura e a arriscada em cada uma, até sobreviver à masmorra ou perder toda a vida.
Serve também como prova de capacidade técnica pra quem procura minigame sob medida: é um jogo inteiro (lógica, testes, deploy) sem motor de jogo nenhum, só TypeScript e a biblioteca padrão do navegador.
Arquitetura
A lógica de jogo é pura: recebe o estado atual e a decisão do jogador, devolve o novo estado, sem
mutar nada e sem depender do DOM. O embaralhamento do baralho usa um gerador com semente em vez de
Math.random() cru, o que torna cada partida (dada a mesma semente) 100% reproduzível — e o teste
do embaralhamento determinístico, não passa "às vezes sim, às vezes não". O arrasto usa a Pointer
Events API, que já unifica mouse e toque no mesmo código, sem duplicar lógica pra cada plataforma.
Um teste automatizado com navegador headless encontrou um bug real antes do lançamento: a tela de
fim ficava invisível mas continuava bloqueando clique nos botões por baixo, por causa de uma regra
de CSS que sobrescrevia o display: none do atributo hidden. Corrigido antes de ir pro ar.
Stack
TypeScript puro, sem framework e sem motor de jogo (nada de Unity/Godot): só tsc compilando pra
JavaScript de navegador. 19 testes automatizados na lógica pura do jogo, mais teste manual com
Playwright cobrindo arrasto, teclado, botões e reinício.