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 l
ecture), 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 e
nregistrement), le script appelle la fonction ecriture()
.