Ir ao conteúdo
  • Cadastre-se
marcim1m

Python Jogo da velha Python simples. Preciso melhorar a AI

Posts recomendados

A AI não precisa ser invencível ela precisa ser um pouquinho melhor mas não estou conseguindo evoluir ela mais que isso alguém pode ajudar?

mport os
import random

  
tab = [0, 1, 2,
3, 4, 5,
6, 7, 8]

Nome = input("Qual seu nome?")
 
def desenhar():
os.system('clear') or None
print('+-----------+')
print('|',tab[0], "|", tab[1], "|", tab[2],'|')
print('|','-'* 9,'|')
print('|',tab[3], "|", tab[4], "|", tab[5],'|')
print('|','-'* 9,'|')
print('|',tab[6], "|", tab[7], "|", tab[8],'|')
print('+-----------+')
 

def jogadaHumano():
while True:
jogada = input('Escolha sua jogada:')
pos = int(jogada)

if tab[pos] == 'X' or tab [pos] == 'O':
print('Jogada invalida')
continue
 
tab[pos] = 'X'
break
# A "AI" NÃO VAI GANHAR SEMPRE MAS TENTAR EVITAR ALGUNS MOVIMENTOS
def jogadaAI():
op = []
for i in range(0, 9):
if tab[5] == 'X' or tab[5] == 'O':
op = [8,1] # Coloca as opções disponíveis caso 5 esteja marcado
elif tab[0] == 'X' or tab[0] == 'O':
op = [1] # Coloca as opções disponíveis caso 0 esteja marcado
elif tab [4] == 'X' or tab [4] == 'O':
op = [0]
elif tab[4] == 'X' or tab[4] == 'O':
op = [6,8]
elif tab[3] == 'X' or tab[3] == 'O':
op = [1]
elif tab[4] == 'X' or tab[4] == 'O':
op = [8]
elif tab[1] == 'X' or tab[1] == 'O':
op = [7]
elif tab[8] == 'X' or tab[8] == 'O':
op = [2]
elif tab[5] == 'X' or tab[5] == 'O':
op = [7]
elif tab[1] == 'X' or tab[1] == 'O':
op = [0]
elif tab != 'X' and tab != 'O':
op.append(tab)
jogada = random.choice(op)
tab[jogada] = 'O'


#validção
def ganhou(turno):
#valida a primeira linha
if tab[0] == turno and tab[1] == turno and tab[2] == turno:
return True
elif tab[3]== turno and tab[4]== turno and tab[5]== turno:
return True
elif tab[6]== turno and tab[7]== turno and tab[8]== turno:
return True
#valida diagonal
elif tab[0] == turno and tab[4] == turno and tab[8]== turno:
return True
elif tab[2] == turno and tab[4] == turno and tab[6] == turno:
return True
#valida coluna
elif tab[0] == turno and tab[3] == turno and tab[6] == turno:
return True
elif tab[1] == turno and tab[4] == turno and tab[7] == turno:
return True
elif tab[2] == turno and tab[5] == turno and tab[8] == turno:
return True
 
return False
 

desenhar()

turno = 'X'
for i in range(0,9):
if turno == 'O':
jogadaAI()
else :
jogadaHumano()
desenhar()
if ganhou(turno):
print('Jogador ', turno,' ganhou o jogo!!')
break
if i == 8:
print('Deu velha!!')
turno = 'X' if turno == 'O' else 'O'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@marcim1m, parece que o teu código está incompleto... tentei organizá-lo, mas acho que não tive sucesso. Não está rodando corretamente. Por favor, poste o teu código atual completo novamente.

 

Observação: antes de "colar o código", clique no botão "<>" e cole o texto dentro. Veja na imagem abaixo onde fica o botão.

 

botao_code.png

 

 

 

Sobre a lógica do "jogador computador", qual estratégia acha que ele deveria tomar? pense no problema de um modo geral... tipo... você como humano, como faz para jogar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

https://repl.it/@MarcioMarcos/programajdv eu uso ele no repl.it tente por lá 

Sobre a lógica só quero evitar que o jogo fique fácil demais o computador não precisa ganhar todas 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre:

18 horas atrás, marcim1m disse:

https://repl.it/@MarcioMarcos/programajdv eu uso ele no repl.it tente por lá.

 

Por um acaso eu tentei lá mesmo :), mas esta não foi a questão. Eu não programo em Python, mas vi que um dos pontos para o código funcionar é que o "texto" esteja indentado corretamente (o alinhamento do código faz parte da lógica). O teu código original veio desalinhado (todo alinhado a esquerda) na postagem original. Para o código ficar certo aqui no Fórum precisamos que poste novamente o código completo utilizando a tag CODE. Como citado:

 

22 horas atrás, Simon Viegas disse:

Observação: antes de "colar o código", clique no botão "<>" e cole o texto dentro. Veja na imagem abaixo onde fica o botão.

 

botao_code.png


RESUMINDO: Por favor, poste o código completo utilizando a tag CODE. Primeiro precisamos verificar se o teu código atual está funcionando ou não. Pois antes precisa corrigir o atual, para depois inserir a melhoria ("um computador mais inteligente").

 


 

Sobre:

18 horas atrás, marcim1m disse:

Sobre a lógica só quero evitar que o jogo fique fácil demais o computador não precisa ganhar todas

Justamente. Creio que entendi o que você quer, mas precisamos que você dê a iniciativa de como quer que fique. Como citei:

 

22 horas atrás, Simon Viegas disse:

Sobre a lógica do "jogador computador", qual estratégia acha que ele [o computador] deveria tomar? pense no problema de um modo geral... tipo... você como humano, como faz para jogar?

 

Parte do desenvolvimento como programador está em justamente em desenvolver a lógica e a auto-capacidade de "se virar". Então, como você acha que o computador deveria jogar? veja: não estou me referindo a programar em Python, mas sim em como jogar mesmo... abstraia que precisa de um código.. apenas pense na lógica!!! imagine que você é o computador... o que você faria para jogar melhor? é isso que precisa no momento. Só após, tentar traduzir o que idealizou para Python. (lembrando que antes precisaria analisar o código atual para ver se está rodando legal...).

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
18 horas atrás, Simon Viegas disse:

Sobre:

 

Por um acaso eu tentei lá mesmo :), mas esta não foi a questão. Eu não programo em Python, mas vi que um dos pontos para o código funcionar é que o "texto" esteja indentado corretamente (o alinhamento do código faz parte da lógica). O teu código original veio desalinhado (todo alinhado a esquerda) na postagem original. Para o código ficar certo aqui no Fórum precisamos que poste novamente o código completo utilizando a tag CODE. Como citado:

 


RESUMINDO: Por favor, poste o código completo utilizando a tag CODE. Primeiro precisamos verificar se o teu código atual está funcionando ou não. Pois antes precisa corrigir o atual, para depois inserir a melhoria ("um computador mais inteligente").

 


 

Sobre:

Justamente. Creio que entendi o que você quer, mas precisamos que você dê a iniciativa de como quer que fique. Como citei:

 

 

Parte do desenvolvimento como programador está em justamente em desenvolver a lógica e a auto-capacidade de "se virar". Então, como você acha que o computador deveria jogar? veja: não estou me referindo a programar em Python, mas sim em como jogar mesmo... abstraia que precisa de um código.. apenas pense na lógica!!! imagine que você é o computador... o que você faria para jogar melhor? é isso que precisa no momento. Só após, tentar traduzir o que idealizou para Python. (lembrando que antes precisaria analisar o código atual para ver se está rodando legal...).

 

No aguardo.

import os
import random

tab =  [0, 1, 2,
        3, 4, 5,
        6, 7, 8]

Nome = input("Qual seu nome?")

def desenhar():
  os.system('clear') or None
  print('+-----------+')
  print('|',tab[0], "|", tab[1], "|", tab[2],'|')
  print('|','-'* 9,'|')
  print('|',tab[3], "|", tab[4], "|", tab[5],'|')
  print('|','-'* 9,'|')
  print('|',tab[6], "|", tab[7], "|", tab[8],'|')
  print('+-----------+')

def jogadaHumano():
  while True:
    jogada = input('Escolha sua jogada:')
    pos = int(jogada)


    if tab[pos] == 'X' or tab [pos] == 'O':
      print('Jogada invalida')
      continue

    tab[pos] = 'X'
    break
# A "AI" NÃO VAI GANHAR SEMPRE MAS TENTAR EVITAR ALGUNS MOVIMENTOS
def jogadaAI():
  op = []
  for i in range(0, 9):
    if tab[5] == 'X' or tab[5] == 'O':
      op = [8,1] # Coloca as opções disponíveis caso 5 esteja marcado
    elif tab[0] == 'X' or tab[0] == 'O':
      op = [1] # Coloca as opções disponíveis caso 0 esteja marcado
    elif tab [4] == 'X' or tab [4] == 'O':
      op = [0]
    elif tab[4] == 'X' or tab[4] == 'O':
      op = [6,8]
    elif tab[3] == 'X' or tab[3] == 'O':
      op = [1]
    elif tab[4] == 'X' or tab[4] == 'O':
      op = [8]
    elif tab[1] == 'X' or tab[1] == 'O':
      op = [7]
    elif tab[8] == 'X' or tab[8] == 'O':
      op = [2]
    elif tab[5] == 'X' or tab[5] == 'O':
      op = [7]
    elif tab[1] == 'X' or tab[1] == 'O':
      op = [0]
    elif tab[i] != 'X' and tab[i] != 'O':
      op.append(tab[i])
      
  jogada = random.choice(op)
  
  tab[jogada] = 'O'
  


#validção
def ganhou(turno):
  #valida a primeira linha
  if tab[0] == turno and tab[1] == turno and tab[2] == turno:
      return True
  elif tab[3]== turno and tab[4]== turno and tab[5]== turno:
      return True
  elif tab[6]== turno and tab[7]== turno and tab[8]== turno:
      return True
  #valida diagonal
  elif tab[0] == turno and tab[4] == turno and tab[8]== turno:
      return True
  elif tab[2] == turno and tab[4] == turno and tab[6] == turno:
      return True
  #valida coluna
  elif tab[0] == turno and tab[3] == turno and tab[6] == turno:
      return True
  elif tab[1] == turno and tab[4] == turno and tab[7] == turno:
      return True
  elif tab[2] == turno and tab[5] == turno and tab[8] == turno:
      return True

  return False


desenhar()

turno = 'X'
for i in range(0,9):
  if turno  == 'O':
    jogadaAI()
  else :
    jogadaHumano()
  desenhar()
  if ganhou(turno):
    print('Jogador ', turno,' ganhou o jogo!!')
    break
  if i == 8:
    print('Deu velha!!')
  turno = 'X' if turno == 'O' else 'O'

pensei em ela ter um jogada caso outro número seja jogado (como eu comecei no codigo) se o número 4 estiver marcado jogar em (0,2,6,8)
se o número 5 estiver marcado jogar em (0,2,4,6,8)
se os números (0,2,6,8) estiverem marcado jogar em (4)

assim +/-

Compartilhar este post


Link para o post
Compartilhar em outros sites

@marcim1m, a lógica para obter as opções de jogadas para o computador não está funcionando muito bem... E tem alguns problemas de lógica.

 

Vejamos o código:

 

6 horas atrás, marcim1m disse:

def jogadaAI():
  op = []
  for i in range(0, 9):
    if tab[5] == 'X' or tab[5] == 'O':
      op = [8,1]
    elif tab[0] == 'X' or tab[0] == 'O':
      op = [1]
    elif tab [4] == 'X' or tab [4] == 'O':
      op = [0]
    elif tab[4] == 'X' or tab[4] == 'O':
      op = [6,8]
    elif tab[3] == 'X' or tab[3] == 'O':
      op = [1]
    elif tab[4] == 'X' or tab[4] == 'O':
      op = [8]
    elif tab[1] == 'X' or tab[1] == 'O':
      op = [7]
    elif tab[8] == 'X' or tab[8] == 'O':
      op = [2]
    elif tab[5] == 'X' or tab[5] == 'O':
      op = [7]
    elif tab[1] == 'X' or tab[1] == 'O':
      op = [0]
    elif tab[i] != 'X' and tab[i] != 'O':
      op.append(tab[i])
      
  jogada = random.choice(op)
  
  tab[jogada] = 'O'

 

Perceba que você está colando para verificar várias vezes as mesmas posições, o que poderia até acontecer, pois os valores nas posições podem eventualmente ser alteradas... mas também está colocando condições repetidas, o que jamais poderia acontecer, pois as repetidas nunca serão verificadas.

 

Em fim... de uma maneia mais prática, preferi apenas verificar o resultado final pelo próprio código. Então, eu não tenho experiência em Python, mas baseado no teu código e dando uns Google par aos comandos, criei um mecanismo para tentar entender e ao mesmo tempo demonstrar o que está acontecendo com as variáveis neste código, vide:

import time
... 
    elif tab[i] != 'X' and tab[i] != 'O':
      op.append(tab[i])

  jogada = random.choice(op)  

  #debug
  print('Processamento do computador...')
  print('Jogadas disponíveis: ', end='', flush=True)
  for i in range(9):
    if tab[i] != 'X' and tab[i] != 'O':
      print(tab[i], end=' ', flush=True)
      time.sleep(0.5)
  print('\nJogadas pré-selecionadas (op):', op)
  time.sleep(2)
  print('Jogada selecionada (jogada)', jogada)
  time.sleep(2)
  input()
  #fim debug

  tab[jogada] = 'O'

#validção
def ganhou(turno):
...

Desta forma ele ficará mostrando quais as opções do "Computador" a cada rodada... assim ficou mais fácil para ver que está ocorrendo de dar opções inválidas, ou seja: disponibilizando opções que já foram utilizadas ou sempre repetindo as opções...

 

Outros pontos:

- Não precisa ler o nome por enquanto. Ele não está sendo utilizado e de qualquer forma pode ser inserido depois. Tire para facilitar os testes. Depois coloca novamente;

- Particularmente não acho interessante chamar de AI (ou IA), pois não se tratará de uma "Inteligência Artificial", mas apenas de "uma lógica" comum. Para mim soa estranho... poderia chamar de jogadaComputador().

 

 

 

Então, primeiro crie uma lógica mais simples possível e coloque para funcionar, só depois pare para criar uma lógica mais complexa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda_a_Ler_Resistores_e_Capacitores-capa-3d-newsletter.jpg

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!