Como fazer um jogo da velha que realmente funcione
Quem digita eu quero jogo da velha geralmente tá cansado de procurar sites cheios de propaganda ou apps que não carregam. A verdade é que montar um jogo da velha simples dá menos de 30 linhas de código se você souber por onde começar. O problema é que a maioria dos tutoriais que aparecem no Google ensinam a versão mais básica possível, que não tem inteligência artificial e só serve pra dois jogadores humanos clicando um ao lado do outro. Eu já fiz uns três desses projetos ao longo dos anos. O primeiro foi num trabalho de faculdade em 2016, o segundo foi um mini-curso pra iniciantes em 2019, e o terceiro foi algo mais pra valer com um algoritmo minimax implementado do zero. Cada vez aparecia um problema que ninguém mencionava nos tutoriais, então vou listar o que realmente importa aqui.
Eu quero jogo da velha e não quero perder pra um bot que só faz jogadas aleatórias
A diferença entre um jogo da velha amador e um que pelo menos tenta ganhar é o algoritmo minimax. Ele analisa todas as ramificações possíveis do tabuleiro e escolhe o movimento que leva ao melhor resultado pra IA. Na prática, isso significa que a partir do terceiro nível de dificuldade, a IA já não comete erros. Se você jogar perfeitamente, o resultado sempre será empate, que é o melhor resultado possível nesse jogo. Para implementar, você precisa de três coisas: uma função que avalia o estado final do tabuleiro, uma função recursiva que simula todas as jogadas possíveis, e um loop que escolhe o movimento com o maior valor esperado. O código típico em Python parece com isso:
A função de avaliação retorna 10 se a IA ganhar, -10 se o humano ganhar, e 0 para empate. Cada nível recursivo subtrai ou adiciona profundidade pra evitar que a IA prefira vitórias mais longas em vez de mais curtas. Esse detalhe da profundidade é um dos erros mais comuns que eu vejo em tutoriais inexistentes na internet.
Problema real que eu encontrei e como resolvi
No meu terceiro projeto, o jogo travava quando o tabuleiro chegava a posições muito específicas do meio do jogo. O navegador simplesmente congelava por cerca de 8 segundos. O problema era que o minimax sem poda beta-alpha fazia um número absurdo de chamadas recursivas em posições já decididas. Eu contei umas 2 milhões de chamadas pra uma única jogada. A solução foi implementar a poda beta-alpha, que basicamente para de avaliar um ramo da árvore assim que descobre que ele já é pior que uma alternativa já conhecida. Com essa otimização, o tempo de resposta caiu de 8 segundos pra cerca de 120 milissegundos. Não é muito, mas faz toda a diferença quando você tá jogando.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Alternativas ao minimax puro
Se minimax sozinho parece pesado demais pros seus objetivos, existem duas alternativas práticas. A primeira é usar uma tabela de posições pré-calculada. Como o jogo da velha tem apenas 5478 posições legais diferentes, dá pra pré-computar a jogada ideal pra cada uma e simplesmente consultar a tabela. Isso é instantâneo e funciona em qualquer dispositivo, até em JavaScript no navegador sem ningún delay. A segunda alternativa é um sistema de pesos por posição. Você atribui pontos a cada célula do tabuleiro baseado em quão estratégica ela é, e a IA sempre escolhe a célula com maior peso disponível. É bem mais simples que minimax e serve pra níveis de dificuldade fácil e médio. Funciona bem pra jogos casuais, mas alguém que saiba o mínimo de estratégia vai perceber que as jogadas são previsíveis em poucos minutos.
O que ninguém conta sobre.difficulty levels
Colocar níveis de dificuldade em jogo da velha parece fácil, mas tem uma armadilha. A maioria dos devs faz o nível fácil usando aleatoriedade pura, o nível médio com alguma heurística básica, e o difícil com minimax completo. O problema é que o nível médio fica estranho porque às vezes a IA joga bem e às vezes joga mal de forma inconsistente. Pra resolver, eu criei uma probabilidade de erro: no nível fácil, a IA erra em cerca de 60% das jogadas. No médio, 25%. No difícil, 0%. A probabilidade de erro é aplicada depois que o algoritmo calcula o melhor movimento, então a IA ainda pensa, só que às vezes escolhe não seguir o pensamento dela.
Links e onde encontrar código pronto
Se você não quer programar do zero, existem repositórios públicos com implementações completas. No GitHub tem o projeto tic-tac-toe-minimax que inclui poda beta-alpha, interface em HTML/CSS/JS, e três níveis de dificuldade funcionais. Tem também uma versão em Python com interface de terminal que é boa pra quem tá começando a aprender lógica de programação. Se quiser algo pronto pra rodar agora, muitos desses projetos vêm com arquivos HTML standalone que funcionam direto no navegador sem precisar instalar nada. Só baixar e abrir. A versão com tabela pré-calculada é a mais rápida e roda liso até em celular velho.
O ponto principal é que jogo da velha parece simples, mas implementar bem exige entender recursão, poda de árvore de decisão, e o fato de que o jogo em si é matematicamente resolvido — o jogador que começa com jogadas perfeitas sempre empata. Qualquer coisa além disso é só otimização e apresentação visual.