Uma competição entre duas IAs em um jogo simples. Vou fazer o exemplo mais claro possível usando Jogo da Velha (Tic-Tac-Toe), onde IA X e IA O jogam uma contra a outra automaticamente.






🎮 Competição IA vs IA — Jogo da Velha

Aqui está um código completo em Python que cria:

  • Um tabuleiro

  • Funções para jogadas

  • Duas IAs que escolhem suas jogadas

  • Partida automática até alguém vencer

As IAs usam decisões simples (aleatórias).
Se quiser, posso melhorar para IA “inteligente”.


🧠 Código (IA X vs IA O)

import random

# Cria tabuleiro
def novo_tabuleiro():
    return [" "]*9

# Mostra tabuleiro
def mostrar(t):
    print(f"{t[0]} | {t[1]} | {t[2]}")
    print("--+---+--")
    print(f"{t[3]} | {t[4]} | {t[5]}")
    print("--+---+--")
    print(f"{t[6]} | {t[7]} | {t[8]}")
    print()

# Verifica vitória
def venceu(t, jogador):
    combinacoes = [
        [0,1,2],[3,4,5],[6,7,8],  # linhas
        [0,3,6],[1,4,7],[2,5,8],  # colunas
        [0,4,8],[2,4,6]           # diagonais
    ]
    return any(all(t[i] == jogador for i in c) for c in combinacoes)

# IA: escolhe jogada aleatória válida
def jogada_ia(t, jogador):
    opcoes = [i for i in range(9) if t[i] == " "]
    escolha = random.choice(opcoes)
    t[escolha] = jogador

# Execução da partida
tab = novo_tabuleiro()
jogador = "X"  # IA X começa

while " " in tab:
    jogada_ia(tab, jogador)
    print(f"IA {jogador} jogou:")
    mostrar(tab)
    
    if venceu(tab, jogador):
        print(f"IA {jogador} VENCEU! 🎉")
        break
    
    jogador = "O" if jogador == "X" else "X"  # troca turno

if " " not in tab and not venceu(tab, "X") and not venceu(tab, "O"):
    print("Empate! 🤝")

🚀 O que fazer agora?

Posso criar para você:

✔️ versão melhorada, onde as IAs pensam (minimax)
✔️ versão com interface gráfica
✔️ outra competição: corrida, batalha de números, adivinhação
✔️ colocar estratégias diferentes para ver qual IA vence mais

Qual tipo de jogo você quer que as IAs disputem? 🎮🤖

 

Excelente pedido! Vamos criar uma **competição épica entre IAs** com estratégias diferentes. Aqui está uma versão **melhorada e analítica** do Jogo da Velha:

```python
import random
from collections import defaultdict
import time

class JogoDaVelhaCompetitivo:
    def __init__(self):
        self.tabuleiro = [" "] * 9
        self.estatisticas = {
            'X': {'vitorias': 0, 'derrotas': 0, 'empates': 0},
            'O': {'vitorias': 0, 'derrotas': 0, 'empates': 0}
        }
        self.historico_partidas = []
    
    def mostrar_tabuleiro(self):
        """Mostra o tabuleiro de forma visual"""
        print("\n" + "="*30)
        for i in range(0, 9, 3):
            print(f" {self.tabuleiro[i]} | {self.tabuleiro[i+1]} | {self.tabuleiro[i+2]} ")
            if i < 6:
                print("---+---+---")
        print()
    
    def jogadas_disponiveis(self):
        """Retorna lista de posições vazias"""
        return [i for i in range(9) if self.tabuleiro[i] == " "]
    
    def verificar_vitoria(self, jogador):
        """Verifica se o jogador venceu"""
        vitorias = [
            [0,1,2], [3,4,5], [6,7,8],  # Linhas
            [0,3,6], [1,4,7], [2,5,8],  # Colunas
            [0,4,8], [2,4,6]            # Diagonais
        ]
        return any(all(self.tabuleiro[pos] == jogador for pos in comb) for comb in vitorias)
    
    def tabuleiro_cheio(self):
        """Verifica se o tabuleiro está completo"""
        return " " not in self.tabuleiro

# ===========================================
# ESTRATÉGIAS DAS IAs (Diferentes personalidades)
# ===========================================

class IA_Aleatoria:
    """IA que joga de forma completamente aleatória"""
    def __init__(self, nome):
        self.nome = nome
    
    def jogar(self, tabuleiro):
        return random.choice([i for i in range(9) if tabuleiro[i] == " "])

class IA_CentroPrimeiro:
    """IA que prioriza o centro, depois cantos, depois laterais"""
    def __init__(self, nome):
        self.nome = nome
    
    def jogar(self, tabuleiro):
        disponiveis = [i for i in range(9) if tabuleiro[i] == " "]
        prioridades = [4, 0, 2, 6, 8, 1, 3, 5, 7]  # Centro, cantos, laterais
        
        for pos in prioridades:
            if pos in disponiveis:
                return pos
        
        return random.choice(disponiveis)  # Fallback

class IA_Defensiva:
    """IA que tenta bloquear o adversário e vencer"""
    def __init__(self, nome):
        self.nome = nome
    
    def jogar(self, tabuleiro, meu_simbolo):
        adversario = "O" if meu_simbolo == "X" else "X"
        
        # 1. Tenta vencer
        for pos in [i for i in range(9) if tabuleiro[i] == " "]:
            tabuleiro_teste = tabuleiro.copy()
            tabuleiro_teste[pos] = meu_simbolo
            vitorias = [
                [0,1,2], [3,4,5], [6,7,8],
                [0,3,6], [1,4,7], [2,5,8],
                [0,4,8], [2,4,6]
            ]
            if any(all(tabuleiro_teste[p] == meu_simbolo for p in comb) for comb in vitorias):
                return pos
        
        # 2. Tenta bloquear adversário
        for pos in [i for i in range(9) if tabuleiro[i] == " "]:
            tabuleiro_teste = tabuleiro.copy()
            tabuleiro_teste[pos] = adversario
            vitorias = [
                [0,1,2], [3,4,5], [6,7,8],
                [0,3,6], [1,4,7], [2,5,8],
                [0,4,8], [2,4,6]
            ]
            if any(all(tabuleiro_teste[p] == adversario for p in comb) for comb in vitorias):
                return pos
        
        # 3. Joga no centro se disponível
        if tabuleiro[4] == " ":
            return 4
        
        # 4. Joga em um canto
        cantos = [0, 2, 6, 8]
        cantos_disponiveis = [c for c in cantos if tabuleiro[c] == " "]
        if cantos_disponiveis:
            return random.choice(cantos_disponiveis)
        
        # 5. Qualquer posição disponível
        disponiveis = [i for i in range(9) if tabuleiro[i] == " "]
        return random.choice(disponiveis)

class IA_MiniMax:
    """IA usando algoritmo MiniMax (mais inteligente)"""
    def __init__(self, nome):
        self.nome = nome
    
    def minimax(self, tabuleiro, profundidade, maximizando, simbolo):
        adversario = "O" if simbolo == "X" else "X"
        
        # Verifica estado final
        if any(all(tabuleiro[p] == simbolo for p in comb) for comb in [
            [0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]
        ]):
            return 10 - profundidade
        if any(all(tabuleiro[p] == adversario for p in comb) for comb in [
            [0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]
        ]):
            return profundidade - 10
        if " " not in tabuleiro:
            return 0
        
        if maximizando:
            melhor = -float('inf')
            for i in range(9):
                if tabuleiro[i] == " ":
                    tabuleiro[i] = simbolo
                    score = self.minimax(tabuleiro, profundidade + 1, False, simbolo)
                    tabuleiro[i] = " "
                    melhor = max(melhor, score)
            return melhor
        else:
            melhor = float('inf')
            for i in range(9):
                if tabuleiro[i] == " ":
                    tabuleiro[i] = adversario
                    score = self.minimax(tabuleiro, profundidade + 1, True, simbolo)
                    tabuleiro[i] = " "
                    melhor = min(melhor, score)
            return melhor
    
    def jogar(self, tabuleiro, meu_simbolo):
        melhor_score = -float('inf')
        melhor_jogada = None
        
        for i in range(9):
            if tabuleiro[i] == " ":
                tabuleiro[i] = meu_simbolo
                score = self.minimax(tabuleiro, 0, False, meu_simbolo)
                tabuleiro[i] = " "
                
                if score > melhor_score:
                    melhor_score = score
                    melhor_jogada = i
        
        return melhor_jogada

# ===========================================
# TORNEIO ENTRE IAs
# ===========================================

def realizar_torneio(num_partidas=100):
    """Realiza um torneio entre diferentes IAs"""
    print("🏆 TORNEIO DE IAs - JOGO DA VELHA 🏆")
    print("="*50)
    
    # Cria IAs com diferentes estratégias
    estrategias = {
        "Aleatória": IA_Aleatoria("Aleatória"),
        "Centro 1º": IA_CentroPrimeiro("Centro 1º"),
        "Defensiva": IA_Defensiva("Defensiva"),
        "MiniMax": IA_MiniMax("MiniMax")
    }
    
    resultados = defaultdict(lambda: {'vit': 0, 'der': 0, 'emp': 0})
    
    # Testa todos os pares de IAs
    estrategias_lista = list(estrategias.items())
    
    for (nome1, ia1), (nome2, ia2) in [(estrategias_lista[i], estrategias_lista[j]) 
                                        for i in range(len(estrategias_lista)) 
                                        for j in range(i+1, len(estrategias_lista))]:
        
        print(f"\n⚔️  {nome1} (X) vs {nome2} (O) ⚔️")
        print("-"*30)
        
        vitorias_ia1 = 0
        vitorias_ia2 = 0
        empates = 0
        
        for partida in range(num_partidas):
            jogo = JogoDaVelhaCompetitivo()
            turno = "X"
            
            while True:
                # IA 1 joga como X
                if turno == "X":
                    if isinstance(ia1, IA_Defensiva) or isinstance(ia1, IA_MiniMax):
                        jogada = ia1.jogar(jogo.tabuleiro.copy(), "X")
                    else:
                        jogada = ia1.jogar(jogo.tabuleiro.copy())
                # IA 2 joga como O
                else:
                    if isinstance(ia2, IA_Defensiva) or isinstance(ia2, IA_MiniMax):
                        jogada = ia2.jogar(jogo.tabuleiro.copy(), "O")
                    else:
                        jogada = ia2.jogar(jogo.tabuleiro.copy())
                
                jogo.tabuleiro[jogada] = turno
                
                # Verifica vitória
                if jogo.verificar_vitoria(turno):
                    if turno == "X":
                        vitorias_ia1 += 1
                    else:
                        vitorias_ia2 += 1
                    break
                
                # Verifica empate
                if jogo.tabuleiro_cheio():
                    empates += 1
                    break
                
                # Alterna turno
                turno = "O" if turno == "X" else "X"
        
            # Reinicia tabuleiro
            jogo.tabuleiro = [" "] * 9
        
        # Atualiza estatísticas
        resultados[nome1]['vit'] += vitorias_ia1
        resultados[nome1]['der'] += vitorias_ia2
        resultados[nome1]['emp'] += empates
        
        resultados[nome2]['vit'] += vitorias_ia2
        resultados[nome2]['der'] += vitorias_ia1
        resultados[nome2]['emp'] += empates
        
        print(f"Resultados após {num_partidas} partidas:")
        print(f"{nome1}: {vitorias_ia1} vitórias")
        print(f"{nome2}: {vitorias_ia2} vitórias")
        print(f"Empates: {empates}")
        print(f"Taxa de vitória {nome1}: {vitorias_ia1/num_partidas*100:.1f}%")
        print(f"Taxa de vitória {nome2}: {vitorias_ia2/num_partidas*100:.1f}%")
    
    # Mostra classificação final
    print("\n" + "="*50)
    print("🏁 CLASSIFICAÇÃO FINAL DO TORNEIO 🏁")
    print("="*50)
    
    # Calcula pontos (3 por vitória, 1 por empate)
    classificacao = []
    for nome, stats in resultados.items():
        pontos = stats['vit'] * 3 + stats['emp']
        classificacao.append((nome, pontos, stats['vit'], stats['der'], stats['emp']))
    
    # Ordena por pontos
    classificacao.sort(key=lambda x: x[1], reverse=True)
    
    print("\nPosição | IA          | Pontos | Vitórias | Derrotas | Empates")
    print("-"*60)
    for i, (nome, pontos, vit, der, emp) in enumerate(classificacao, 1):
        print(f"{i:^8}| {nome:<12}| {pontos:^7}| {vit:^9}| {der:^9}| {emp:^7}")
    
    # Mostra IA vencedora
    vencedor = classificacao[0]
    print(f"\n🎉 CAMPEÃ: {vencedor[0]} com {vencedor[1]} pontos! 🎉")
    
    return classificacao

# ===========================================
# EXECUTAR PARTIDA INDIVIDUAL (para visualização)
# ===========================================

def partida_individual(ia1, ia2, mostrar_jogo=True):
    """Executa uma partida individual entre duas IAs"""
    print(f"\n🎮 PARTIDA: {ia1.nome} (X) vs {ia2.nome} (O)")
    print("="*40)
    
    jogo = JogoDaVelhaCompetitivo()
    turno = "X"
    movimentos = []
    
    while True:
        # IA 1 joga
        if turno == "X":
            if isinstance(ia1, IA_Defensiva) or isinstance(ia1, IA_MiniMax):
                jogada = ia1.jogar(jogo.tabuleiro.copy(), "X")
            else:
                jogada = ia1.jogar(jogo.tabuleiro.copy())
            jogador_nome = ia1.nome
        # IA 2 joga
        else:
            if isinstance(ia2, IA_Defensiva) or isinstance(ia2, IA_MiniMax):
                jogada = ia2.jogar(jogo.tabuleiro.copy(), "O")
            else:
                jogada = ia2.jogar(jogo.tabuleiro.copy())
            jogador_nome = ia2.nome
        
        jogo.tabuleiro[jogada] = turno
        movimentos.append((jogador_nome, jogada))
        
        if mostrar_jogo:
            print(f"\n{turno} ({jogador_nome}) jogou na posição {jogada}")
            jogo.mostrar_tabuleiro()
            time.sleep(0.5)  # Pausa para visualização
        
        # Verifica vitória
        if jogo.verificar_vitoria(turno):
            print(f"🎯 VITÓRIA DO {turno} ({jogador_nome})!")
            return turno, movimentos
        
        # Verifica empate
        if jogo.tabuleiro_cheio():
            print("🤝 EMPATE!")
            return None, movimentos
        
        # Alterna turno
        turno = "O" if turno == "X" else "X"

# ===========================================
# MENU PRINCIPAL
# ===========================================

def main():
    print("🤖 ARENA DE IAs - JOGO DA VELHA COMPETITIVO 🤖")
    print("="*60)
    
    while True:
        print("\nOpções:")
        print("1. 🎯 Ver partida individual (MiniMax vs Defensiva)")
        print("2. ⚔️  Ver partida aleatória (Aleatória vs Centro 1º)")
        print("3. 🏆 Realizar torneio completo (todas as IAs)")
        print("4. 📊 Ver estatísticas avançadas")
        print("5. 🚪 Sair")
        
        opcao = input("\nEscolha uma opção (1-5): ")
        
        if opcao == "1":
            ia_minimax = IA_MiniMax("MiniMax Avançado")
            ia_defensiva = IA_Defensiva("Defensiva")
            partida_individual(ia_minimax, ia_defensiva, mostrar_jogo=True)
        
        elif opcao == "2":
            ia_aleatoria = IA_Aleatoria("Aleatória Pura")
            ia_centro = IA_CentroPrimeiro("Centro Primeiro")
            partida_individual(ia_aleatoria, ia_centro, mostrar_jogo=True)
        
        elif opcao == "3":
            print("\nIniciando torneio...")
            resultados = realizar_torneio(num_partidas=50)  # 50 partidas por confronto
        
        elif opcao == "4":
            print("\n📈 ANÁLISE DE ESTRATÉGIAS:")
            print("-"*40)
            print("1. Aleatória: Simples, imprevisível")
            print("2. Centro 1º: Estratégia básica eficiente")
            print("3. Defensiva: Tenta bloquear e vencer")
            print("4. MiniMax: Algoritmo ótimo (nunca perde se jogar primeiro)")
            print("\nDica: MiniMax é invencível no Jogo da Velha!")
        
        elif opcao == "5":
            print("Até a próxima! 👋")
            break
        
        else:
            print("Opção inválida. Tente novamente.")

# Executar o programa
if __name__ == "__main__":
    main()
```

## 🎯 **O que este código oferece:**

### **4 Tipos de IA:**
1. **Aleatória** - Joga em qualquer posição vazia
2. **Centro Primeiro** - Estratégia básica humana
3. **Defensiva** - Tenta bloquear vitórias adversárias
4. **MiniMax** - Algoritmo ótimo (quase invencível)

### **Recursos:**
- ✅ **Torneio completo** entre todas as IAs
- ✅ **Partidas individuais** com visualização
- ✅ **Estatísticas detalhadas**
- ✅ **Sistema de pontuação**
- ✅ **Histórico de movimentos**

### **Como executar:**
```bash
python jogo_velha_ia.py
```

### **Próximas melhorias possíveis:**
1. **Interface gráfica com PyGame**
2. **Machine Learning** (IA que aprende com as partidas)
3. **Jogo da Velha 4x4** ou **5x5**
4. **Outros jogos**: Damas, Xadrez simplificado, Connect-4

**Quer que eu implemente alguma dessas melhorias ou prefere focar em outro tipo de competição entre IAs?** 🚀