Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Mes questions en Python.
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Mes questions en Python.

Posté le 14/02/2016 18:23

Bonjours, je voudrai savoir si il est possible de faire ça :
nb_poisson [blue]=[/blue] [red]10[/red]
    [blue]for[/blue] i [blue]in[/blue] nb_poisson [blue]:[/blue]
    poisson[blue]+[/blue]str[blue]([/blue]i[blue])[/blue] [blue]=[/blue] [red]25[/red]



Précédente 1, 2, 3 ··· 7, 8, 9, 10, 11 Suivante
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 03/04/2016 13:54 | #


Un timer va te permettre d'appeler régulièrement une fonction. Par exemple une fois par seconde, tu vas appeler la fonction time() pour mettre à jour ton plateau.

Faut bien imaginer que si tu le laissais tourner sans le réguler temporellement ça pourrait passer des centaines de génération en une seconde.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 03/04/2016 14:15 | #


self.generation = tkinter.IntVar()
        self.generation.set(0)

        self.generation_label = tkinter.Label(self.fenetre, textvariable="Génération :\n > {}".format(self.generation.get()), width=10, height =2, justify="left", fg="red")
        self.generation_label.grid(row =18, column =1, padx =2, pady =2)
Le texte de mon la label ne s'affiche que si je remplace textvariable par text. Pourquoi ?

Ajouté le 03/04/2016 à 14:49 :
Je ne vois vraiment pas comment faire pour gérer le fait que je doit avoir :
Une commande : si elle est enclenché :
- alors je lance la fonction time()
- puis je met le programme en pause pendant une durée déterminée (1 seconde)
- je reviens dans la boucle d’événement pour que l'interface s'actualise
- si la commande est toujours enclenché : je recommence
sinon, j'attends un nouvel événement.
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 03/04/2016 15:33 | #


Gab.c a écrit :
- puis je met le programme en pause pendant une durée déterminée (1 seconde)

Non. Ça va se passer comme ça :

→ Le programme est tranquillement dans la boucle d'évènements... soudain le timer arrive à expiration.
→ Ta commande se lance et se termine.
→ Le programme revient tout seul dans la double d'évènements, en attente de quelque chose d'autre.

Donc la commande que tu dois affecter au timer, c'est juste time. Rien de plus.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 03/04/2016 17:54 | #


Je suis désolé mais là je suis perdu

Ajouté le 03/04/2016 à 18:40 :
self.generation = tkinter.IntVar()
        self.generation.set(0)

        self.generation_label = tkinter.Label(self.fenetre, textvariable="Génération :\n > {}".format(self.generation.get()), width=10, height =2, justify="left", fg="red")
        self.generation_label.grid(row =18, column =1, padx =2, pady =2)

Le texte de mon label ne s'affiche que si je remplace textvariable par text. Pourquoi ?

Résolu
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 03/04/2016 18:47 | #


En fait le timer va casser la boucle principale le temps que ta commande s'exécute et y revenir ensuite comme un grand.

Donc la commande c'est juste la fonction qui fait avancer le plateau d'une génération, c'est tout. Le reste c'est pas à toi de le gérer.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 03/04/2016 18:58 | #


Je suis désolé de t'en demander tant mais ça te dérangerai pas de me donner une vue d'ensemble de ce que je dois faire (avec la case à cocher et tout le tralala) par-ce-que j'ai du mal à recoller les morceaux là .
Résumé de ce que je veux faire :
Je voudrais faire une commande qui lance la fonction "time" en boucle.
J'ai pensé à utiliser un bouton radio ou une case a coché (si je la coche ça appelle la fonction time puis je reviens d'en me boucle mais c'est toujours coché alors ça rappelle la fonction time et ainsi de suite jusqu’à ce qu'on décoche la case)
Mais sa ne marche pas

Une commande (case à cocher) : si elle est enclenché :
- alors je lance la fonction time()
- puis je met le programme en pause pendant une durée déterminée (1 seconde)
- je reviens dans la boucle d’événement pour que l'interface s'actualise
- si la commande est toujours enclenché : je recommence
sinon, j'attends un nouvel événement.

Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 03/04/2016 19:01 | #


Pas besoin de case à cocher forcément. Mais commençons comme ça : dans ton programme principal, après avoir créé la fenêtre, tu ajoutes :
fenetre.after(1000, update)

Et ensuite tu définis la fonction update pour faire ce que tu veux :
def update():
        if case_cochee:
                time()
        fenetre.after(1000, update) # repetition

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 03/04/2016 19:11 | #


J'ai cette erreur dès que je lance le programme
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\f.coupey\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__
    return self.func(*args)
  File "C:\Users\f.coupey\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 596, in callit
    func(*args)
TypeError: update() takes 0 positional arguments but 1 was given

Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 03/04/2016 20:38 | #


Vérifie la doc, il faut peut-être que ta commande soit une méthode de l'objet fenêtre. Regarde ce lien, il faut peut-être sub-classer Tk :
http://stackoverflow.com/questions/2400262/how-to-create-a-timer-using-tkinter#2401181
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 03/04/2016 21:27 | #


J'avais fait de update une méthode de la classe interface mais j'avais oublié l'argument self :aie2: .Donc cette erreur est réglé.
En revanche, ça ne marche toujours pas
Quand ma case à coché est coché : la grille ne change pas. Je me suis demander si il y avais quand même une génération qui passait et que le problème était seulement que l'interface ne se mettait pas à jours mais étant donné que si j'appuie sur le bouton de passage de génération "manuel", je passe à la génération suivante j'en ai donc déduis que ça ne marchait pas du tout.
Sauf que dans ma méthode update :
def update(self):
        print(self.en_continue.get())
        if self.en_continue == 1:
            time()
        self.fenetre.after(1000, self.update) # repetition
j'ai :"print(self.en_continue.get())"ai j'ai donc PY_VAR1 qui s'affiche dons la console python toutes les seconde environ, le timer à donc l'air de marcher.
Autre bizarrerie : "print(self.en_continue.get())" devrait m'afficher la valeur de "self.en_continue" et non"PY_VAR1" qui devrait je crois être le résultat de l’instruction "print(self.en_continue)".

Voici le code entier :
import os
import tkinter

class Grille :


    def __init__ (self, nb_generation) :
        self.nb_generation = nb_generation
        self.taille = [114, 210]
        self.grille = []
        for ligne in range(self.taille[0]+2) :
            self.grille.append([])
            for colonne in range(self.taille[1]+2) :
                self.grille[ligne].append(0)

    def generation (self, grille_2) :
        global interface
        liste = []
        for ligne in range(1,self.taille[0]-1) :
            for colonne in range(1,self.taille[1]-1) :
                if grille_2.grille[ligne][colonne] == 1 :
                    liste.append([colonne, ligne])
                i = 0
                for X in [-1, 0, 1] :
                    for Y in [-1, 0, 1] :
                        if grille_2.grille[ligne+X][colonne+Y] == 1 :
                            i += 1
                if i == 3 or (grille_2.grille[ligne][colonne] == 1 and i == 4) :
                    self.grille[ligne][colonne] = 1
        self.nb_generation += 1
        interface.generation.set("Génération :\n > {}".format(self.nb_generation))
        print(liste)
        print("")
        liste = str(liste)
        with open("enregistrement.txt", "w") as fichier :
                fichier.write(liste)


class Interface :

    def __init__ (self) :
        global grille
        
        self.fenetre = tkinter.Tk()
        self.fenetre.title("Labyrinthe")
        self.fenetre.geometry("1350x690+1+1")
        self.fenetre["bg"] = "blue"

        self.canevas = tkinter.Canvas(self.fenetre, width =1251, height =675, bg ='white')
        self.canevas.grid(row =0, column =0, rowspan =30, padx =6, pady =6)
        self.canevas.focus_set()
        self.canevas.bind('<Key>',clavier)

        self.generation = tkinter.StringVar()
        self.generation.set("Génération :\n > {}".format(grille.nb_generation))
        
        self.figures_label = tkinter.Label(self.fenetre, text="Figures :", width=8, height =1, justify="left", fg="red")
        self.figures_label.grid(row =0, column =1, padx =2, pady =2)
        
        self.generation_label = tkinter.Label(self.fenetre, textvariable=self.generation, width=10, height =2, justify="left", fg="red")
        self.generation_label.grid(row =18, column =1, padx =2, pady =2)
        
        self.boutton_planeur = tkinter.Button(self.fenetre, text="Planeur", fg="blue", width=10, height =1, command =planeur)
        self.boutton_planeur.grid(row =1, column =1, padx =1, pady =1)
        
        self.boutton_vaisseau = tkinter.Button(self.fenetre, text="Vaisseau", fg="blue", width=10, height =1, command =vaisseau)
        self.boutton_vaisseau.grid(row =2, column =1, padx =1, pady =1)
        
        self.boutton_clown = tkinter.Button(self.fenetre, text="Clown(g110)", fg="blue", width=10, height =1, command =clown)
        self.boutton_clown.grid(row =3, column =1, padx =1, pady =1)
        
        self.boutton_chasse_neige = tkinter.Button(self.fenetre, text="Chasse neige", fg="blue", width=10, height =1, command =chasse_neige)
        self.boutton_chasse_neige.grid(row =4, column =1, padx =1, pady =1)
        
        self.en_continue = tkinter.IntVar()
        self.en_continue.set(0)
        self.check_boutton = tkinter.Checkbutton(self.fenetre,text="continue",variable=self.en_continue)
        self.check_boutton.grid(row =14, column =1, padx =1, pady =1)
        
        self.boutton_effacer = tkinter.Button(self.fenetre, text="Effacer", fg="blue", width=10, height =1, command =effacer)
        self.boutton_effacer.grid(row =28, column =1, padx =1, pady =1)

        self.boutton_generation = tkinter.Button(self.fenetre, text="Génération", fg="blue", width=10, height =1, command =time)
        self.boutton_generation.grid(row =17, column =1, padx =1, pady =1)

        self.boutton_quitter = tkinter.Button(self.fenetre, text="Quitter", fg="red", width=10, height =1, command =self.fenetre.destroy)
        self.boutton_quitter.grid(row =29, column =1, padx =1, pady =1)
        
        self.fenetre.after(1000, self.update)

    def afficher (self, grille) :
        self.canevas.delete("all")
        for ligne in range(grille.taille[0]-1) :
            for collone in range(grille.taille[1]-1) :
                if grille.grille[ligne+1][collone+1] == 1 :
                    self.canevas.create_rectangle(4+6*collone, 4+6*ligne, 8+6*collone, 8+6*ligne, fill="black")
        interface.canevas.create_rectangle(4+6*(position[1]-1), 4+6*(position[0]-1), 8+6*(position[1]-1), 8+6*(position[0]-1))

    def update(self):
        print(self.en_continue.get())
        if self.en_continue == 1:
            time()
        self.fenetre.after(1000, self.update) # repetition

def time ():
    global grille
    g = Grille(grille.nb_generation)
    g.generation(grille)
    grille = g
    interface.afficher(grille)

def clavier (event) :
    global grille, position, interface
    touche = event.keysym
    if touche == "Up":
        if position[0] > 1 :
            position[0] -= 1
    if touche == "Down":
        if position[0] < grille.taille[0]-2 :
            position[0] += 1
    if touche == "Right":
        if position[1] < grille.taille[1]-2 :
            position[1] += 1
    if touche == "Left":
        if position[1] > 1 :
            position[1] -= 1
    if touche == "Return" :
        if grille.grille[position[0]][position[1]] == 1 :
            grille.grille[position[0]][position[1]] = 0
        else :
            grille.grille[position[0]][position[1]] = 1
    interface.afficher(grille)

def effacer () :
    global grille, interface
    grille = Grille(0)        
    interface.generation.set("Génération :\n > {}".format(grille.nb_generation))
    interface.afficher(grille)
    
def planeur () :
    global grille
    for x, y in [(1, 3), (2, 3), (3, 3), (3, 2), (2, 1)]:
        grille.grille[y][x] = 1
    interface.afficher(grille)

def vaisseau () :
    global grille
    for x, y in [(1, 4), (2, 5), (3, 5), (4, 5), (5, 5), (5, 4), (5, 3), (4, 2)]:
        grille.grille[y][x] = 1
    interface.afficher(grille)

def clown () :
    global grille
    for x, y in [(49, 49), (49, 50), (49, 51), (50, 49), (51, 51), (51, 50), (51, 49)]:
        grille.grille[y][x] = 1
    interface.afficher(grille)
    
def chasse_neige () :
    global grille
    for x, y in [(197, 92), (196, 93), (197, 93), (196, 94), (198, 94), (202, 94), (200, 95), (201, 95), (201, 96), (204, 96), (199, 97), (200, 97), (202, 97), (205, 97), (195, 98), (196, 98), (197, 98), (199, 98), (200, 98), (205, 98), (194, 99), (197, 99), (202, 99), (193, 100), (198, 100), (203, 100), (204, 100), (188, 101), (189, 101), (193, 101), (199, 101), (201, 101), (203, 101), (204, 101), (187, 102), (188, 102), (193, 102), (194, 102), (204, 102), (189, 103), (195, 103), (205, 103), (192, 104), (193, 104), (196, 104), (203, 104), (204, 104), (205, 104), (190, 105), (192, 105), (193, 105), (205, 105), (207, 105), (190, 106), (191, 106), (196, 106), (206, 106), (207, 106), (189, 107), (192, 107), (194, 107), (195, 108), (196, 108), (199, 108), (191, 109), (195, 109), (196, 109), (197, 109), (199, 109), (192, 110), (193, 110), (198, 110), (199, 110), (200, 110), (201, 111), (200, 112), (201, 112)] :
        grille.grille[y][x] = 1
    interface.afficher(grille)
    

global grille, position
grille = Grille(0)
position = [int(grille.taille[0]/2), int(grille.taille[1]/2)]

interface = Interface()
interface.afficher(grille)
interface.fenetre.mainloop()


Ps : Désolé pour mon orthographe pourrie
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 04/04/2016 14:40 | #


Mais ! Une IntVar() c'est pas un entier !
if self.en_continue.get() == 1:

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 04/04/2016 18:35 | #



Qu'est ce que je peu être con :aie2:

Merci beaucoup ça marche troop bien même si c'est pas aussi rapide qu'on aimerai, mais on devrai pouvoir optimiser ça
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 05/04/2016 18:05 | #


C'est pas la première fois que me fais ce coup-là, surveille tes objets x)

Et si tu trouves ça un peu lent, tu peux peut-être faire varier la fréquence du timer plutôt non ? Parce que là peu importe ton niveau d'optimisation t'es pas près de décoller d'une génération par seconde
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 05/04/2016 18:32 | #


self.fenetre.after(1, self.update)

Heu pour le timer je crois que je peux pas faire mieux .

Ajouté le 05/04/2016 à 18:50 :
Lephenixnoir a écrit :
En fait pour ton programme j'ai compris tout à l'heure : ton callback (la fonction de gestion de l'évènement du bouton, jeu()), ne se terminait jamais. Hors l'actualisation de l'affichage à l'écran ne peut se faire que lorsqu'on revient à la boucle d'évènements (celle lancée avec mainloop()), donc il fallait que jeu() se termine (et dans mon cas time() se termine en effet ).

Lephenixnoir a écrit :
En fait le timer va casser la boucle principale le temps que ta commande s'exécute et y revenir ensuite comme un grand.

Je voudrai comprendre les choses en profondeur :

"l'actualisation de l'affichage à l'écran ne peut se faire que lorsqu'on revient à la boucle d’événements" hors ici :
def update(self):
        if self.en_continue.get() == 1:
            time()
        self.fenetre.after(1, self.update)
la fonction s'appelle elle même à l'infinie, donc j'en déduis que je ne reviens jamais dans la boucle d’événement ce qui voudrai dire que l'affichage ne devrai pas s'actualiser.

De même je ne devrai pas pouvoir appeler d'autres fonctions.

Je pense que ceci est dû au fonctionnement interne du timer que je n'est pas tout à fait intégré ou même peut être de celui de l'interface graphique et de la boucle d'événements.

Un peu d’éclairage là dessus serait donc la bienvenue .
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 06/04/2016 12:39 | #


Gab.c a écrit :
Heu pour le timer je crois que je peux pas faire mieux .

Euh, évite ça ta fonction est pas assez puissante pour tenir la charge de 1000 FPS donc là tu embourbes le programme dans une série d'évènements non gérés. De manière générale, ne descends pas en-dessous de 50/60 FPS avec un timer, en-dessous ça ne sert à rien de toute façon.

Gab.c a écrit :
la fonction s'appelle elle même à l'infinie, donc j'en déduis que je ne reviens jamais dans la boucle d’événement ce qui voudrai dire que l'affichage ne devrai pas s'actualiser.

Tout à fait.

Gab.c a écrit :
De même je ne devrai pas pouvoir appeler d'autres fonctions.

Tu peux faire tout ce que tu veux, tant que
1- La fonction se termine et permet donc le retour à la boucle d'événements.
2- La fonction se termine avant que l'événement suivant ne soit généré (sinon ça accumule du retard).
D'où l'intérêt de bien prévoir le délai qu'on utilise.

En fait dans ton cas la seconde condition n'est pas nécessaire parce que tu n'as pas un vrai timer qui génère un évènement toutes les secondes mais tu le lances une fois après ta fonction, donc en fait le temps entre deux frames c'est le temps du timer plus celui de l'exécution de ta fonction. Tu ne prends donc aucun risque vis-à-vis de l'accumulation d'événements non gérés, mais mieux vaut éviter de diminuer trop le délai sinon le temps de calcul n'est plus négligeable devant le temps d'attente et on perd complètement la valeur réelle de FPS.

Gab.c a écrit :
Je pense que ceci est dû au fonctionnement interne du timer que je n'est pas tout à fait intégré ou même peut être de celui de l'interface graphique et de la boucle d'événements.

Souviens-toi que la boucle d'évènements gère tout comme ton main. Tant que les commandes que tu attribues à ton interface ne se terminent pas, le retour à la boucle d'événements n'est pas possible -- en tous cas si le programme fonctionne sur un seul thread. Le plus simple est de considérer tes commandes comme des sous-routines.

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 06/04/2016 15:29 | #


FPS signifie frames par secondes ?
Un site a écrit :
Il n'existe pas de routines(parfois appelés sous-programmes) en Python

Que sont les sous-routines ?
Sinon merci pour toutes c'est explications .

Leohenixnoir a écrit :
Oui, j'ai modifié le programme en local pour le rendre plus souple (je l'ai bien amélioré aussi), et j'avais le même problème.

Que signifie "programme en local" ?
"je l'ai bien amélioré aussi" : quelles améliorations
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 06/04/2016 17:37 | #


Gab.c a écrit :
FPS signifie frames par secondes ?

Oui.

Gab.c a écrit :
Que sont les sous-routines ?

Absolument pas un terme technique, routine = procédure = fonction = bout de code, etc. En gros faut voir tes commandes comme des sous-fonctions appelées par un programme plus large qui est la boucle d'événements.

Gab.c a écrit :
Que signifie "programme en local" ?

Programme = ben...
Et « en local » signifie le plus couramment indépendamment du réseau (qui lui est, ben... global). En gros je l'ai modifié sur mon ordinateur sans envoyer de version modifiée sur Internet.

Gab.c a écrit :
"je l'ai bien amélioré aussi" : quelles améliorations

J'ai surtout paramétré la taille de la grille. Quelques éléments graphiques (simplifié ta grille à 30 colonnes inutile, viré le redimensionnement de la fenêtre qui coupait le bouton sur mon ordinateur), et de la structure entre les objets. J'ai aussi tout renommé en anglais, je suis intraitable là-dessus (surtout lorsqu'il y a des fautes sur les noms français -_- ).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 06/04/2016 18:01 | # | Fichier joint


Bon bah voilà ce que ça donne : fichier joint
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Lephenixnoir Hors ligne Administrateur Points: 24226 Défis: 170 Message

Citer : Posté le 06/04/2016 18:05 | #


C'est pas mal ! Après vu ton code je pense que tu peux t'améliorer en structure...

Et, euh... pourquoi du bleu en fond ? xD
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Gab.c Hors ligne Membre Points: 449 Défis: 0 Message

Citer : Posté le 06/04/2016 18:11 | #


C'est pas mal ! Après vu ton code je pense que tu peux t'améliorer en structure...
Je ne te le fait pas dire

Et, euh... pourquoi du bleu en fond ? xD
Alors là, bonne question

Ajouté le 02/12/2016 à 23:26 :
Bonjour
J'ai une erreur que je n'arrive pas à comprendre :
Le code (juste la partie intéressante) :
print(foret_2.foret[feu[0]][feu[1]])
self.foret[feu[0]][feu[1]] = 3
print(foret_2.foret[feu[0]][feu[1]])

Le resultat :
2
3

Je ne comprends pas pourquoi self.foret[feu[0]][feu[1]] = 3 changerait la valeur de foret_2.foret[feu[0]][feu[1]].

Ajouté le 03/12/2016 à 10:11 :
Voici le code complet :
import tkinter
import random

class Foret :

    nb_cendre = 0
    nb_feu_max = 0
    temps = 0

    def __init__ (self) :
        self.nb_cellules = 0
        self.taille = [112, 208]
        self.foret = []
        self.cellules_feu = []
        for ligne in range(self.taille[0]+2) :
            self.foret.append([])
            for colonne in range(self.taille[1]+2) :
                self.foret[ligne].append(0)


    def feu (self, foret_2) :
        global interface
        feux = 0
        liste = []
        self.foret = foret_2.foret
        Foret.nb_cendre += len(foret_2.cellules_feu)
        for feu in foret_2.cellules_feu :
            print(foret_2.foret[feu[0]][feu[1]])
            self.foret[feu[0]][feu[1]] = 2
            print(foret_2.foret[feu[0]][feu[1]])
            interface.canevas.create_rectangle(4+6*(feu[1]-1), 4+6*(feu[0]-1), 8+6*(feu[1]-1), 8+6*(feu[0]-1), fill="grey", outline="grey")
            for X in [[-1,-1], [-1,0], [-1,1], [0,-1], [0,1], [1,-1], [1,0], [1,1]] :
                if foret_2.foret[feu[0]+X[0]][feu[1]+X[1]] == 1 :
                    i = 0
                    if foret_2.foret[feu[0]+X[0]-1][feu[1]+X[1]-1] == 2 :
                        i += 1
                        if interface.vent_direction.get() == "Nord" or interface.vent_direction.get() == "Ouest" :
                            i += interface.vent_vitesse.get()/100
                        else :
                            i -= interface.vent_vitesse.get()/100
                        if interface.pente_direction.get() == "Nord" or interface.pente_direction.get() == "Ouest" :
                            i += interface.pente_denivele.get()/100
                        else :
                            i -= interface.pente_denivele.get()/100
                    if foret_2.foret[feu[0]+X[0]-1][feu[1]+X[1]] == 2 :
                        i += 2
                        if interface.vent_direction.get() == "Nord" :
                            i += interface.vent_vitesse.get()/50
                        else :
                            i -= interface.vent_vitesse.get()/50
                        if interface.pente_direction.get() == "Nord" :
                            i += interface.pente_denivele.get()/50
                        else :
                            i -= interface.pente_denivele.get()/50
                    if foret_2.foret[feu[0]+X[0]-1][feu[1]+X[1]+1] == 2 :
                        i += 1
                        if interface.vent_direction.get() == "Nord" or interface.vent_direction.get() == "Est" :
                            i += interface.vent_vitesse.get()/100
                        else :
                            i -= interface.vent_vitesse.get()/100
                        if interface.pente_direction.get() == "Nord" or interface.pente_direction.get() == "Est" :
                            i += interface.pente_denivele.get()/100
                        else :
                            i -= interface.pente_denivele.get()/100
                    if foret_2.foret[feu[0]+X[0]][feu[1]+X[1]-1] == 2 :
                        i += 2
                        if interface.vent_direction.get() == "Ouest" :
                            i += interface.vent_vitesse.get()/50
                        else :
                            i -= interface.vent_vitesse.get()/50
                        if interface.pente_direction.get() == "Ouest" :
                            i += interface.pente_denivele.get()/50
                        else :
                            i -= interface.pente_denivele.get()/50
                    if foret_2.foret[feu[0]+X[0]][feu[1]+X[1]+1] == 2 :
                        i += 2
                        if interface.vent_direction.get() == "Est" :
                            i += interface.vent_vitesse.get()/50
                        else :
                            i -= interface.vent_vitesse.get()/50
                        if interface.pente_direction.get() == "Est" :
                            i += interface.pente_denivele.get()/50
                        else :
                            i -= interface.pente_denivele.get()/50
                    if foret_2.foret[feu[0]+X[0]+1][feu[1]+X[1]-1] == 2 :
                        i += 1
                        if interface.vent_direction.get() == "Sud" or interface.vent_direction.get() == "Ouest" :
                            i += interface.vent_vitesse.get()/100
                        else :
                            i -= interface.vent_vitesse.get()/100
                        if interface.pente_direction.get() == "Sud" or interface.pente_direction.get() == "Ouest" :
                            i += interface.pente_denivele.get()/100
                        else :
                            i -= interface.pente_denivele.get()/100
                    if foret_2.foret[feu[0]+X[0]+1][feu[1]+X[1]] == 2 :
                        i += 2
                        if interface.vent_direction.get() == "Sud" :
                            i += interface.vent_vitesse.get()/50
                        else :
                            i -= interface.vent_vitesse.get()/50
                        if interface.pente_direction.get() == "Sud" :
                            i += interface.pente_denivele.get()/50
                        else :
                            i -= interface.pente_denivele.get()/50
                    if foret_2.foret[feu[0]+X[0]+1][feu[1]+X[1]+1] == 2 :
                        i += 1
                        if interface.vent_direction.get() == "Sud" or interface.vent_direction.get() == "Est" :
                            i += interface.vent_vitesse.get()/100
                        else :
                            i -= interface.vent_vitesse.get()/100
                        if interface.pente_direction.get() == "Sud" or interface.pente_direction.get() == "Est" :
                            i += interface.pente_denivele.get()/100
                        else :
                            i -= interface.pente_denivele.get()/100
                    if i >= random.randint(1,2) :
                        self.foret[feu[0]+X[0]][feu[1]+X[1]] = 2
                        liste.append([feu[0]+X[0],feu[1]+X[1]])
                        interface.canevas.create_rectangle(4+6*(feu[1]+X[1]-1), 4+6*(feu[0]+X[0]-1), 8+6*(feu[1]+X[1]-1), 8+6*(feu[0]+X[0]-1), fill="red", outline="red")
                        feux += 1
        self.cellules_feu = liste
        if feux > 0 :
            Foret.temps += 1
        if feux > Foret.nb_feu_max :
            Foret.nb_feu_max = feux


class Interface :

    def __init__ (self) :
        global foret

        self.fenetre = tkinter.Tk()
        self.fenetre.title("Feu de forêt")
        self.fenetre.geometry("1350x690+1+1")
        self.fenetre["bg"] = "blue"
        self.canevas = tkinter.Canvas(self.fenetre, width =1251, height =675, bg ='white')
        self.canevas.grid(row =0, column =0, rowspan =30, padx =6, pady =6)
        self.canevas.bind('<Button-1>', clic)
        self.canevas.focus_set()

        self.temps = tkinter.StringVar()
        self.temps.set("Temps :\n > {}".format(0))
        self.nb_cendre = tkinter.StringVar()
        self.nb_cendre.set("Arbres morts :\n > {} %".format(0))
        self.nb_feu_max = tkinter.StringVar()
        self.nb_feu_max.set("Nb feu max :\n > {}".format(0))
        self.densite = tkinter.IntVar()
        self.densite.set(50)
        self.vent_vitesse = tkinter.IntVar()
        self.vent_vitesse.set(0)
        self.vent_direction = tkinter.StringVar()
        self.vent_direction.set("Nord")
        self.pente_denivele = tkinter.IntVar()
        self.pente_denivele.set(0)
        self.pente_direction = tkinter.StringVar()
        self.pente_direction.set("Nord")
        self.play = tkinter.IntVar()
        self.play.set(0)

        tkinter.Spinbox(self.fenetre, textvariable=self.densite, from_=0, to=100, increment=1, width=10).grid(row =4, column =1, padx =1)
        tkinter.Spinbox(self.fenetre, textvariable=self.vent_vitesse, from_=0, to=100, increment=1, width=10).grid(row =7, column =1, padx =1)
        tkinter.Spinbox(self.fenetre, textvariable=self.vent_direction, values=("Nord", "Ouest", "Sud", "Est"), width=10).grid(row =6, column =1, padx =1)
        tkinter.Spinbox(self.fenetre, textvariable=self.pente_denivele, from_=0, to=100, increment=1, width=10).grid(row =10, column =1, padx =1)
        tkinter.Spinbox(self.fenetre, textvariable=self.pente_direction, values=("Nord", "Ouest", "Sud", "Est"), width=10).grid(row =9, column =1, padx =1)
        tkinter.Label(self.fenetre, textvariable=self.temps, width=10, height =2, fg="red").grid(row =0, column =1, padx =2)
        tkinter.Label(self.fenetre, textvariable=self.nb_cendre, width=10, height =2, fg="red").grid(row =1, column =1, padx =2)
        tkinter.Label(self.fenetre, textvariable=self.nb_feu_max, width=10, height =2, fg="red").grid(row =2, column =1, padx =2)
        tkinter.Label(self.fenetre, text="Densité :", width=10, height =1, fg="red").grid(row =3, column =1, padx =2)
        tkinter.Label(self.fenetre, text="Vent :", width=10, height =1, fg="red").grid(row =5, column =1, padx =2)
        tkinter.Label(self.fenetre, text="Relief :", width=10, height =1, fg="red").grid(row =8, column =1, padx =2)
        tkinter.Button(self.fenetre, text="Feu centre", fg="blue", width=10, height =1, command =feu_centre).grid(row =24, column =1, padx =1)
        tkinter.Button(self.fenetre, text="Feu alea", fg="blue", width=10, height =1, command =feu_alea).grid(row =23, column =1, padx =1)
        tkinter.Button(self.fenetre, text="Enregistrer val", fg="blue", width=10, height =1, command =enregistrer_val).grid(row =22, column =1, padx =1)
        tkinter.Button(self.fenetre, text="Charger", fg="blue", width=10, height =1, command =charger).grid(row =25, column =1, padx =1)
        tkinter.Button(self.fenetre, text="Enregistrer", fg="blue", width=10, height =1, command =enregistrer).grid(row =26, column =1, padx =1)
        tkinter.Button(self.fenetre, text="play/pause", fg="blue", width=10, height =1, command =self.pause_play).grid(row =27, column =1, padx =1)
        tkinter.Button(self.fenetre, text="Effacer", fg="blue", width=10, height =1, command =effacer).grid(row =28, column =1, padx =1)
        tkinter.Button(self.fenetre, text="Quitter", fg="red", width=10, height =1, command =self.fenetre.destroy).grid(row =29, column =1, padx =1)

        self.fenetre.after(50, self.update)

    def pause_play (self) :
        if self.play.get() == 1 :
            self.play.set(0)
        else :
            self.play.set(1)


    def update (self) :
        if self.play.get() == 1 :
            global foret
            g = Foret()
            g.feu(foret)
            foret = g
            self.temps.set("Temps :\n > {}".format(Foret.temps))
            self.nb_feu_max.set("Nb feu max :\n > {}".format(Foret.nb_feu_max))
            self.nb_cendre.set("Arbres morts :\n > {} %".format(round((Foret.nb_cendre*100)/((foret.taille[0]*foret.taille[1]*interface.densite.get())/100),2)))
        self.fenetre.after(50, self.update)


def feu_centre () :
    global foret, interface
    colonne = int(foret.taille[1]/2)
    ligne = int(foret.taille[0]/2)
    for X in [-1, 0, 1] :
        for Y in [-1, 0, 1] :
            foret.cellules_feu.append([ligne+X,colonne+Y])
            foret.foret[ligne+X][colonne+Y] = 2
            interface.canevas.create_rectangle(4+6*(colonne+Y-1), 4+6*(ligne+X-1), 8+6*(colonne+Y-1), 8+6*(ligne+X-1), fill="red", outline="red")
            
def feu_alea () :
    global foret, interface
    colonne = random.randint(2,foret.taille[1])
    ligne = random.randint(2,foret.taille[0])
    for X in [-1, 0, 1] :
        for Y in [-1, 0, 1] :
            foret.cellules_feu.append([ligne+X,colonne+Y])
            foret.foret[ligne+X][colonne+Y] = 2
            interface.canevas.create_rectangle(4+6*(colonne+Y-1), 4+6*(ligne+X-1), 8+6*(colonne+Y-1), 8+6*(ligne+X-1), fill="red", outline="red")

def clic (event) :
    global foret, interface
    colonne = int((event.x-4)/6+1)
    ligne = int((event.y-4)/6+1)
    foret.cellules_feu.append([ligne,colonne])
    foret.foret[ligne][colonne] = 2
    interface.canevas.create_rectangle(4+6*(colonne-1), 4+6*(ligne-1), 8+6*(colonne-1), 8+6*(ligne-1), fill="red", outline="red")

def enregistrer_val () :
    global interface
    with open("enregistrement_val.txt", "r") as fichier :
        liste = fichier.read()
    liste = str(liste) + str(Foret.temps) + " " + str(round((Foret.nb_cendre*100)/((foret.taille[0]*foret.taille[1]*interface.densite.get())/100),2)) + " " + str(Foret.nb_feu_max) + "\n"
    with open("enregistrement_val.txt", "w") as fichier :
        fichier.write(liste)    
    
def enregistrer () :
    global foret
    liste = []
    for ligne in range(1,foret.taille[0]+1) :
        for colonne in range(1,foret.taille[1]+1) :
            liste.append(foret.foret[ligne][colonne])
    liste = str(liste).replace("[","").replace("]","").replace(" ","").replace(",","")
    with open("enregistrement.txt", "w") as fichier :
        fichier.write(liste)


def charger () :
    global foret, interface
    with open("enregistrement.txt", "r") as fichier :
        liste = fichier.read()
    liste = str(liste)
    foret = Foret()
    Foret.nb_cendre = 0
    Foret.nb_feu_max = 0
    Foret.temps = 0
    interface.canevas.delete("all")
    interface.temps.set("Temps :\n > {}".format(0))
    interface.nb_cendre.set("Arbres morts :\n > {} %".format(0))
    interface.nb_feu_max.set("Nb feu max :\n > {}".format(0))
    couleurs = ["white", "green", "red", "grey"]
    for ligne in range(1,foret.taille[0]+1) :
        for colonne in range(1,foret.taille[1]+1) :
            foret.foret[ligne][colonne] = int(liste[((ligne-1)*(foret.taille[1]))+(colonne-1)])
            interface.canevas.create_rectangle(4+6*(colonne-1), 4+6*(ligne-1), 8+6*(colonne-1), 8+6*(ligne-1), fill=couleurs[foret.foret[ligne][colonne]], outline=couleurs[foret.foret[ligne][colonne]])

def effacer () :
    global foret, interface
    foret = Foret()
    Foret.nb_cendre = 0
    Foret.nb_feu_max = 0
    interface.canevas.delete("all")
    for i in range(int((foret.taille[0]*foret.taille[1]*interface.densite.get())/100)) :
        ligne = random.randint(1,foret.taille[0])
        colonne = random.randint(1,foret.taille[1])
        while foret.foret[ligne][colonne] == 1 :
            ligne = random.randint(1,foret.taille[0])
            colonne = random.randint(1,foret.taille[1])
        foret.foret[ligne][colonne] = 1
        interface.canevas.create_rectangle(4+6*(colonne-1), 4+6*(ligne-1), 8+6*(colonne-1), 8+6*(ligne-1), fill="green", outline="green")
    interface.temps.set("Temps :\n > {}".format(0))
    interface.nb_cendre.set("Arbres morts :\n > {} %".format(0))
    interface.nb_feu_max.set("Nb feu max :\n > {}".format(0))


global foret, interface
interface = Interface()
effacer()
interface.fenetre.mainloop()

L'erreur est donc au niveau de la ligne 29.
Au soir de votre vie, le seigneur ne comptera pas le nombre de fois ou vous êtes tombés, il comptera le nombre de fois ou vous vous êtes relevés.

Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Julese50 Hors ligne Gourou Points: 315 Défis: 16 Message

Citer : Posté le 03/12/2016 10:33 | #


En fait, la vraie erreur se trouve à ce niveau :
self.foret = foret_2.foret

Quand tu fais cette assignation, Python ne copie pas tout l'objet à un nouvel emplacement de la mémoire, il lie tout simplement le nom self.foret au contenu foret_2.foret.

C'est pour ça que quand tu modifie self.foret, tu modifie foret_2.foret.
Pour faire une deep copy d'une liste (c'est à dire copier toute la liste, récursivement, vers une nouvelle variable, donc exactement ce que tu veux), tu peux utiliser la fonction deepcopy du module copy (qui est un module standard Python).

Si ce n'était pas des listes imbriquées, tu aurais pu faire une shallow copy, c'est à dire copier superficiellement le contenu de la liste (on ne peut pas utiliser ce type de copie dans ce cas, parce que les listes dans la liste auraient été copiées uniquement par référence, et donc le problème n'aurait pas été résolu), de cette manière :
nouvelle_liste = liste[:]

(À noter que ça ne marche que pour les listes, puisqu'on fait un slice. Pour faire une shallow copy d'un objet autre qu'une liste, il y a la fonction copy du module copy)
Précédente 1, 2, 3 ··· 7, 8, 9, 10, 11 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 69 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd