Jeu en Python Tkinter morpion
Phil_1857 Messages postés 1956 Statut Membre -
Bonjour
Je suis en classe de NSI et le professeur nous demande de compléter le programme suivant. Il faut que je fasse la fonction machineJoue et verifiePlateau pour rendre la machine intelligente.
from tkinter import *
from tkinter.messagebox import showinfo
from random import randrange
coteCanevas = 600 # Côté du canevas en pixels
marge = 20 # Marge entre le bord du canevas et le plateau de jeu
areteCase = (coteCanevas - 2*marge)/3 # Arête de chaque case
etatJeu = [[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
nombreCoups = 0
humainCommence = True
humainJoue = True
partieFinie = False
def initJeu():
global nombreCoups
"""
Initialisation du jeu. Structures de données propres au jeu
"""
for i in range(3):
for j in range(3):
etatJeu[i][j] = 0
nombreCoups = 0
def nouvellePartie():
global humainCommence, humainJoue, partieFinie
print("nouvelle partie")
partieFinie = False
initJeu()
if randrange(2) == 1:
humainCommence = True
humainJoue = True
else:
humainCommence = False
humainJoue = False
can.delete("all")
dessinePlateau()
if not(humainJoue):
machineJoue()
return()
def about():
"""
Affiche la fenêtre "A propos"
"""
showinfo(
"A propos\n\n",
"*** Programme écrit par ***\n"
" Albert Einstein - Kilian Mbappe \n"
"1ère NSI - Lycée Louis Armand - Mulhouse \n"
)
return()
def reglesJeu():
"""
Affiche les règles du jeu dans une boîte d'information
"""
showinfo(
"Règles du jeu\n\n",
"Premièrement : \n"
"Deuxièmement : \n"
)
return()
def dessinePlateau():
"""
Dessin du plateau de jeu
"""
# Exemple avec un plateau de Tic Tac Toe
areteCase = (coteCanevas - 2*marge)/3
x = 0
y = 0
for i in range(4): # Tracé des lignes horizontales
can.create_line(marge, y + marge, coteCanevas - marge, y + marge, width=4, fill="black")
y += areteCase
x = 0
y = 0
for i in range(4): # Tracé des lignes verticales
can.create_line(x + marge, marge, x + marge, coteCanevas - marge, width=4, fill="black")
x += areteCase
def convertitClick(x,y):
i = int((y - marge)//areteCase)
j = int((x - marge)//areteCase)
return (i,j)
def dessineCroix(i,j):
delta = 15
x1 = j*areteCase + marge + delta
y1 = i*areteCase + marge + delta
x2 = x1 + areteCase - 2*delta
y2 = y1 + areteCase - 2*delta
can.create_line(x1,y1,x2,y2,width=5,fill='DeepSkyBlue2')
can.create_line(x2,y1,x1,y2,width=5,fill='DeepSkyBlue2')
def dessineCercle(i,j):
return
def machineJoue():
return
def verifiePlateau():
return
def clickSouris(event):
"""
Fonction appelée lors d'un click du bouton gauche
de la souris/trackpad
"""
global nombreCoups
print("Clic au point", (event.x, event.y))
if not(partieFinie):
(i,j) = convertitClick(event.x, event.y)
print(i,j)
if (i,j) != (-1,-1):
if etatJeu[i][j] == 0: # Case libre ???
if humainCommence:
dessineCroix(i,j)
etatJeu[i][j] = 1
else:
dessineCercle(i,j)
etatJeu[i][j] = -1
nombreCoups += 1
verifiePlateau()
if not(partieFinie):
humainJoue = False
machineJoue()
# Main
fen = Tk()
fen.title("Jeu de ...")
fen.config(bg = "bisque") # Couleur du fond de la fenêtre
fen.resizable(width=False, height=False) # Interdit le redimensionnement de la fenêtre
can = Canvas(fen, width=coteCanevas, height=coteCanevas, bg = "snow2")
can.pack(side=LEFT, padx=25, pady=25)
bouton0 = Button(fen, text="A propos", command = about)
bouton0.pack(side=TOP, padx=20, pady=50)
bouton1 = Button(fen, text="Règles du jeu", command = reglesJeu)
bouton1.pack(side=TOP, padx=20, pady=50)
bouton2 = Button(fen, text="Nouvelle partie", command = nouvellePartie)
bouton2.pack(side=TOP, padx=20, pady=50)
can.bind("<Button-1>", clickSouris) # Gestion des clicks
dessinePlateau()
# Gestionnaire d'évènements
fen.mainloop()
S'il vous plaît, aidez-moi je n'y arrive pas.
- Morpion tkinter
- Jeu de morpion google - Guide
- Tkinter focus() ✓ - Forum Python
- Probleme tkinter injustifier - Forum Python
- Pygame ou tkinter ? - Forum Python
- (Python) Morpion en poo, besoin d'aide svp ! ✓ - Forum Python
2 réponses
bonjour,
qu'as-tu essayé, as-tu une question?
Bonjour,
Bizarre verifiePlateau()
Pourquoi tirer au hasard humainCommence et humainJoue ?
A quoi ça sert tout ça ?
L'humain commence, il clique et dessine une croix comme tu le fais dans clickSouris()
En fin de clickSouris(), tu mets bien humainJoue à False et tu appelles bien machineJoue()
(par contre il faut y enlever dessineCercle, ce n'est pas ici que la machine joue)
Donc dans machineJoue(), il faut dessiner un cercle, non pas au hasard, mais dans une case
qui bloquera la croix que l'humain vient de faire, et mettre humainJoue à True
Et là, l'humain peut cliquer à nouveau
oui je n'arrive pas à faire jouer la machine toute seule
J'imagine que le prof veut évaluer ta capacité à faire cet exercice. Cette évaluation sera faussée si nous le faisons à ta place.
j'ai réussi à faire ça
def verifiePlateau(): global humainCommence,humainJoue if randrange(2) == 0: humainCommence = False humainJoue = False else: humainJoue = False if not machineJoue(): humainJouede même pour moi je rencontre le même problème.
Bonjour,
Regarde ma réponse du 12 octobre à 13h45 ci-dessous ...