Visão geral
Quinto jogo do portfólio, segundo em Lua. Cobre o gênero "ação rápida" da lista original de ideias de jogo, mas sem o risco que descartei antes num rhythm game: sem música, sem timing de batida pra sincronizar, só desvio em tempo real. Cobra clássica: desvie de parede e do próprio rabo, coma pra crescer e pontuar.
Mesma ponte do Depósito Lotado: fengari, uma VM de Lua compilada
pra JavaScript, é a única peça de JS do projeto. A diferença de arquitetura é que aqui o jogo
roda em tempo real — um setInterval chama um "tick" da lógica a cada 150ms sozinho, sem esperar
decisão do jogador, diferente do Sokoban que só muda de estado quando o jogador decide algo.
Arquitetura
Cobra.avancar(estado) continua sendo uma função pura e determinística, mesmo o jogo sendo em
tempo real: o temporizador é um detalhe de quando a interface decide chamar a lógica, não faz
parte da lógica em si. Isso manteve a suíte de testes 100% independente de temporizador, chamando
avancar na mão quantas vezes quiser.
O ponto mais fácil de errar num Snake é a colisão com o próprio corpo: a cauda anda embora no mesmo tick em que a cabeça avança, então a célula dela não deveria contar como colisão, mas o resto do corpo sim. Isso ficou como teste explícito, junto com um gerador de posição de comida com semente determinística (mesma família de PRNG usada nos jogos em TypeScript do portfólio, adaptado pra Lua).
Stack
Lua 5.3 (via fengari), zero framework, zero motor de jogo. HTML/CSS/Lua estático, sem build.