Python morpion
alalperrin
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
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()
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
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
as-tu une question?
merci de poster ton code en utilisant ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
as-tu une question?
merci de poster ton code en utilisant ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
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
58 self.attribu.append([0]*3)
59
---> 60 self.arbre=arbre(self)
61
62
TypeError: __init__() takes 1 positional argument but 2 were given
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
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
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.
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.