Copa de futebol online para jogar com os amigos. Cada participante entra na sala por um código (sem cadastro), todos montam seus times em um draft e disputam um campeonato — mata-mata ou pontos corridos. Funciona muito bem no celular.
A simulação das partidas é animada em um placar estilo transmissão, com gols minuto a minuto, pênaltis no mata-mata, artilheiro e troféu para o campeão.
- Uma pessoa cria a sala e compartilha o código (algo como
K7Q2). - Cada amigo abre o site, digita o nome de técnico e o código — sem nenhum cadastro.
- Quando todos entram, o anfitrião inicia o draft: os técnicos escolhem jogadores em rodadas de ida e volta.
- O campeonato começa. O anfitrião comanda as simulações; a tela de todos atualiza sozinha.
O estado da partida fica salvo no servidor, de modo que ninguém precisa manter uma aba aberta e a sala sobrevive a quedas de conexão.
O jogo usa o Supabase (plano gratuito) como servidor de tempo real. Os jogadores nunca criam conta — apenas você faz esta configuração inicial, que leva cerca de cinco minutos.
Acesse https://supabase.com, crie uma conta gratuita e clique em New project. Defina um nome e uma senha para o banco de dados (guarde-a) e aguarde o provisionamento.
No painel do projeto, abra SQL Editor, cole o trecho abaixo e clique em Run:
create table if not exists public.rooms (
id text primary key,
state jsonb not null,
updated_at timestamptz not null default now()
);
alter table public.rooms enable row level security;
create policy "anon all" on public.rooms
for all using (true) with check (true);
alter publication supabase_realtime add table public.rooms;Isso cria a tabela das salas, libera o acesso anônimo (apropriado para um jogo casual entre amigos) e habilita as atualizações em tempo real.
No painel, vá em Project Settings → API e copie dois valores:
- Project URL → variável
VITE_SUPABASE_URL - anon public (em Project API keys) → variável
VITE_SUPABASE_ANON_KEY
Copie o arquivo de exemplo e preencha com as duas chaves:
cp .env.example .envO .env deve ficar assim:
VITE_SUPABASE_URL=https://xxxxxxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGciOi...
npm install
npm run devAbra o endereço exibido (geralmente http://localhost:5173). Para testar o multiplayer, abra a mesma sala em duas abas ou em dois aparelhos na mesma rede.
- Envie este projeto para um repositório no GitHub.
- Em https://vercel.com, clique em Add New → Project e importe o repositório. A Vercel detecta o Vite automaticamente — não é preciso ajustar o comando de build.
- Antes de concluir, abra Environment Variables e cadastre as mesmas duas chaves do
.env:VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Clique em Deploy. Ao final, compartilhe a URL gerada com os amigos.
Caso adicione as variáveis depois do primeiro deploy, faça um novo deploy (ou Redeploy) para que passem a valer.
Se as chaves do Supabase não estiverem definidas, o jogo entra automaticamente em modo local: tudo funciona na mesma tela e sincroniza apenas entre abas do mesmo navegador. É útil para conhecer o jogo antes da configuração, mas não permite jogar entre aparelhos diferentes. Para o multiplayer real, conclua a configuração do Supabase descrita acima.
src/
engine/ Regras do jogo (geração de jogadores, draft, simulação, campeonato)
lib/ Identidade anônima, cliente Supabase e camada de rede (sala)
components/ Telas em React (início, lobby, draft, campeonato, partida, campeão)
App.jsx Orquestrador: estado da sala, sincronização e navegação entre telas
styles.css Sistema de design (tema estádio à noite)
| Comando | Função |
|---|---|
npm run dev |
Ambiente de desenvolvimento com recarga automática |
npm run build |
Gera a versão de produção em dist/ |
npm run preview |
Pré-visualiza localmente a versão de produção |
- "Sala não encontrada" — confira se o código foi digitado corretamente e se o anfitrião realmente criou a sala. Códigos não diferenciam maiúsculas de minúsculas.
- A tela não atualiza para os outros jogadores — verifique se o passo do
alter publication supabase_realtime add table public.rooms;foi executado e se as variáveis de ambiente estão corretas na Vercel. - Aparece "modo local" sem querer — significa que as variáveis
VITE_SUPABASE_URLeVITE_SUPABASE_ANON_KEYnão foram carregadas. Confira o.env(local) ou as Environment Variables (Vercel) e refaça o deploy.