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
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Mot secret python pix ✓ - Forum Python
- Python par la pratique : 101 exercices corrigés pdf - Forum Python
- Exercice python - 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