Python morpion

Fermé
alalperrin - 15 avril 2022 à 19:29
yg_be Messages postés 23315 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 - 16 avril 2022 à 12:00
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

yg_be Messages postés 23315 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 Ambassadeur 1 552
15 avril 2022 à 21:09
bonjour,
as-tu une question?
merci de poster ton code en utilisant ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
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
0
yg_be Messages postés 23315 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552
16 avril 2022 à 09:40
peux-tu utiliser les balises de code quand tu postes du code?

peut-être:
self.arbre=arbre()
0
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
0
yg_be Messages postés 23315 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552
16 avril 2022 à 11:23
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.
1
bonjour,

cela est pour un projet en classe je suis donc obliger de passer par la.
Merci
0
yg_be Messages postés 23315 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552
16 avril 2022 à 12:00
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.
0