Jeu morpion

Résolu/Fermé
valentin - Modifié le 10 nov. 2021 à 18:10
 valentin - 11 nov. 2021 à 14:55
Bonjour,
j'aimerais codé un jeu de morpion qui se joue seul contre l'ordinateur mais il y a un passage que je n'arrive pas à optimisé. A un moment je veux décrire quel est l'ordre de priorité (jsp quel thermes utiliser pour l'appeler donc je vais l'appeler robot) de l'action qu'il va faire. Il commence par regarder si il a déjà deux case et la troisième est disponible, ce qui le fait gagner. Si il ne peut pas gagner à ce tours, il vérifie que sont adversaires ne gagnera pas à sont prochain tours si le robot de réagit pas. Et pour finir il suivra différant plans que j'aurais programmé. C'est dans les deux première priorité du robot que j'ai du mal.
je pourrais faire ça mais c long pas optimisé du tout et très brouillon
a1|a2|a3
__|___|____
b1|b2| b3
__|___|____
c1|c2 |c3
(c'est un reproduction du cadrillage du plateau de jeu pour vous montrer comment j'ai nommé chaque case)

voici à peu près ce que ça donnerait je pourrait un peu l'optimisé mais il serait quand même très mal optimisé :

caseDuJoueur = [ ] #contient toutes les cases du joueur, dans la suite du programme je vais juste écrire cdj pour allé plus vite

CaseDuRobot = [ ] #contient toutes les case du robot, je vais juste écrire cdr pour allé plus vite
CaseChoisi = [ ] #contient toutes les case qui sont déjà prises
dans sa suite du programme je vais juste dire cc pour aller plus vite

if a1 in cdr and a2 in cdr and a3 not in cc:
cdr.append(a3)
print("perdu")
if a1 in cdr and a3 in cdr and a2 not in cc:
cdr.append(a2)
print("perdu")
if a in cdr and a2 in cdr and a1 not in cc:
cdr.append(a1)
print("perdu")
if b1 in cdr and b3 in cdr and b2 not in cc:
cdr.append(b2)
print("perdu")
if b1 in cdr and b2 in cdr and b3 not in cc:
cdr.append(a3)
print("perdu")
etc...

je pense qu'il faut faire un truc avec des matrices mais jsp comment faire et je n'ai rien trouvé qui pourrait m'aider

après j'ai un autre problème d'optimisation pour celui ci vous n'avez pas besoins de mise en contexte ce qui j'ai fait va suffire à vous faire comprendre

if a == "a1":
a = a1
elif a == "a2":
a = a2
elif a == "a3":
a = a3
elif a == "b1":
a = b1
elif a == "b2":
a = b2
elif a == "b3":
a = b3
elif a == "c1":
a = c1
elif a == "c2":
a = c2
elif a == "c3":
a = c3

merci beaucoup pour votre aide
A voir également:

11 réponses

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
10 nov. 2021 à 20:18
Pour moi le terme matrice est impropre, car il désigne un outil mathématique et là c’est pas des maths

Par contre, en effet quelque chose qui a un « représentation » matricielle serait probablement plus pratique pour ton exercice.

Tu pourrais n’avoir qu’un objet qui contient les cases du robot et du joueur, et itérer dessus

Par exemple, une liste peut contenir pleins de type de données, y compris des listes.

Mais avec une seule liste tu peux arriver à un résultat similaire.
Si la liste contient 9 items (par exemple des V pour vides).
Les 3 premiers sont la première ligne
Les 3 suivants la 2eme ligne
Et les 3 derniers la dernière ligne.
1
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
Modifié le 11 nov. 2021 à 09:53
Avec 3 listes de 3 items, tu peux avoir une représentation "spatiale" de ton jeu.
Je vais prendre _ pour une case vide, X pour le joueur, et O pour le robot.

A un moment de la partie on peut arriver à
["X", "_", "X"]
et
["_", "_", "_"]
et
["0", "_", "0"]

Intuitivement, j'imagine
X_X
___
O_O

mais ça peut aussi représenter
X_O
___
X_O

ou encore
O_O
___
X_X

bref c'est toi qui voit.

Supposons
X_X
___
O_O
Pour savoir s'il y a une ligne gagnante, le robot, regarde chaque liste et dès qu'il en trouve une dans laquelle il y a 2 O et un _ alors il remplace le _ par O et gagne.

Maintenant supposons
X_O
___
X_O
Pour regarder en colonne, il faut prendre l'élément "n" de la liste 1, le "n" de la liste 2 et le "n" de la liste 3 et ensuite c'est pareil dès qu'une colonne contient 2 0 et un _ le robot gagne.



1
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
10 nov. 2021 à 18:17
Bonjour
En Python, l’indentation est primordiale, or par défaut le site ne la conserve pas.
Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
On pourra commencer à essayer de t’aider quand tu auras reposté correctement ton code.

0
d'accord, merci beaucoup, je fait ça et je reposte correctement mon code
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
je le reposte correctement

Bonjour,
j'aimerais codé un jeu de morpion qui se joue seul contre l'ordinateur mais il y a un passage que je n'arrive pas à optimisé. A un moment je veux décrire quel est l'ordre de priorité (jsp quel thermes utiliser pour l'appeler donc je vais l'appeler robot) de l'action qu'il va faire. Il commence par regarder si il a déjà deux case et la troisième est disponible, ce qui le fait gagner. Si il ne peut pas gagner à ce tours, il vérifie que sont adversaires ne gagnera pas à sont prochain tours si le robot de réagit pas. Et pour finir il suivra différant plans que j'aurais programmé. C'est dans les deux première priorité du robot que j'ai du mal.
je pourrais faire ça mais c long pas optimisé du tout et très brouillon
a1|a2|a3
__|___|____
b1|b2| b3
__|___|____
c1|c2 |c3
(c'est un reproduction du cadrillage du plateau de jeu pour vous montrer comment j'ai nommé chaque case)

voici à peu près ce que ça donnerait je pourrait un peu l'optimisé mais il serait quand même très mal optimisé :

cdj = [] #contient toutes les cases du joueur
cdr = [] #contient toutes les case du robot
cc = [] #contient toutes les case qui sont déjà prises 

if a1 in cdr and a2 in cdr and a3 not in cc:
cdr.append(a3)
print("perdu")
if a1 in cdr and a3 in cdr and a2 not in cc:
cdr.append(a2)
print("perdu")
if a in cdr and a2 in cdr and a1 not in cc:
cdr.append(a1)
print("perdu")
if b1 in cdr and b3 in cdr and b2 not in cc:
cdr.append(b2)
print("perdu")
if b1 in cdr and b2 in cdr and b3 not in cc:
cdr.append(a3)
print("perdu")

etc...

je pense qu'il faut faire un truc avec des matrices mais jsp comment faire et je n'ai rien trouvé qui pourrait m'aider

après j'ai un autre problème d'optimisation pour celui ci vous n'avez pas besoins de mise en contexte ce qui j'ai fait va suffire à vous faire comprendre

if a == "a1":
a = a1
elif a == "a2":
a = a2
elif a == "a3":
a = a3
elif a == "b1":
a = b1
elif a == "b2":
a = b2
elif a == "b3":
a = b3
elif a == "c1":
a = c1
elif a == "c2":
a = c2
elif a == "c3":
a = c3

Voilà, j'espère que maintenant vous pouvez voir les programmes correctement.
merci beaucoup pour votre aide
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
10 nov. 2021 à 18:55
Comme tu le vois, il n’y a toujours pas d’indentation.

Option 1, tu n’en as pas non plus dans ton code chez toi, et dans ce cas ton programme ne peut pas marcher du tout

Option 2, tu l’as copié collé depuis ton premier message, dans lequel y’a plus d’indentation donc….

Option 3….
0
Ha, maince, désolé, c'était l'option 2, je vais les réécrire à la main entre les deux balises.
voici le premier programme :
cdj = [] #contient toutes les cases du joueur
cdr = [] #contient toutes les case du robot
cc = [] #contient toutes les case qui sont déjà prises

if "a1" in cdr and "a2" in cdr and "a3" not in cc:
    cdr.append("a3")
    print("perdu")
if "a1" in cdr and "a3" in cdr and "a2" not in cc:
    cdr.append("a2")
    print("perdu")
if "a3" in cdr and "a2" in cdr and "a1" not in cc:
    cdr.append("a1")
    print("perdu")
if "b1" in cdr and "b3" in cdr and "b2" not in cc:
    cdr.append("b2")
    print("perdu")
if "b1" in cdr and "b2" in cdr and "b3" not in cc:
    cdr.append("a3")
    print("perdu")


et voici le deuxième
if a == "a1":
    a = a1
elif a == "a2":
    a = a2
elif a == "a3":
    a = a3
elif a == "b1":
    a = b1
elif a == "b2":
    a = b2
elif a == "b3":
    a = b3
elif a == "c1":
    a = c1
elif a == "c2":
    a = c2
elif a == "c3":
    a = c3
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
10 nov. 2021 à 19:27
Quand tu dis ne pas savoir faire avec les matrices, ce que tu ne sais pas c’est coder une « matrice » en python ou alors quel algorithme appliquer sur une matrice ?
0
ni l'un ni l'autre, c'est un ami à moi qui pour un programme un peu similaire m'avait conseillé de d'utiliser des matrice mais j'ai abandonné se projet car à l'époque je n'avais pas les compétences pour le finir proprement
0
merci beaucoup, mais après avoir fait les liste jsp comment on pourrait faire pour les "lier", pour que quand il y en a deux carreaux qui se suive appartenant au bot ou au joueur pour que le robot le prenne ?
0
merci beaucoup pour ton aide, je vais essayer de faire ça
0