A voir également:
- Problème valeur avec TkInter
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Valeur ascii - Guide
- Liste de valeur excel - Guide
- #Valeur excel somme - Guide
- Excel renvoyer la valeur d'une cellule en fonction d'une autre - Forum Logiciels
3 réponses
yg_be
Messages postés
23260
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 octobre 2024
Ambassadeur
1 541
6 févr. 2020 à 10:18
6 févr. 2020 à 10:18
bonjour, peux-tu expliquer ce qu'est "un problème de valeur"?
Bonjour,
Que c'est laborieux.
Pourquoi ne pas avoir utiliser un tableau plutôt que x listes ?
Un tableau aurait permis de te passer de toutes ces conditions des line*.
Le else ne sert à rien, puis ce n'est pas une très bonne pratique de faire cela (NameError).
Quel est le but de rajouter 3 colonnes non exploitables dans ces lignes ?
Cela représente quoi des "colonnes système" ?
Que c'est laborieux.
Pourquoi ne pas avoir utiliser un tableau plutôt que x listes ?
Un tableau aurait permis de te passer de toutes ces conditions des line*.
try: player=r except NameError: player=p else: player=r
Le else ne sert à rien, puis ce n'est pas une très bonne pratique de faire cela (NameError).
#tableau de jeu (+3 colonne systeme a droite)
Quel est le but de rajouter 3 colonnes non exploitables dans ces lignes ?
Cela représente quoi des "colonnes système" ?
Alors , je n'ai pas utilisé de tableau car je ne sais pas encore m'en servir ^^ (je suis novice).
Je sais que le except n'est pas joli mais c'est simplement que c'était mon dernier test avant que j'arrête de trifouiller.
Et les colonnes système sont utilisés lorsque je vérifie si un coup est gagnant, avec le checktbl qui, si ces trois colonnes ne sont pas présentes, me met une erreur de index out of range, et c'est la seule solution à laquelle j'ai pensé.
Je sais que ce n'est pas agréable d'essayer de comprendre un programme pas très beau, c'est sympa de me donner un peu de ton temps :)
Je sais que le except n'est pas joli mais c'est simplement que c'était mon dernier test avant que j'arrête de trifouiller.
Et les colonnes système sont utilisés lorsque je vérifie si un coup est gagnant, avec le checktbl qui, si ces trois colonnes ne sont pas présentes, me met une erreur de index out of range, et c'est la seule solution à laquelle j'ai pensé.
Je sais que ce n'est pas agréable d'essayer de comprendre un programme pas très beau, c'est sympa de me donner un peu de ton temps :)
Un tableau en python, c'est une liste de listes, si tu sais manipuler les listes alors tu n'auras aucun mal à manipuler un tableau.
Ok, tu as ajouté des colonnes pour palier aux IndexError, ce serait mieux de trouver et comprendre pourquoi ça plante ^^
Le problème n'a pas vraiment à voir si c'est agréable à lire ou non, mais qu'il va être difficile à partir de ton 1er code de garder quelque chose pour programmer ton jeu avec tkinter.
Ok, tu as ajouté des colonnes pour palier aux IndexError, ce serait mieux de trouver et comprendre pourquoi ça plante ^^
Le problème n'a pas vraiment à voir si c'est agréable à lire ou non, mais qu'il va être difficile à partir de ton 1er code de garder quelque chose pour programmer ton jeu avec tkinter.
La trame à suivre est d'utiliser des fonctions et dans la programmation séquentielle séparer logique du code du reste.
Dans la logique du code, il y aurait par exemple une fonction déterminant si un alignement existe, une fonction insérant un pion dans telle colonne.
Dans le reste, il y aurait une fonction affichant la grille, une fonction demandant dans quelle colonne le joueur veut jouer son pion en gérant les erreurs.
Je peux te montrer un simple code partant de cela tenant en une 100aine de lignes, mais comme c'est pas commenté et que j'ai la flemme de le faire, pas certain que tu le comprennes.
Dans la logique du code, il y aurait par exemple une fonction déterminant si un alignement existe, une fonction insérant un pion dans telle colonne.
Dans le reste, il y aurait une fonction affichant la grille, une fonction demandant dans quelle colonne le joueur veut jouer son pion en gérant les erreurs.
Je peux te montrer un simple code partant de cela tenant en une 100aine de lignes, mais comme c'est pas commenté et que j'ai la flemme de le faire, pas certain que tu le comprennes.
J'ai retravaillé le code et je suis arrivé à ca (le code fonctionne), si vous avez des idées pour le rendre plus "propre", je prends.
from tkinter import * ########## Initialise des listes ########## j=[] entree=[0] coup=[] memoire=[] ########## Crée la grille de jeu ########## def grille(): ligne0=[0,0,0,0,0,0,0,0,0,0] ligne1=[0,0,0,0,0,0,0,0,0,0] ligne2=[0,0,0,0,0,0,0,0,0,0] ligne3=[0,0,0,0,0,0,0,0,0,0] ligne4=[0,0,0,0,0,0,0,0,0,0] ligne5=[0,0,0,0,0,0,0,0,0,0] vide= [0,0,0,0,0,0,0,0,0,0] tableau=[ligne0,ligne1,ligne2,ligne3,ligne4,ligne5,vide,vide,vide] return tableau ########## Détermine le joueur ########## def joueur(): if len(j)%2==1: return 1 elif j==[]: return 1 else: return 2 ########## Place dans le tableau le pion (mémoire et affichage) ########## def placement(colonne,joueur): col=colonne-1 for o in range(5,-1,-1): if tableau[o][col]==0: if joueur==1: tableau[o][col]=3 Label(window,image=pionjaune,bg="blue").grid(row=o,column=colonne-1,sticky=W) Label (window, text=" Joueur 2 ",bg="black",fg="white",font="none 16 underline").grid(row=2,column=7,sticky=N) coup.append(o) coup.append(col) if o==0: Label (window, text=" X ",bg="black",fg="red",font="none 16 bold").grid(row=6,column=col,sticky=N) entree.append(0) break elif joueur==2: tableau[o][col]=5 Label(window,image=pionrouge,bg="blue").grid(row=o,column=colonne-1,sticky=W) Label (window, text=" Joueur 1 ",bg="black",fg="white",font="none 16 underline").grid(row=2,column=7,sticky=N) coup.append(o) coup.append(col) if o==0: Label (window, text=" X ",bg="black",fg="red",font="none 16 bold").grid(row=6,column=col,sticky=N) entree.append(0) break ########## Modification sur la fenêtre quand la partie se termine ########## def partifini(): Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=0,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=1,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=2,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=3,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=4,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=5,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=6,column=6,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=7,column=3,sticky=N) Label (window, text=" ",bg="black",font="none 16 bold").grid(row=3,column=7,sticky=N) Label (window, text="Le joueur {} gagne!".format(joueur()),bg="black",fg="green",font="none 16 bold").grid(row=2,column=7,sticky=N) ########## Vérifie si un coup est gagnant (étape 2) ########## def verification2(memoire): if (memoire[0])+(memoire[1])+(memoire[2])+(memoire[3])==12: partifini() elif (memoire[1])+(memoire[2])+(memoire[3])+(memoire[4])==12: partifini() elif (memoire[2])+(memoire[3])+(memoire[4])+(memoire[5])==12: partifini() elif (memoire[3])+(memoire[4])+(memoire[5])+(memoire[6])==12: partifini() elif (memoire[0])+(memoire[1])+(memoire[2])+(memoire[3])==20: partifini() elif (memoire[1])+(memoire[2])+(memoire[3])+(memoire[4])==20: partifini() elif (memoire[2])+(memoire[3])+(memoire[4])+(memoire[5])==20: partifini() elif (memoire[3])+(memoire[4])+(memoire[5])+(memoire[6])==20: partifini() ########## Vérifie si un coup est gagnant (étape 1) ########## def verification(y,x): memoire=[tableau[y][x-3],tableau[y][x-2],tableau[y][x-1],tableau[y][x],tableau[y][x+1],tableau[y][x+2],tableau[y][x+3]] verification2(memoire) memoire=[tableau[y+3][x],tableau[y+2][x],tableau[y+1][x],tableau[y][x],tableau[y-1][x],tableau[y-2][x],tableau[y-3][x]] verification2(memoire) memoire=[tableau[y+3][x-3],tableau[y+2][x-2],tableau[y+1][x-1],tableau[y][x],tableau[y-1][x+1],tableau[y-2][x+2],tableau[y-3][x+3]] verification2(memoire) memoire=[tableau[y+3][x+3],tableau[y+2][x+2],tableau[y+1][x+1],tableau[y][x],tableau[y-1][x-1],tableau[y-2][x-2],tableau[y-3][x-3]] verification2(memoire) ########## Fil conducteur ########## def deroulement(): choix=entree[-1] if choix>=1 and choix<=7: j.append(0) placement(choix,joueur()) verification(coup[-2],coup[-1]) entree.append(0) Label (window, text=" ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) else: Label (window, text="Colonne invalide",bg="black",fg="red",font="none 12 bold").grid(row=3,column=7,sticky=N) ########## Fonctions différents boutons ########## def click0(): entree.append(1) Label (window, text=" Colonne 1 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def click1(): entree.append(2) Label (window, text=" Colonne 2 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def click2(): entree.append(3) Label (window, text=" Colonne 3 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def click3(): entree.append(4) Label (window, text=" Colonne 4 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def click4(): entree.append(5) Label (window, text=" Colonne 5 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def click5(): entree.append(6) Label (window, text=" Colonne 6 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def click6(): entree.append(7) Label (window, text=" Colonne 7 ",bg="black",fg="white",font="none 12 bold").grid(row=3,column=7,sticky=N) def quitter(): window.destroy() print("Partie finie") quit() ########## Création fenêtre de jeu ########## tableau=grille() window=Tk() pasdepion=PhotoImage(file="F:\puissance 4 data\pasdepion.gif") pionjaune=PhotoImage(file="F:\puissance 4 data\pionjaune.gif") pionrouge=PhotoImage(file="F:\puissance 4 data\pionrouge.gif") for z in range (0,7): for f in range(0,6): Label(window,image=pasdepion,bg="blue").grid(row=f,column=z,sticky=W) window.title("Puissance 4") window.configure(background="black") Label (window, text=" Joueur {} ".format(joueur()),bg="black",fg="white",font="none 16 underline").grid(row=2,column=7,sticky=N) Button(window, text=" 1 ",width=3,command=click0).grid(row=6,column=0,sticky=N) Button(window, text=" 2 ",width=3,command=click1).grid(row=6,column=1,sticky=N) Button(window, text=" 3 ",width=3,command=click2).grid(row=6,column=2,sticky=N) Button(window, text=" 4 ",width=3,command=click3).grid(row=6,column=3,sticky=N) Button(window, text=" 5 ",width=3,command=click4).grid(row=6,column=4,sticky=N) Button(window, text=" 6 ",width=3,command=click5).grid(row=6,column=5,sticky=N) Button(window, text=" 7 ",width=3,command=click6).grid(row=6,column=6,sticky=N) Button(window, text="Valider",width=5,command=deroulement).grid(row=7,column=3,sticky=S) Button(window, text="Quitter",width=7,command=quitter).grid(row=7,column=7,sticky=SE) print("Partie lancee") window.mainloop()
- Il faut bien sur rajouter une images de pions rouge, jaune et pas de pion chez vous, car je ne peux pas attacher les miennes en pièces jointes.
Bonjour,
Beaucoup de choses à revoir, la première étant d'absolument régler ce problème d'IndexError si on définit la dimension de la grille à ce qu'elle devrait être, une liste de 6 listes de 7 zéros.
Il est nécessaire de centraliser les clics sur une seule fonction, pour cela on utilise une fermeture (closure en anglais), le principe est de retourner la référence d'une fonction.
Supprime toutes tes fonctions click* et déclare une fonction click.
Puis au lieu de créer tes boutons de colonnes un à un
Fais cela dans une boucle en passant un appel à la fonction click avec le n° de colonne en paramètre.
Revois aussi cette nouvelle fonction _click, chaque fois tu crées un nouveau label, alors que tu devrais définir le label pour l'affichage de la colonne choisie hors de cette fonction, et dans la fonction _click simplement changer le text de ce label avec la méthode configure.
Beaucoup de choses à revoir, la première étant d'absolument régler ce problème d'IndexError si on définit la dimension de la grille à ce qu'elle devrait être, une liste de 6 listes de 7 zéros.
def grille(): return [[0] * 7 for _ in range(6)]
Il est nécessaire de centraliser les clics sur une seule fonction, pour cela on utilise une fermeture (closure en anglais), le principe est de retourner la référence d'une fonction.
Supprime toutes tes fonctions click* et déclare une fonction click.
def click(col): def _click(): entree.append(col) text = " Colonne {} ".format(col) lbl = Label(window, text=text, bg="black", fg="white", font="none 12 bold") lbl.grid(row=3,column=7,sticky=N) return _click
Puis au lieu de créer tes boutons de colonnes un à un
Button(window, text=" 1 ",width=3,command=click0).grid(row=6,column=0,sticky=N) Button(window, text=" 2 ",width=3,command=click1).grid(row=6,column=1,sticky=N) Button(window, text=" 3 ",width=3,command=click2).grid(row=6,column=2,sticky=N) Button(window, text=" 4 ",width=3,command=click3).grid(row=6,column=3,sticky=N) Button(window, text=" 5 ",width=3,command=click4).grid(row=6,column=4,sticky=N) Button(window, text=" 6 ",width=3,command=click5).grid(row=6,column=5,sticky=N) Button(window, text=" 7 ",width=3,command=click6).grid(row=6,column=6,sticky=N)
Fais cela dans une boucle en passant un appel à la fonction click avec le n° de colonne en paramètre.
for i in range(7): text = " {} ".format(i + 1) bt = Button(window, text=text, width=3, command=click(i + 1)) bt.grid(row=6, column=i, sticky=N)
Revois aussi cette nouvelle fonction _click, chaque fois tu crées un nouveau label, alors que tu devrais définir le label pour l'affichage de la colonne choisie hors de cette fonction, et dans la fonction _click simplement changer le text de ce label avec la méthode configure.
Bonjour, le problème c'est que ma fonction qui regarde si un coup joué est gagnant va vérifier les valeurs situé en x-1 , x-2 et x-3 ( pareil pour y, sur x abscisse et y ordonné de la grille) si la colonne sélectionné est 0, x-3 donne indice de recherche[ -3] et il va donc vérifier la 3 eme valeur en partant de la fin de la liste, ce qui ne crée pas d'indexerror mais juste une incohérence de vérification (la partie pourrais alors se terminer avec 2 pions alignés avec 2 autres pions de l'autre côté de la grille tel que: x-x-0-0-0-x-x les x etants les pions).La manière de régler ce problème d'index négatif est de rajouter en index de mes listes des valeurs tampons en [-1], [-2] et [-3] (aussi référencés par [7], [8] et [9]). J'ai cherché en refaisant le programme à résoudre ce problème d'une autre manière mais après quelques heures, j'ai repris le principe de mon ancien programme pour la grille.
Pour les autres points cités, je vais me documenter sur le sujet et réécrire les parties à modifier.
Pour les autres points cités, je vais me documenter sur le sujet et réécrire les parties à modifier.
Bonjour,
Et qu'est-ce qui t'empêche de mettre des points d'arrêts si tu n'es plus entre les index 0 et 6 ?
On commence par faire un test sur une simple liste.
Le dernier coup joué est à l'index 5
Comment vérifier que quatre 1 sont alignés ?
On commence par définir les extrémités de la liste jusqu'où regarder
Puis on comptabilise le nombre de valeur_pion dans les 2 directions
Si tu arrives à comprendre ça, il te restera à faire la même chose pour les alignements verticaux et diagonaux.
Et qu'est-ce qui t'empêche de mettre des points d'arrêts si tu n'es plus entre les index 0 et 6 ?
On commence par faire un test sur une simple liste.
l = [1, 0, 0, 0, 1, 1, 1]
Le dernier coup joué est à l'index 5
colonne = 5 valeur_pion = l[colonne]
Comment vérifier que quatre 1 sont alignés ?
On commence par définir les extrémités de la liste jusqu'où regarder
index_min = colonne - 3 if index_min < -1: # -1 et non 0 car le range n'inclus pas la dernière valeur index_min = -1 index_max = colonne + 3 if index_max > 7: # 7 et non 6 car le range n'inclus pas la dernière valeur index_max = 7
Puis on comptabilise le nombre de valeur_pion dans les 2 directions
nombre_alignes = 1 # pion de départ # Vers la gauche for i in range(colonne - 1, index_min, -1): if l[i] != valeur_pion: # Valeur différente du pion, inutile de continuer break nombre_alignes += 1 # Vers la droite for i in range(colonne + 1, index_max): if l[i] != valeur_pion: break nombre_alignes += 1 print(nombre_alignes)
Si tu arrives à comprendre ça, il te restera à faire la même chose pour les alignements verticaux et diagonaux.
6 févr. 2020 à 10:27
Quand la valeur "p" est actualisée dans la fonction pour passer au joueur 2(p=2), à la prochaine exécution de click(), la valeur p reste 1. Je suppose que l'erreur viens du mainloop(). J'ai tenté beaucoup de choses pour régler le problème mais avec mes connaissances je trouve pas.
Je ferai un détail plus précis du problème ce soir quand je serai chez moi.
6 févr. 2020 à 10:55