Python morpion

Bonjour,

pouvez vous m'aidez s'il vous plait, ils'agit de coder un python a l'aide d'un arbre avec la fonction minimax

import random

import matplotlib

class arbre():
def __init__(self):
self.val=None
self.fils=None

self.t=morpion.trouvercasesvide()
self.plateau=morpion.attribu
self.plateaufils={}

def construirearbre(self,plateau):
if self.hauteur==1:
if morpion.checkgagnant()=="ordi gagne":
self.val=1
elif morpion.checkgagnant()=="humain gagne":
self.val=-1
else:
self.val=0

else:

plateaufils=copy.deepcopy(self.plateau)
for i in morpion.trouvercasesvide(self.plateaufils):

if self.joueur==1:
self.plateaufils[i[0]][i[1]]=-1
self.fils[str(i[0])+","+str(i[1])]=self.construirearbre(self.plateaufils)
else:
self.plateaufils[i[0]][i[1]]=1
self.fils[str(i[0])+","+str(i[1])]=self.construirearbre(self.plateaufils)

def hauteur(self,morpion):
if morpion==None:
return 0

else:

return (1+max(self.hauteur(self.fils)))

class morpion():
def __init__(self):

self.attribu=[]
self.joueur=None
for i in range(3):
self.attribu.append([0]*3)

self.arbre=arbre(self)

def afficheplateau(self):
for i in range(3):
t=[]
for j in range(0,3):

if self.attribu[i][j]==1:
t.append("X")

elif self.attribu[i][j]==-1:
t.append("0")
else:
t.append(" ")

print(t)

def jouerhumain(self):

print("ou vous voulez jouer en ligne?")
i=int(input())
print("ou vous voulez jouer en colone?")
j=int(input())
if self.attribu[i][j]!=0:
print("cette n'es pas vide")
return self.jouerhumain()
self.attribu[i][j]=1

def trouvercasesvide(self,plateau):
t=[]
for i in range(3):
for j in range(0,3):
if self.plateau[i][j]==0:
t.append([i,j])

return t

def joueuraleatoire(self):
l=self.trouvercasesvide()
i=random.randint(0,len(l)-1)
b=l[i]
self.attribu[b[0]][b[1]]=-1

def jouerordi(self):

a=self.bestindice()
ligne=a[0]
colonne=a[1]
self.attribu[ligne][colonne]=-1

def simujeu(self,i):
a=i[0]
b=i[1]
self.plateau[a][b]=-1

def annulercoup(self,i):
a=i[0]
b=i[1]
self.plateau[a][b]=0

def bestindice(self):

indicemaxi=[]
maxi=None
for i in self.trouvercasesvide(self.plateau):
self.simujeu(i)
tmp=self.mini(n) #fonction minimum
if tmp>maxi:
maxi=tmp
indicemaxi.append(i)

self.annulercoup(i)

def mini(self,n,plateau):
if self.gameover==True or self.arbre.hauteur(n)==1:
return self.evalue()
else:
return min(self.rejouer(i,maxi)for i in self.trouvercasesvide(self.plateaufils))

def maxi(self,n,plateau):
if self.gameover==True or self.arbre.hauteur(n)==1:
return self.evalue()
else:
return maxi(self.rejouer(i,mini)for i in self.trouvercasesvide(self.plateaufils))

def evalue(self):
if self.checkgagnant()=="ordi gagne":
return 1
elif self.checkgagnant()=="humain gagne":
return -1
else:
return 0

def rejouer(self,i, f,plateau):
self.simujeu(i)
valeur = self.f(n-1,plateau)
self.annulercoup(i)
return valeur

def checkgagnant(self) :

for i in range(3):
if self.attribu[i][0]==self.attribu[i][1]==self.attribu[i][2]==1:
return ("humain gagne")
elif self.attribu[i][0]==self.attribu[i][1]==self.attribu[i][2]==-1 :
return("ordi gagne")
elif self.attribu[0][0]==self.attribu[1][1]==self.attribu[2][2]==1:

return("humain gagne")

elif self.attribu[0][2]==self.attribu[1][1]==self.attribu[2][0]==-1:
return("ordi gagne")
elif self.attribu[0][2]==self.attribu[1][1]==self.attribu[2][0]==1:
return("humain gagne")

elif self.attribu[0][0]==self.attribu[1][1]==self.attribu[2][2]== -1:
return("ordi gagne")
elif self.attribu[0][i]==self.attribu[1][i]==self.attribu[2][i]==1:
return("humain gagne")

elif self.attribu[0][i]==self.attribu[1][i]==self.attribu[2][i]==-1:
return("ordi gagne")
else:
l= self.trouvercasesvide()
n=len(l)
if n==0:
return"partie nulle"

def nulle(self):

if self.checkgagnant()=="partie nulle":
return True

else:
return False

def gameover(self):
if self.nulle()==True:
return True
elif self.checkgagnant()=="humain gagne" or self.checkgagnant ()=="ordi gagne":
return True
else:
return False

def quijoueur(self):
ordi=1
humain=0
a=random.randint(0,1)
return a

def jouer(self):
if self.quijoueur==1:
print("l'ordi commence")
while self.gameover()!= True:
self.joueur=1
self.jouerordi()
self.afficheplateau()
if self.gameover()!= True:
self.joueur=0
self.jouerhumain()
self.afficheplateau()

else:
print("humain comence")
while self.gameover()!= True:
print("a toi")
self.joueur=0
self.jouerhumain()
self.afficheplateau()
if self.gameover()!= True:
self.joueur=1
self.jouerordi()
self.afficheplateau()

res=morpion()
n=9
res.jouer()

Configuration: Windows / Chrome 100.0.4896.88

4 réponses

  1. j'ai effectivement oublié de préciser la question, lorsque je veux faire tourner mon code il m'affiche l'erreur suivante:

    58 self.attribu.append([0]*3)
    59
    ---> 60 self.arbre=arbre(self)
    61
    62

    TypeError: __init__() takes 1 positional argument but 2 were given
    1. Contributeur
      peux-tu utiliser les balises de code quand tu postes du code?

      peut-être:
      self.arbre=arbre()
  2. bonjour,

    Merci pour votre réponse,

    Cela ne marche pas non plus, j'ai essayer toutes les combinaisons en vain, a présent il m'affiche:

    11
    12
    ---> 13 self.plateau=morpion.attribu
    14 self.plateaufils={}
    15

    AttributeError: type object 'morpion' has no attribute 'attribu

    je n'ai pas bien compris les balises de code, désolée
    1. Contributeur
      Relis la réponse au #1 à propos des balises de code.

      Ma suggestion, c'était pour éliminer une erreur, il te reste à éliminer toutes les autres.

      Tu as peu de chance d'arriver à un résultat correct en essayant toutes les combinaisons.
      Je pense qu'il est préférable de te former, et de commencer par des exercices plus simples.
  3. bonjour,

    cela est pour un projet en classe je suis donc obliger de passer par la.
    Merci
    1. Contributeur
      Passer par là, et comment y arriver?
      Cela me semble difficile d'y arriver sans te former ni faire d'abord des exercices plus simples.
      Tu ne vas pas progresser en faisant faire le travail par d'autres.