Eu Quero Jogo Da Velha - Jogo da velha para imprimir – Vamos Imprimir
Jogo da velha para imprimir – Vamos Imprimir

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.