Projet "Labyrinthe"

Fermé
Hugo7700 Messages postés 8 Date d'inscription samedi 25 avril 2020 Statut Membre Dernière intervention 31 octobre 2020 - Modifié le 23 nov. 2022 à 15:59
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 23 nov. 2022 à 16:30

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 !

A voir également:

3 réponses

Hugo7700 Messages postés 8 Date d'inscription samedi 25 avril 2020 Statut Membre Dernière intervention 31 octobre 2020 2
Modifié le 23 nov. 2022 à 15:57

.

2
madmyke Messages postés 52792 Date d'inscription dimanche 20 janvier 2008 Statut Modérateur Dernière intervention 22 avril 2024 12 047
Modifié le 18 nov. 2022 à 13:38

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

0
ya des parentheses que tu dois retirer et sa devrai marcher
2
Pouvez-vous spécifier la ligne où les parenthèses doivent être retirées ?
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 24 nov. 2022 à 18:10

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

0