Puissance 4 python tkinter

Résolu/Fermé
SchweppesTheBest Messages postés 3 Date d'inscription mercredi 5 février 2020 Statut Membre Dernière intervention 5 février 2020 - Modifié le 7 févr. 2020 à 09:09
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 7 févr. 2020 à 09:27
Bonjour à tous !

J'ouvre ce topic car j'ai besoin d'un peu d'aide sur mon programme... Alors voila, je suis en classe de 1ère spécialité NSI et nous devons faire un programme (censé) ressembler au puissance 4 que l'on connait tous avec une grille de 6 rangées et 7 colonnes.

Mon problème est le suivant : Comment détecter que l'un des joueurs a gagné ?

On a vu en cours qu'il faut faire un mini tableau à double entrée au debut du programme avec des chiffres (0 quand il n'y a pas de jetons , 1 quand c'est jaune et 2 quand c'est rouge par exemple) .Le programme aligne bien les jetons mais ce n'est pas très intéressant un puissance 4 sans gagnants!

Merci à ceux qui répondront .

Voici mon programme :

from tkinter import *
import random

fen=Tk()
fen.title("échafaudage")
fen.geometry("1300x1300")

JEU = [[0,0,0,0,0,0,0,8], #Tableau a double entrée , le 8 est utilisé comme bordure
[0,0,0,0,0,0,0,8],
[0,0,0,0,0,0,0,8],
[0,0,0,0,0,0,0,8],
[0,0,0,0,0,0,0,8],
[0,0,0,0,0,0,0,8]] #Initialisation de la grille


def trace_ligne_ver(x):
    x1=x
    y1=100
    x2=x
    y2=700
    Zone.create_line(x1,y1,x2,y2,width=1,fill="black")

def trace_ligne_hor(x):
    x1=100
    y1=x
    x2=800
    y2=x
    Zone.create_line(x1,y1,x2,y2,width=1,fill="black")

Zone=Canvas(fen,width=1000,height=900,bg="white")
Zone.place(x=0,y=0)
x=0

while x!=900:
    trace_ligne_ver(x)
    x=x+100

x=0
while x!=800:
    trace_ligne_hor(x)
    x=x+100

Joueur=random.randint(1,2)
total=0
def Attendre_clic(event):
    global JEU
    global Joueur
    Nbre_jetons=0
    global total
    xClic,yClic = event.x,event.y
    if 100<xClic<800: #Vérifier que le clic est dans le tableau
        colonne=Recherche_colonne(xClic)
        ligne=Recherche_ligne(colonne)


        if Joueur==1: #tour joueur rouge
            Zone.create_oval(colonne*100-20+150,ligne*100+170,colonne*100+20+150,ligne*100+130, fill='red') #Placement du jeton au milieu de la case
            Joueur=2
            print("C'est au tour du joueur 2")
            JEU[ligne][colonne]=1      #Définir que cette case est rouge dans le tableau
            total=total+1


        elif Joueur==2: #Tour du joueur jaune
            Zone.create_oval(colonne*100-20+150,ligne*100+170,colonne*100+20+150,ligne*100+130, fill='yellow')
            Joueur=1
            print("C'est au tour du joueur 1")
            JEU[ligne][colonne]=2
            total=total+1



    if total==42: #Vérification de tout les jetons placés pour l'égalité
        print("égalité")
fen.bind("<Button-1>", Attendre_clic)

def Recherche_colonne(xClic):
    colonne=(xClic)//100-1 #Définir dans quelle colonne est le clic
    return colonne

def Recherche_ligne(colonne):
    ligne1=5
    for loop in range (6):        #Vérifier si des jetons sont déjà présent dans la colonne pour choisir la ligne
        if JEU[ligne1][colonne]==0:
            ligne=ligne1
        else:
            ligne1=ligne1-1
    return ligne



chaine = Label(fen)
chaine.pack()
fen.mainloop()

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
7 févr. 2020 à 09:27
Bonjour

Plusieurs conseils préalables
  • Concernant le message, soigne l'orthographe et utilise les balises de code (4e bouton) afin de le mettre en forme
  • N'utilise pas de variable globale. C'est une très mauvaise habitude de programmation. Passe simplement tes variables globales actuelles comme des paramètres de fonction
  • Suis les conventions PEP8 (autant prendre les bonnes habitudes) pour avoir un programme propre. Si tu utilises pycharm il te guidera.
  • Pas réellement besoin d'avoir une interface Tk pour expliquer ton problème (tu aurais pu faire un puissance 4 en mode texte). Généralement il est bon de séparer le moteur du jeu (qui stocke le placement des pions, les règles...) du rendu (en mode texte, en mode graphique).


Passons à ta question
  • La manière dont tu installes un pion sur le plateau est améliorable / incomplète. Un while serait plus approprié. À colonne donnée, tant que la case est occupée, on monte d'un cran. Si la case ne dépasse pas le haut du plateau, alors on peut installer le pion dans cette case. Sinon, on refuse le placement du jeton.
  • La recherche de victoire consiste à chercher une ligne / colonne / diagonale peut se faire de plusieurs façon. Déjà il n'est utile de faire cette recherche que pour le joueur courant. La manière la plus simple de procéder en python est d'utiliser l'inclusion. Il suffit d'appliquer le raisonnement suivant. Pour chaque ligne (resp. colonne, resp. diagonale), tu extraies la liste
    l
    de cases correspondantes. Cela te donne une liste d'entiers. En admettant que le joueur courant soit
    j = 1
    , le problème revient à chercher la sous-liste
    [j, j, j, j]
    dans
    l
    . Pour cela tu peux chercher comment faire sur internet (par exemple cette page) ou écrire toi-même une petite boucle.


Moi j'aurais par exemple écrit :

def find_sublist(sl, l):
     n = len(sl)
     for i in range(len(l)):
         if sl == l[i:i+n]:
             return True
     return False


Exemples :

In [3]: find_sublist([1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 0, 0])
Out[3]: True

In [4]: find_sublist([1, 1, 1, 1], [0, 0, 1, 1, 0, 1, 0, 0])
Out[4]: False


Bonne chance
5