Projet Laby (3)

Ce TP a été noté (comme annoncé). Ce n’est pas toujours brillant. Cette note est une variable qui sera ajustée lundi à venir, séance de TPs.

On peut décrire un Labyrinthe à l’aide de 1 et de 0. On suppose que le labyrinthe est « creusé » s’il y a 0.

Partie 1 : tableau à double entrée

À faire n°1 :

Dessiner le labyrinthe représenté par cette grille sur une feuille à carreaux.

# Notre grille initiale "tableau à double entrée"
grille=[[1,1,1,1,1,0,1],
[1,0,0,0,1,0,1],
[1,0,1,0,1,0,1],
[1,0,1,0,0,0,1],
[1,0,1,1,1,1,1]]

Quelle est sa largeur ? Sa hauteur ?

Partie 2 : gestion du tableau et de la souris

On considère le code suivant, dont certaines parties on été effacées :

import pygame
from pygame.locals import *
pygame.init()

largeur, hauteur = 7,5   # dimensions de la grille
taille = 60             # taille d'une case en pixels

fenetre=pygame.display.set_mode((largeur*taille, hauteur*taille))
pygame.display.set_caption("Un labyrinthe depuis un fichier texte ?")

# Notre grille initiale "tableau à double entrée"
grille=[[1,1,1,1,1,0,1],
        [1,0,0,0,1,0,1],
        [1,0,1,0,1,0,1],
        [1,0,1,0,0,0,1],
        [1,0,1,1,1,1,1]]

#fonction permettant l'affichage de la grille, envoyée en argument
def affichage(grille) :
    fenetre.fill((0, 0, 0))

    # ********************
    # partie à compléter *
    # ********************

    pygame.display.flip()

continuer = True

while continuer:

    affichage(grille)

    # Gestion des événements
    for event in pygame.event.get():
        if event.type == QUIT:
            continuer = False
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                print("touche Escape")
                continuer = 0
            else :
                print("autre touche")
        elif event.type == MOUSEBUTTONDOWN: # on a cliqué !
            # le pixel du clic
            (x, y) = event.pos
            print("clic en ("+str(x)+","+str(y)+")")
            # qui correspond à la case de grille en ligne l et en colonne c
            c = 42 # à modifier pour avoir le bon numéro de colonne
            l = 52 # à modifier pour avoir le bon numéro de ligne
            print("case : ("+str(c)+","+str(l)+")")
            # on passe de 0 à 1 ou de 1 à 0

            # ********************
            # partie à compléter *
            # ********************

            # affichage de la grille en console
            print(grille)

pygame.quit()

À faire n°2 :

Compléter le code pour que le clic de souris change la bonne valeur dans grille et donc l’affichage de mur à vide ou de vide à mur.

On a obtenu ceci :

import pygame
from pygame.locals import *
pygame.init()

largeur, hauteur = 7,5   # dimensions de la grille
taille = 60             # taille d'une case en pixels

fenetre=pygame.display.set_mode((largeur*taille, hauteur*taille))
pygame.display.set_caption("Un labyrinthe depuis un fichier texte ?")

# Notre grille initiale "tableau à double entrée"
grille=[[1,1,1,1,1,0,1],
        [1,0,0,0,1,0,1],
        [1,0,1,0,1,0,1],
        [1,0,1,0,0,0,1],
        [1,0,1,1,1,1,1]]

#fonction permettant l'affichage de la grille, envoyée en argument
def affichage(grille) :
    fenetre.fill((0, 0, 0))

    for ligne in range(hauteur):
        for colonne in range(largeur):
            if grille[ligne][colonne] == 1:
                pygame.draw.rect(fenetre, (255, 128, 0), (taille * colonne, taille * ligne, taille, taille), 0)
    pygame.display.flip()

continuer = True

while continuer:

    affichage(grille)

    # Gestion des événements
    for event in pygame.event.get():
        if event.type == QUIT:
            continuer = False
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                print("touche Escape")
                continuer = 0
            else :
                print("autre touche")
        elif event.type == MOUSEBUTTONDOWN: # on a cliqué !
            # le pixel du clic
            (x, y) = event.pos
            print("clic en ("+str(x)+","+str(y)+")")
            # qui correspond à la case de grille en ligne l et en colonne c
            c = x // taille # à modifier pour avoir le bon numéro de colonne
            l = y // taille # à modifier pour avoir le bon numéro de ligne
            print("case : ("+str(c)+","+str(l)+")")
            # on passe de 0 à 1 ou de 1 à 0

            grille[l][c] = 1 - grille[l][c]

            # On aurait pu faire ainsi :
            # if grille[l][c] == 1:
            #    grille[l][c] = 0
            # else :
            #    grille[l][c] = 1

            # affichage de la grille en console
            print(grille)

pygame.quit()

Partie 3 : avec un fichier « carte » – sera repris lundi

À faire n°3 :

Copier ce qui suit dans fichier texte, à enregistrer sous « carte.txt » :

111111111
100000001
111110101
101000101
101010111
100010001
111111111

À faire n°4 :

Écrire une fonction lecture() qui :

  • acceptera comme argument le nom du fichier texte supposé dans le même répertoire que le script,
  • renverra
    • la grille d’entiers (zéro ou un) comme dans le premier code,
    • la largeur et la hauteur de cette grille.

Lors de l’événement « appui sur la touche l » (comme lecture), le script

  • appelle la fonction lecture() et remplace donc la grille par celle lue,
  • rafraîchit la fenêtre en tenant compte de la nouvelle largeur et la nouvelle hauteur.

À faire n°5 :

Écrire une fonction ecriture() qui :

  • acceptera comme arguments
    • le nom du fichier texte à enregistrer dans le même répertoire que le script,
    • la grille à enregistrer, la « hauteur » et la « largeur » de la grille,
  • écrasera le fichier texte éventuellement existant par un fichier contenant des 0 et des 1 par lignes (comme l’exemple fourni) en lisant la grille d’entiers (zéro ou un).

Lors de l’événement « appui sur la touche e » (comme enregistrement), le script appelle la fonction ecriture().

N'hésitez-pas à poser une question, ou faire avancer le schmilblick

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.