\documentclass[twocolumn,a4paper]{article}
\usepackage{french,tp}
%\advance\topmargin -1cm
%\advance\textheight 1cm
%
%\advance\textheight -1cm
%\divide\textheight 2

\begin{document}

\begin{header}
\large Sixième TP (et quelques suivants)
\\
\Huge Pac Man
\end{header}

Il s'agit de construire, petit à petit, les
éléments d'un jeu de Pac Man.
Dans un terrain avec obstacle, se déplace un
bonhomme que pousuivent des monstres.
Le score est fonction du nombre de {\em fruits}
mangés par le bonhomme avant de mourir.

NB : on peut réaliser la 5ème étape ci-dessous
avant les 2ème, 3ème et 4ème.

\subsection*{Étape 1. Terrain de jeu}
Le terrain de jeu est par exemple stocké dans
un tableau 10x10, un élément du tableau pour chaque
case du terrain.
Pour plus de facilité, on dessinera le dessin en "mode
texte".
On représente les cases vides avec des espaces et 
les obstacles avec des 'X'.
Le tableau sera donc une variable {\tt Terrain} de type
{\tt ARRAY[1..10,1..10] OF CHAR}.

On fera deux procédures, qu'on testera ensemble,
dans un petit programme :
\begin{itemize}
\item Initialisation.
On remplit la variable contenant le terrain avec des espaces,
sauf pour les bords qui sont des 'X'.
\item Affichage.
On affiche le contenu du terrain de jeu, ligne par ligne.
On pourra utiliser {\tt ClrScr} pour effecer l'écran.
\end{itemize}

\subsection*{Étape 2. Le bonhomme}
Il faut pouvoir repérer la position du bonhomme
et le déplacer lorsque le joueur en donne l'ordre.

Il y a deux façon de repérer la position du bonhomme :
en utilisant deux variables pour ses coordonnées $(x,y)$ ;
ou bien en donnant la valeur 'B' (par exemple) à la
case où il est.
Réfléchir aux avantages et inconvénients de ces deux méthodes.

Il est compliqué de programmer l'utilisation de la souris.
Nous déplacerons donc le bonhomme au clavier.
On utilise pour cela la fonction {\tt ReadKey} qui
attend qu'une touche soit enfoncée et en donne la valeur.

\begin{itemize}
\item 
Modifier l'initialisation pour y rajouter le bonhomme
dans sa position initiale.
\item
Modifier l'affichage pour afficher le bonhomme (sous la forme d'un B
par exemple).
\item
Faire une procédure qui déplace le bonhomme en fonction
de la touche qui a été saisie au clavier.
\end{itemize}

Faire ensuite un programme dont on sort avec {\tt q} ou {\tt Ctrl-Break}
qui fonctionne comme suit :
\begin{tabbing}
\quad \= Boucle : \= Saisie d'une touche \kill
\> Initialisation \\
\> Affichage \\
\> Boucle : \> Saisie d'une touche \\
\>          \> Déplacement du bonhomme \\
\>          \> Affichage \\
\end{tabbing}

\subsection*{Étape 3. Les obstacles}
Il faut que le déplacement du bonhomme ne puisse
lui faire franchir les obstacles.

\begin{itemize}
\item 
Modifier l'initialisation pour y rajouter des murs
aléatoirement au milieu du terrain.
Éventuellement, réfléchir à la construction automatique d'un
labyrinthe (difficile).
\item
Modifier la procédure de déplacement pour ne pas pouvoir
pénétrer dans les murs.
\end{itemize}

\subsection*{Étape 4. Les fruits}
Rajouter des cases valant des points (les fruits).

Tester le passage du bonhomme sur une des ces cases.
Faire alors disparaître le fruit et augmenter le score.

\subsection*{Étape 5. Temps réel (I)}
Modifier la répartition des fruits sur le
terrain : apparition et disparition aléatoire
en temps réel.

Le programme se limite ici à l'affichage du
terrain de jeu en temps réel.
Chercher à minimiser les lenteurs d'affichage.

\subsection*{Étape 6. Temps réel (II)}
Mélanger les deux étapes précédentes
pour faire un déplacement du bonhomme
en temps réel, avec apparition et
disparition des fruits, dans un terrain
pour le moment sans monstres.
On utilisera en particulier {\tt KeyPressed}.

\subsection*{Étapes 7 et suivantes. Avec des monstres}
Rajouter un monstre (puis plusieurs) se déplaçant
à faible vitesse et tuant le bonhomme s'il arrive
au contact.

Faire plusieurs niveaux de jeu avec des vitesses
variables, ou autres idées.

Penser aux graphismes...

\bigskip
\hrule
\subsection*{L'unité {\tt Crt}}

\bgroup\small
En Turbo Pascal, il y a quelques procédures ou fonctions
pré-définies (comme {\tt WriteLn}) qu'on peut utiliser
dans tous les programmes.
Le mot clé {\tt USES} permet d'ajouter de nouvelles
procédures et fonctions, qui sont définies dans ce
qu'on appelles une {\em unité}.
L'unité {\tt Crt} définit ainsi des utilitaires pour
accéder de façon plus efficace au clavier et à l'écran.
L'unité {\tt Graph} sert pour le graphisme.

Prototypes issus de l'unité {\tt Crt} :
\\{\tt PROCEDURE ClrScr;}\quad Pour effacer l'écran.
\\{\tt FUNCTION ReadKey : CHAR;}\quad Valeur de la touche pressée.
\\{\tt FUNCTION KeyPressed : BOOLEAN;}\quad Savoir si une touche a été pressée.

\egroup

\end{document}
