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)) |
Partager