Projet "Labyrinthe"
J'espère que maintenant c'est bon ?
Bonjour à tous,
J'essaie de faire un petit programme en python où il y a un personnage (un point) qui se déplace dans un labyrinthe. J'essaie de déplacer mon personnage en dessinant à chaque fois un nouveau point dans la case de destination et en "repeignant" la case où il était précédemment.
Cependant, je rencontre quelques problèmes..
1) Quand j'exécute le code, plein de messages d'erreur s'affichent (que je ne comprends pas)
2) Je peux effectuer qu'une seule fois les déplacements.
3) Les déplacements hauts et bas se déroulent très bien (au niveau de l'affichage) mais les déplacements droites et gauches rencontrent un vrai problème.
Je vous joins les fichiers (mon code et le 'plan du chateau').
Mon code :
ZONE_PLAN_MINI = (-240, -240) # Coin inférieur gauche de la zone d'affichage du plan
ZONE_PLAN_MAXI = (50, 200) # Coin supérieur droit de la zone d'affichage du plan
POINT_AFFICHAGE_ANNONCES = (-240, 240) # Point d'origine de l'affichage des annonces
POINT_AFFICHAGE_INVENTAIRE = (70, 210) # Point d'origine de l'affichage de l'inventaire
# Les valeurs ci-dessous définissent les couleurs des cases du plan
COULEUR_CASES = 'white'
COULEUR_COULOIR = 'white'
COULEUR_MUR = 'grey'
COULEUR_OBJECTIF = 'yellow'
COULEUR_PORTE = 'orange'
COULEUR_OBJET = 'green'
COULEUR_VUE = 'wheat'
COULEURS = [COULEUR_COULOIR, COULEUR_MUR, COULEUR_OBJECTIF, COULEUR_PORTE, COULEUR_OBJET, COULEUR_VUE]
COULEUR_EXTERIEUR = 'white'
# Couleur et dimension du personnage
COULEUR_PERSONNAGE = 'red'
RATIO_PERSONNAGE = 0.9 # Rapport entre diamètre du personnage et dimension des cases
POSITION_DEPART = (0, 1) # Porte d'entrée du château
# Désignation des fichiers de données à utiliser
fichier_plan = 'plan_chateau.txt'
fichier_questions = 'dico_portes.txt'
fichier_objets = 'dico_objets.txt'
# importation du module turtle
import turtle
# Definitions des fonctions utilisées
def lire_matrice(fichier):
"""Transforme un fichier texte sous sa forme matricielle"""
matrice = []
f = open(fichier)
for i in f:
matrice.append([int(x) for x in i.split()])
return matrice
def calculer_pas(matrice):
"""Calcule la dimension à donner aux cases pour que le plan tienne dans le zone de la fenêtre turtle"""
nbre_cases_y = 440 / len(matrice) # hauteur du rectangle
nbre_cases_x = 290 / len(matrice[0]) # largeur du rectangle
if nbre_cases_y < nbre_cases_x:
pas = nbre_cases_y
else:
pas = nbre_cases_x
return pas
def coordonnees(case, pas):
"""Calcule les coordonées du coin inférieur gauche d'une case définie par ses coordonnées"""
coo = (-240 + case[1] * pas, (200 - pas) - case[0] * pas)
return coo
def tracer_carre(dimension):
"""Trace un carré de côté dimension"""
turtle.setheading(0)
turtle.down()
turtle.forward(dimension)
turtle.left(90)
turtle.forward(dimension)
turtle.left(90)
turtle.forward(dimension)
turtle.left(90)
turtle.forward(dimension)
turtle.left(90)
def tracer_case(case, couleur, pas):
"""Trace une case en fonction du couple de coordonnées d'une case, une couleur et un pas"""
turtle.setheading(0)
turtle.up()
turtle.speed('fastest')
turtle.tracer(0)
turtle.goto(case)
turtle.down()
turtle.fillcolor(couleur)
turtle.pencolor(couleur)
turtle.begin_fill()
tracer_carre(pas)
turtle.end_fill()
turtle.up()
def afficher_plan(matrice):
"""Affiche le plan du château"""
for x in range(len(matrice)):
for y in range(len(matrice[0])):
pas = calculer_pas(matrice)
case = (x, y)
case = coordonnees(case, pas)
j = matrice[x][y]
if j == 0:
couleur = 'white'
elif j == 1:
couleur = 'grey'
elif j == 2:
couleur = 'yellow'
elif j == 3:
couleur = 'orange'
elif j == 4:
couleur = 'green'
else:
couleur = 'white'
tracer_case(case, couleur, pas)
def deplacer(matrice, position, mouvement):
"""Fonction qui donne la nouvelle coordonée d'une case après un certain mouvement."""
nv_position = (position[0] + mouvement[0], position[1] + mouvement[1])
if matrice[nv_position[0]][nv_position[1]] == 1:
nv_position = position
if matrice[nv_position[0]][nv_position[1]] < 0:
nv_position = position
return nv_position
def deplacer_gauche():
"""Fonction qui déplace le personnage vers la gauche"""
global matrice, position, pas
turtle.onkeypress(None, "Left")
mouvement = (0, -1)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
dessine_point(coordonnees(nv_position, pas))
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
print(position)
turtle.onkeypress(deplacer_gauche(), "Left")
def deplacer_droite():
"""Fonction qui déplace le personnage vers la droite"""
global matrice, position, pas
turtle.onkeypress(None, "Right")
mouvement = (0, 1)
nv_position = deplacer(matrice, position, mouvement)
print(nv_position)
if position == nv_position:
pass
else:
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
dessine_point(coordonnees(nv_position, pas))
print(coordonnees(nv_position, pas))
position = nv_position
print(position)
turtle.onkeypress(deplacer_gauche(), "Right")
def deplacer_haut():
"""Fonction qui déplace le personnage vers le haut"""
global matrice, position, pas
turtle.onkeypress(None, "Up")
mouvement = (-1, 0)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
dessine_point(coordonnees(nv_position, pas))
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
print(position)
turtle.onkeypress(deplacer_gauche(), "Up")
def deplacer_bas():
"""Fonction qui déplace le personnage vers le bas"""
global matrice, position, pas
turtle.onkeypress(None, "Down")
mouvement = (1, 0)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
dessine_point(coordonnees(nv_position, pas))
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
print(position)
turtle.onkeypress(deplacer_gauche(), "Down")
def dessine_point(coo):
"""Fonction qui dessine le perssonage, ici un point."""
global pas
turtle.setheading(0) # Tourne la tête de la tortue vers la droite
turtle.up()
turtle.goto(coo)
turtle.forward(pas / 2)
turtle.left(90)
turtle.forward(pas / 2)
turtle.down()
turtle.dot(0.9 * pas, COULEUR_PERSONNAGE)
# Attribution des valeurs 'invariables'
matrice = lire_matrice('plan_chateau.txt')
pas = calculer_pas(matrice)
position = (0, 1)
couleur = 'white'
# Corps du programme
afficher_plan(lire_matrice('plan_chateau.txt')) # Affiche le plan du chateau
dessine_point(coordonnees(position, pas)) # Affiche le personnage à sa position de départ.
turtle.listen() # Déclenche l’écoute du clavier
turtle.onkeypress(deplacer_gauche, "Left") # Associe à la touche Left une fonction appelée deplacer_gauche
turtle.onkeypress(deplacer_droite, "Right")
turtle.onkeypress(deplacer_haut, "Up")
turtle.onkeypress(deplacer_bas, "Down")
turtle.mainloop() # Place le programme en position d’attente d’une action du joueur
plan_chateau.txt :
1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 4 0 0 1
1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1
1 0 0 0 3 0 1 0 0 0 1 0 1 0 0 0 0 0 1
1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 3 0 0 0 0 0 0 0 1
1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1
1 4 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1
1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 0 0 1 0 3 0 0 0 1
1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1
1 0 0 0 3 0 1 4 0 0 1 0 0 0 1 0 0 4 1
1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1
1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1
1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1
1 1 1 3 1 0 1 0 1 1 1 1 1 3 1 0 1 1 1
1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1
1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1
1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1
1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1
1 0 0 0 3 0 0 0 3 0 1 0 0 0 1 0 1 0 1
1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1
1 0 0 0 1 4 0 0 1 0 3 0 0 0 1 0 0 0 1
1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1
1 4 0 0 0 0 1 0 0 0 1 0 0 0 1 0 3 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1
Merci d'avance pour votre aide !
- Labyrinthe python
- Citizen code python avis - Accueil - Outils
- \R python ✓ - Forum Python
- Citizen code python solution - Forum Python
- Python par la pratique : 101 exercices corrigés pdf - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
3 réponses
Bonjour,
Le principale problème est que tu fais des turtle.onkeypress() alors que le programme est en train de tourner. Il faut les faire une fois pour toute avant de lancer turtle.mainloop().
Ensuite, ta fonction deplacer ne semble pas cohérente avec ta matrice.
Voici à quoi ça pourrait ressembler :
ZONE_PLAN_MINI = (-240, -240) # Coin inférieur gauche de la zone d'affichage du plan
ZONE_PLAN_MAXI = (50, 200) # Coin supérieur droit de la zone d'affichage du plan
POINT_AFFICHAGE_ANNONCES = (-240, 240) # Point d'origine de l'affichage des annonces
POINT_AFFICHAGE_INVENTAIRE = (70, 210) # Point d'origine de l'affichage de l'inventaire
# Les valeurs ci-dessous définissent les couleurs des cases du plan
COULEUR_CASES = 'white'
COULEUR_COULOIR = 'white'
COULEUR_MUR = 'grey'
COULEUR_OBJECTIF = 'yellow'
COULEUR_PORTE = 'orange'
COULEUR_OBJET = 'green'
COULEUR_VUE = 'wheat'
COULEURS = [COULEUR_COULOIR, COULEUR_MUR, COULEUR_OBJECTIF, COULEUR_PORTE, COULEUR_OBJET, COULEUR_VUE]
COULEUR_EXTERIEUR = 'white'
# Couleur et dimension du personnage
COULEUR_PERSONNAGE = 'red'
RATIO_PERSONNAGE = 0.9 # Rapport entre diamètre du personnage et dimension des cases
POSITION_DEPART = (0, 1) # Porte d'entrée du château
# Désignation des fichiers de données à utiliser
fichier_plan = 'plan_chateau.txt'
fichier_questions = 'dico_portes.txt'
fichier_objets = 'dico_objets.txt'
# importation du module turtle
import turtle
# Definitions des fonctions utilisées
def lire_matrice(fichier):
"""Transforme un fichier texte sous sa forme matricielle"""
matrice = []
f = open(fichier)
for i in f:
matrice.append([int(x) for x in i.split()])
return matrice
def calculer_pas(matrice):
"""Calcule la dimension à donner aux cases pour que le plan tienne dans le zone de la fenêtre turtle"""
nbre_cases_y = 440 / len(matrice) # hauteur du rectangle
nbre_cases_x = 290 / len(matrice[0]) # largeur du rectangle
if nbre_cases_y < nbre_cases_x:
pas = nbre_cases_y
else:
pas = nbre_cases_x
return pas
def coordonnees(case, pas):
"""Calcule les coordonées du coin inférieur gauche d'une case définie par ses coordonnées"""
coo = (-240 + case[1] * pas, (200 - pas) - case[0] * pas)
return coo
def tracer_carre(dimension):
"""Trace un carré de côté dimension"""
turtle.setheading(0)
turtle.down()
turtle.forward(dimension)
turtle.left(90)
turtle.forward(dimension)
turtle.left(90)
turtle.forward(dimension)
turtle.left(90)
turtle.forward(dimension)
turtle.left(90)
def tracer_case(case, couleur, pas):
"""Trace une case en fonction du couple de coordonnées d'une case, une couleur et un pas"""
turtle.setheading(0)
turtle.up()
turtle.speed('fastest')
turtle.tracer(0)
turtle.goto(case)
turtle.down()
turtle.fillcolor(couleur)
turtle.pencolor(couleur)
turtle.begin_fill()
tracer_carre(pas)
turtle.end_fill()
turtle.up()
def afficher_plan(matrice):
"""Affiche le plan du château"""
for x in range(len(matrice)):
for y in range(len(matrice[0])):
pas = calculer_pas(matrice)
case = (x, y)
case = coordonnees(case, pas)
j = matrice[x][y]
if j == 0:
couleur = 'white'
elif j == 1:
couleur = 'grey'
elif j == 2:
couleur = 'yellow'
elif j == 3:
couleur = 'orange'
elif j == 4:
couleur = 'green'
else:
couleur = 'white'
tracer_case(case, couleur, pas)
def deplacer(matrice, position, mouvement):
"""Fonction qui donne la nouvelle coordonée d'une case après un certain mouvement."""
nv_position = (position[0] + mouvement[0], position[1] + mouvement[1])
if matrice[nv_position[0]][nv_position[1]] != 0:
print(f"!!", position, matrice[position[0]][position[1]], "-->", nv_position, matrice[nv_position[0]][nv_position[1]])
nv_position = position
else:
print("mv", position, "-->", nv_position)
return nv_position
def deplacer_gauche():
"""Fonction qui déplace le personnage vers la gauche"""
global matrice, position, pas
mouvement = (0, -1)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
dessine_point(coordonnees(nv_position, pas))
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
def deplacer_droite():
"""Fonction qui déplace le personnage vers la droite"""
global matrice, position, pas
mouvement = (0, 1)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
dessine_point(coordonnees(nv_position, pas))
position = nv_position
def deplacer_haut():
"""Fonction qui déplace le personnage vers le haut"""
global matrice, position, pas
mouvement = (-1, 0)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
dessine_point(coordonnees(nv_position, pas))
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
def deplacer_bas():
"""Fonction qui déplace le personnage vers le bas"""
global matrice, position, pas
mouvement = (1, 0)
nv_position = deplacer(matrice, position, mouvement)
if position == nv_position:
pass
else:
dessine_point(coordonnees(nv_position, pas))
tracer_case(coordonnees(position, pas), couleur, pas)
position = nv_position
def dessine_point(coo):
"""Fonction qui dessine le perssonage, ici un point."""
global pas
turtle.setheading(0) # Tourne la tête de la tortue vers la droite
turtle.up()
turtle.goto(coo)
turtle.forward(pas / 2)
turtle.left(90)
turtle.forward(pas / 2)
turtle.down()
turtle.dot(0.9 * pas, COULEUR_PERSONNAGE)
# Attribution des valeurs 'invariables'
matrice = lire_matrice('plan_chateau.txt')
pas = calculer_pas(matrice)
position = (0, 1)
couleur = 'white'
# Corps du programme
afficher_plan(lire_matrice('plan_chateau.txt')) # Affiche le plan du chateau
dessine_point(coordonnees(position, pas)) # Affiche le personnage à sa position de départ.
turtle.listen() # Déclenche l’écoute du clavier
turtle.onkeypress(deplacer_gauche, "Left") # Associe à la touche Left une fonction appelée deplacer_gauche
turtle.onkeypress(deplacer_droite, "Right")
turtle.onkeypress(deplacer_haut, "Up")
turtle.onkeypress(deplacer_bas, "Down")
turtle.mainloop() # Place le programme en position d’attente d’une action du joueur
Bonne chance
Bonjour
Ceci ne serait-il pas un exercice provenant de l'ULB à Bruxelles ?
Si oui je vous rappelle qu'il y a des restrictions de publication sur ces lignes de code.
Bàv