Jeu en Python Tkinter morpion

SiXAM -  
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   -

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

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

1
SiXAM Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > SiXAM Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 

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   Statut Membre Dernière intervention  
 

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
AJDKYYFKk
 

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

1
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168 > AJDKYYFKk
 

Bonjour,

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

1
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

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