Puissance 4 python tkinter
Résolu
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 :
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()
A voir également:
- Puissance 4 python corrigé
- +33 4 24 47 12 50 ✓ - Forum Mobile
- Test puissance pc - Guide
- Puissance en c++ - Forum C++
- Transmath 3eme corrigé pdf ✓ - Forum Études / Formation High-Tech
- Puissance en c ✓ - Forum C
1 réponse
Bonjour
Plusieurs conseils préalables
Passons à ta question
Moi j'aurais par exemple écrit :
Exemples :
Bonne chance
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 soitj = 1
, le problème revient à chercher la sous-liste[j, j, j, j]
dansl
. 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