TP Pacman

Transcription

TP Pacman
IUT La Rochelle - Dépt R&T
Info 1ème année – Module I3
2011-2012
Laurent Demay
C. Sempé, J. Khamlichi
1ère Partie TP Pacman
TP Pacman : Première partie – déplacement du Pacman
Nous allons commencer dans cette 1ère partie à programmer la gestion du déplacement du pacman dans le labyrinthe
Manipulations préalables
- Exécutez le programme « maj.exe » depuis le site http://demay.iut.fr.free.lr/RT , dossier 1A/Informatique/I3.../Pacman »
pour mettre à jour l’environnement de travail de Python Scripter.
- Téléchargez et décompressez sur votre bureau ou à un autre endroit l’archive « TP Pacman.zip » depuis le site
http://demay.iut.fr.free.lr/RT , dossier « 1A/Informatique/I3…/Pacman »
Vous devez donc avoir un dossier « TP Pacman » de contenu suivant :
 Le fichier « pacman.pyw » qui est le squelette du programme que vous aurez à compléter
 Le fichier « pacman.wld » qui est le « fichier monde » du labyrinthe du pacman
 Le dossier « wxRUR » qui contient la bibliothèque graphique utilisée pour coder le jeu
Le squelette du programme pacman.pyw
- Ouvrez le programme pacman.pyw avec Python Scripter (son extension est pyw car c’est un programme graphique)
Le « squelette » initial est déjà exécutable et créera une simple application sans murs intérieurs.
- Sélectionnez le « moteur Python » distant Wx (menu « Executer / Moteur Python » )
Le programme pacman.pyw utilisant la librairie wxPython, il faut absolument
sélectionner le bon « moteur » sous Python Scripter avant de le lancer
- Lancez le depuis Python Scripter en cliquant sur le bouton
Dans ce mode d’exécution, la fenêtre graphique de l’application pacman reste affichée après la fin du programme
Vous pouvez cliquez sur
pour réinitialiser l’état de la mémoire et fermer cette fenêtre.
- Lancez de nouveau le programme de départ pacman.pyw en cliquant cette fois ci sur le bouton
(External Run)
Le mode « External Run » démarre le programme en dehors de Python Scripter, comme lorsqu’on fait un double-clic.
Cela permet de tester son fonctionnement autonome, mais ne permet pas de contrôler et de comprendre les erreurs
Utilisez alors pour développer la suite le mode d’exécution le plus adapté à vos besoins et à vos tests.
- Reprenez les explications du squelette du programme pacman.pyw sur la feuille annexe fournie en TD
On rappelle le schéma simplifié de l’exécution de la version actuelle (initiale) du programme pacman.pyw :
initialisation
AppPacman = wxRUR.Application(…)
définition des fonctions utilisées
et des variables globales, etc
AppPacman.EventHandler(onKeyEvent=deplacer_pacman)
appui sur
une touche
AppPacman.MainLoop(…)
événement
KeyEvent
AppPacman.ExitMainLoop()
traitement final
deplacer_pacman(KeyEvent)
I - Premières modifications
Utilisez la documentation en annexe de la librairie wxRUR pour apporter les premières modifications suivantes :
1)
Complétez les arguments de la fonction wxRUR.Application(……,……) pour donner un titre à votre application
AppPacman et pour charger le « fichier monde » pacman.wld du labyrinthe dans lequel se déroulera le jeu.
2)
Complétez les arguments de la fonction AppPacman.Robot(…………) pour positionner le
« robot » pacman en position (6,6), orienté vers l’est, et avec l’image (couleur) du pacman
II - Déplacement du pacman
Nous allons compléter la fonction deplacer_pacman(KeyEvent) pour pour déplacer le « robot » pacman d’une case
dans la direction indiquée par une des touches     de gestion du curseur.
La fonction événementielle deplacer_pacman reçoit automatiquement en argument lors de son appel par MainLoop
une « variable d’événement » KeyEvent de type EVT_CHAR qui contient des informations sur l’événement lui-même.
En particulier KeyEvent.GetKeyCode() retourne le code de la touche appuyée (constantes définies dans la librairie
wxRUR) , dont voici quelques valeurs et les touches correspondantes :
wxRUR.WXK_UP : 
1)
wxRUR.WXK_LEFT : 
wxRUR.WXK_DOWN : 
wxRUR.WXK_RIGHT : 
Complétez la fonction deplacer_pacman(KeyEvent) pour déplacer le pacman d’une case dans la direction du
curseur, en évitant de le faire se cogner contre un mur, (on n’effectuera pas de déplacement dans ce cas).
Rq : on n’effectuera pas non plus de déplacement si on appuie sur une autre touche que    ou 
2)
Ajoutez une instruction pacman.set_trace_style(…) juste après la création
du pacman pour définir le type de tracé lors de son déplacement de manière à ce
que celui-ci « marque » chaque case parcourue par un rond marron.
III - Gestion des cases parcourues
Le marquage des cases nous permet connaitre visuellement les cases déjà parcourues, mais nous aurons également besoin
de les mémoriser dans le programme, en particulier pour pouvoir s’arrêter si toutes es 100 cases ont été parcourues, et en
ne comptant qu’une seule fois une case sur laquelle le pacman est repassé.
Pour cela nous allons utiliser une variable globale cases_parcourues de type set (ensemble python) pour mémoriser
sans duplication tous la paire (x,y) de coordonnées des cases visitées (une paire de valeurs = tuple en python).
1) Créez l’ensemble cases_parcourues juste après l’instruction de création du pacman
Avec les coordonnées de quelle case faut-il l’initialiser préalablement ? Faites-le.
2)
Utilisez le cours sur
les set et les tuple
Complétez la fonction deplacer_pacman(KeyEvent) pour rajouter en cas de déplacement du pacman le tuple
des coordonnées de la nouvelle case atteinte dans l’ensemble cases_parcourues ( utiliser pacman.getPos() )
Attention : il faudra modifier la variable globale cases_parcourues depuis la fonction deplacer_pacman …
3)
Complétez alors la fonction deplacer_pacman(KeyEvent) pour vérifier après un déplacement si le pacman n’a
pas parcouru toutes les 100 cases, auquel cas on affichera un message judicieux avec AppPacman.ShowMessage
et on sortira de la boucle événementielle avec l’instruction AppPacman.ExitMainLoop()
IV - Introduction des robots suiveurs
1)
Ajoutez dans le programme juste avant la création du pacman des instructions pour créer 5 variables globales de
type AppPacman.Robot nommées robot1, robot2, …, robot5 de caractéristiques suivantes :
robot1 : bleu clair en position (1,1) tourné vers l'est
robot2 : bleu en position (10,1) tourné vers l’ouest
robot3 : pourpre en position (1,10) tourné vers l'est
robot4 : vert en position (10,10) tourné vers l'ouest
robot5 : gris en position (1,6) tourné vers l'est
2) Définir juste ensuite la liste python les_robots constituée des 5 robots crées précédemment.
3)
Complétez enfin la fonction deplacer_pacman(KeyEvent) pour vérifier après un déplacement du pacman s’il
ne tombe pas sur une case occupée par un des robots de la liste les_robots, auquel cas on affichera un message
approprié de défaite et on sortira de la boucle événementielle.
Rq : en cas d’ambiguïté, la victoire sera considérée comme prioritaire sur la défaite.