Bonjour,
je pose donc 2 questions qui pour moi sont liées. Merci de ne pas taper s'il faut faire autrement.

Pour apprentissage de langage évolué je cherche à réaliser l'exemple bateau d'un labyrinthe.
Pour l'instant cela s'affiche normalement avec le code suivant :

Le programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Affiche un labyrinthe avec énnemis et trésors
# Affiche l'avatar du joueur et le déplace
 
from tkinter import *
import M_Lab_03
 
if __name__ == "__main__" :
    fenetre = Tk()     # a faire avant d'affecter une image (ici pour perso)
    fenetre.title("Labyrinthe graphique avec le héro qui se déplace") 
 
    perso = {                           # ensemble des données du personnage
        "sprite" : PhotoImage(file = "sprites/tux.png"),   # son avatar
        "pieces" : 0,                   # nombre de pièces d'or
        "vie" : 25,                     # nombre de points de vie restant
        "niveau" : 1,                   # numéro du niveau actuel
        "colonne" : 1,
        "ligne" : 1}                    # colonne + ligne = position du joueur
    niveau_max : 3
 
    lab_actuel = M_Lab_03.charge_lab("level_1")
    (toile, perso, sprites) = M_Lab_03.aff_lab(lab_actuel, fenetre, perso)
    M_Lab_03.config_touches(lab_actuel, toile, fenetre, perso)
    fenetre.mainloop()
Le module :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/python3
# -*- coding: utf-8 -*-

from tkinter import *

def charge_lab(nom):
    """
        Charge le labyrinthe depuis le fichier nom.txt

        nom : nom du fichier sans l'extension .txt

        retour
            liste contenant le labyrinthe
    """
    try :
        fichier = open(nom + ".txt" , "r")
        datas = fichier.readlines()
        fichier.close()
    except IOError :
        print("Impossible de lire le fichier {}.txt".format(nom))
        exit(1)
        
    for i in range(len(datas)):
        datas[i] = datas[i].strip() # retire les caracteres inutiles
    return  datas                   # au debut et a la fin de la ligne 

def aff_lab(lab, fenetre, perso):
    """
        Affichage d'un labyrinthe
        
        lab : liste contenant le labyrinthe

        retour : tuple contenant la toile et les sprites
    """
    # Rq : la taille des sprites pourrait être un paramètre
    toile = Canvas(fenetre, width = 600, height = 600)
    coin    = PhotoImage(file = "sprites/angle.png")
    mur_h   = PhotoImage(file = "sprites/mur_h.png")
    mur_v   = PhotoImage(file = "sprites/mur_v.png")
    sol     = PhotoImage(file = "sprites/sol.png")
    sortie  = PhotoImage(file = "sprites/sortie.png")
    ennemi  = PhotoImage(file = "sprites/ennemi.png")
    tresor  = PhotoImage(file = "sprites/coffre_ferme.png")

    n_ligne = 0
    for ligne in lab :
        n_col = 0
        for car in ligne :
            if car == "+" :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = coin)
            if car == "-" :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = mur_h)
            if car == "|" :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = mur_v)
            if car == " " and (n_col != perso["colonne"] or n_ligne != perso["ligne"]) :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = sol)
            if car == " " and (n_col == perso["colonne"] and n_ligne == perso["ligne"]) :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = perso["sprite"]) 
            if (car == "1" or car == "2" or car == "3") and (n_col != perso["colonne"] or n_ligne != perso["ligne"]) :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = tresor)
            if (car == "1" or car == "2" or car == "3") and (n_col == perso["colonne"] and n_ligne == perso["ligne"]) :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = perso["sprite"])
            if car == "$" and (n_col != perso["colonne"] or n_ligne != perso["ligne"]) :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = ennemi)
            if car == "$" and (n_col == perso["colonne"] and n_ligne == perso["ligne"]) :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = perso["sprite"])
            if car == "S" :
                toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = sortie)
            n_col += 1
        n_ligne += 1
    toile.pack()
    return (toile, perso, {
        "coin" : coin,
        "mur_h" : mur_h,
        "mur_v" : mur_v,
        "sol" : sol,
        "sortie" : sortie,
        "ennemi" : ennemi,
        "tresor" : tresor})

def deplacement(event,fenetre,toile,dep,lab,perso):
    n_cols = len(lab[0])    # nombre de colonnes = nombre de caractères de la première ligne
    n_lignes = len(lab)     # nombre de lignes = nombre d'éléments de la liste lab
    colonne = perso["colonne"]
    ligne = perso["ligne"]
    if dep == "droite" :
        colonne = colonne + 1
    if dep == "gauche" :
        colonne = colonne - 1
    if dep == "haut" :
        ligne = ligne - 1
    if dep == "bas" :
        ligne = ligne + 1
    # Vérification
    if ligne < 0 or ligne > n_lignes - 1 or colonne < 0 or colonne > n_cols - 1 :
        return None
    if lab[ligne][colonne] == " " :
        perso["colonne"]=colonne
        perso["ligne"]=ligne
    toile.coords(perso["sprite"], colonne * 30, ligne * 30)
    toile.create_image(colonne*30, ligne*30, anchor = NW, image =perso["sprite"]) 

def quitter(event,fenetre):
    fenetre.destroy()

def config_touches(lab_actuel, toile, fenetre, perso):
    fenetre.bind("<Right>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"droite",l,p))
    fenetre.bind("<Left>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"gauche",l,p))                 
    fenetre.bind("<Up>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"haut",l,p))
    fenetre.bind("<Down>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"bas",l,p))
    fenetre.bind("<q>", lambda event, f = fenetre : quitter(event,f))
    fenetre.bind("<Q>", lambda event, f = fenetre : quitter(event,f))
En rouge le déplacement du sprite du joueur avec la première ligne recopiée d'un magasine qui ne fonctionne pas et la deuxième ligne ma "correction"

Pourquoi la ligne modifiant les coordonnées ne fonctionne pas. La deuxième ligne semble montrer que les paramètres sont bien passés.

Même si j'arrive (grâce à vous ) à faire fonctionner le changement de coordonnées, je pense que cela ne va pas m'aider pour plus tard. En effet je voudrais pouvoir modifier le labyrinthe (la liste de strings) pour modifier le coffre s'il est ouvert par exemple. J'aimerais bien pouvoir rafraichir l'ensemble de l'affichage après un mouvement (pas forcément tous). De toute façon il faudra bien afficher entièrement un nouveau niveau.

Merci d'avance et désolé pour la longueur du message.
Sylvain.
level_1.txt level_2.txt level_3.txt