Jeu en Python Tkinter morpion

Fermé
SiXAM - Modifié le 17 oct. 2022 à 14:44
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 14 oct. 2022 à 10:30

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.  

2 réponses

yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 Ambassadeur 1 557
11 oct. 2022 à 22:00

bonjour,

qu'as-tu essayé, as-tu une question?

1
SiXAM Messages postés 2 Date d'inscription mardi 11 octobre 2022 Statut Membre Dernière intervention 11 octobre 2022
11 oct. 2022 à 22:01

oui je n'arrive pas à faire jouer la machine toute seule

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > SiXAM Messages postés 2 Date d'inscription mardi 11 octobre 2022 Statut Membre Dernière intervention 11 octobre 2022
11 oct. 2022 à 22:16

J'imagine que le prof veut évaluer ta capacité à faire cet exercice.  Cette évaluation sera faussée si nous le faisons à ta place.

1
SiXAM Messages postés 2 Date d'inscription mardi 11 octobre 2022 Statut Membre Dernière intervention 11 octobre 2022
11 oct. 2022 à 22:09

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():
            humainJoue
0

de même pour moi je rencontre le même problème.

1
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168 > AJDKYYFKk
14 oct. 2022 à 10:30

Bonjour,

Regarde ma réponse du 12 octobre à 13h45 ci-dessous ...

1
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 12 oct. 2022 à 13:52

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

1