\documentclass[11pt]{article}
\usepackage[french]{babel}
\usepackage[latin1]{inputenc}
\usepackage{graphics}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%            dimension de la feuille                          %%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\setlength{\textwidth}{16cm}
\setlength{\textheight}{24cm}

 \setlength{\marginparwidth}{0cm}
 \setlength{\marginparsep}{0cm}
 \setlength{\oddsidemargin}{0cm}
 \setlength{\evensidemargin}{0cm}
 \setlength{\headheight}{2cm}
 \setlength{\topmargin}{0cm}
 \setlength{\topskip}{1cm}
 \setlength{\headsep}{0cm}
 \setlength{\footskip}{1,5cm}
 \setlength{\voffset}{-0.5cm}
 \setlength{\hoffset}{0cm}

\title{IF 142}
\date{}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{epsfig}

\begin{document}
\maketitle

\section{Serpent}
On s'int\'eresse \`a un autre jeu bien connu.

Dans ce jeu, une entit\'e repr\'esentant un serpent se d\'eplace sur
votre \'ecran. Le joueur ne peut agir que sur sa direction, en
appuyant sur une des touches H (haut), B (bas), G (gauche), D
(droite). Lorsqu'une direction est choisie, le serpent la suit au
cours du temps, jusqu'\`a ce qu'une nouvelle direction lui soit
indiqu\'ee. Il est donc possible que le serpent vienne rencontrer un
des bords de l'\'ecran. Il a alors perdu.

Au cours d'une phase normale de jeu, le corps du serpent a une taille
stable plut\^ot importante, et son d\'eplacement se fait de proche en
proche : si on d\'ecompose son corps en une suite de pixels, le
premier d'entre eux \'etant sa t\^ete ; lors du mouvement la t\^ete va
avancer d'un pixel dans la direction courante, puis chaque pixel du
corps va prendre la place de celui qui le pr\'ec\`ede : le second
venant prendre la place de la t\^ete, le troisi\`eme la place du
second etc... le dernier la place de l'avant dernier.


\begin{center}\epsffile{serpent.eps}\end{center}


Lorsque le serpent rencontre certains obstacles pr\'esents sur
l'\'ecran, son corps s'allonge, et l'obstacle r\'eappara\^it ailleurs. Le
joueur a pour but de ramasser le plus possible de ces obstacles.

Le corps s'allongeant, il devient possible que le joueur guide la t\^ete
du serpent vers un emplacement d\'ej\`a occup\'e par une partie de son
corps. On choisit alors de faire perdre le joueur.


\begin{enumerate}

\item (1 point) D\'efinir un type serpent (et ses sous types) comme
\'etant une structure contenant son corps sous la forme d'une liste,
et sa direction.


\item (1 point) On suppose qu'on dispose des fonctions et proc\'edures
suivantes :\\

{\bf bool boom(serpent s)} qui retourne vrai si le serpent rencontre
un obstacle qui le fait perdre\\ 
{\bf char get\_key\_pressed()} qui permet de savoir quelle est la
derni\`ere touche appuy\'ee\\ 
{\bf void avance\_serpent(serpent s)} qui s'occupe du d\'eplacement du serpent\\ 

Ecrire un programme {\bf main} qui int\`egre ces fonctions et
proc\'edures, et qui forme la partie principale du jeu.

\item (1 point) Ajouter des informations \`a votre programme pour
int\'egrer des limites pour le cadre de l'\'ecran et ecrivez la fonction
{\bf boom}, qui teste si le serpent rencontre le cadre, ou une partie
de son corps.

\item (1 point) Ecrire une version de {\bf avance\_serpent}, conforme \`a ce qui a
\'et\'e d\'ecrit dans la pr\'esentation.


\item (.. point) On g\`ere \`a pr\'esent le contact du serpent avec
l'obstacle dont il se nourrit pour s'allonger (la pastille). Vous avez
acc\`es \`a des proc\'edures {\bf affiche\_pastille(int x\_pastille,
int y\_pastille)}, et {\bf new\_pastille(int \&x\_pastille,int
\&y\_pastille, serpent s} qui cr\'ee une nouvelle pastille \`a un
endroit libre.\\

Lors du contact avec la pastille tout se passera comme si seule la
t\^ete du serpent avancait, sans que le reste de son corps ne bouge.  Il
faudra tout de m\^eme que le corps du serpent reste coh\'erent et que sa
taille augmente d'une unit\'e.  Modifier votre programme pour prendre en
compte la gestion de la pastille. Il devra toujours y avoir une
pastille pr\'esente \`a l'\'ecran.\\



\item (2 points) On cherche maintenant \`a ameliorer la gestion du
mouvement du serpent.  Tout part de la remarque qu'il est suffisant
d'effacer le bout de la queue du serpent, et d'ajouter une t\^ete,
c'est-\`a-dire ne modifier la liste qui repr\'esente le corps du
serpent qu'\`a ses extr\'emit\'es.\\

D\'efinir un type liste cha\^in\'ee, qui contienne un
pointeur d\'ebut et un pointeur fin, pointant respectivement vers le
d\'ebut et la fin de la liste. Si la fin de la liste repr\'esente la
t\^ete du serpent, et la t\^ete de la liste sa queue, \'ecrire une
nouvelle version de {\bf avance\_serpent}.

\end{enumerate}




\end{document}
