<HTML> <HEAD> <TITLE>cstrike</TITLE> </HEAD>  <BODY > <FONT SIZE="-1">Option Programmation Objet Avanc&#233;e <BR> Deuxi&#232;me Semestre 2002-2003 <BR> Projet&nbsp;: Patrick Amar </FONT>  <P> <BR> <BR>  <P> <DIV ALIGN="CENTER"> <FONT SIZE="+3"><B>Projet de programmation objet</B></FONT> <BR> </DIV>  <P> <BR> <BR>  <P>  <H2><A NAME="SECTION00001000000000000000"> Travailler en bin&#244;me&nbsp;: </A> </H2>  <P> Pour ce projet vous allez travailler avec une autre personne. Vous devez bien s&#251;r travailler ensemble&nbsp;: concevoir le programme ensemble, le taper et le mettre au point ensemble sur l'ordinateur. Il n'est pas question que certains fassent le travail, et que d'autres y ajoutent leur nom&nbsp;! Vous ne devrez rendre qu'un ensemble de rapports en indiquant vos noms.  <P>  <H2><A NAME="SECTION00002000000000000000"> Comment rendre les rapports&nbsp;:</A> </H2>  <P> Il faudra rendre un programme&nbsp;: c'est-&#224;-dire plusieurs fichiers que vous devrez m'envoyer par mail &#224; l'adresse suivante&nbsp;: <TT>pa@pc112.lri.fr</TT>. N'envoyez <B>qu'un et un seul</B> mail par bin&#244;me (je vous renverrai un accus&#233; de r&#233;ception).  <P> <BR> <BR>  <B>Utilisez la commande suivante</B> depuis les machines du b&#226;t. 308 pour faire une archive <I> tar compress&#233;e</I> que vous attacherez avec votre mail. On suppose que <I> Toto</I> et <I>Titi</I> sont deux &#233;tudiants bin&#244;m&#233;s  et que les fichiers sont C1.cc C1.h C2.cc et C2.h; bien s&#251;r les noms mentionn&#233;s ici sont des <B>exemples</B>, toute ressemblance avec de vraies personnes serait fortuite !!  <P> <DIV ALIGN="CENTER">  <TT>tar zcvf Toto-Titi.tgz C1.cc C1.h C2.cc C2.h</TT>  </DIV>  <P>  <H2><A NAME="SECTION00003000000000000000"> Les buts de ce projet&nbsp;:</A> </H2> <list> <li>Vous apprendre &#224; &#233;crire un programme &#224; partir de sp&#233;cifications informelles (&#233;nonc&#233; en 	fran&#231;ais). </li> <li>Vous familiariser avec le fait que vos programmes seront <I>r&#233;utilis&#233;s</I> par d'autres 	plus tard; donc &#224; les &#233;crire lisiblement en les <B>commentant</B> judicieusement. </li> <li>Vous entrainer &#224; <B>encapsuler</B> vos donn&#233;es et m&#233;thodes pour obtenir des 	programmes robustes. </li> <li>Vous montrer l'int&#233;r&#234;t de s&#233;parer la partie <B>traitement</B> d'un programme de sa 	partie <B>interface utilisateur</B>. </li> </list>  <P>  <H2><A NAME="SECTION00004000000000000000"> Ce qui vous sera fourni</A> </H2> On vous fournira diverses classes et fonctions C++ permettant l'affichage en 3D avec OpenGL du labyrinthe et des diverses textures.  <P>  <H2><A NAME="SECTION00005000000000000000"> Que devez vous faire dans ce projet&nbsp;?</A> </H2>  <P> On se propose de r&#233;aliser le jeu de type <I>CounterStrike</I> en beaucoup plus simple, avec un affichage 3D lui aussi simplifi&#233;. Le jeu n'est pas en r&#233;seau, le joueur joue contre la machine. Celle-ci anime des personnages de type <I>gardien</I> dont le but est de prot&#233;ger un tr&#233;sor cach&#233; dans une pi&#232;ce du labyrinthe, que vous, le <I>chasseur</I>, essayez de prendre.  <P> Chaque personnage poss&#232;de un capital initial de survie qui est d&#233;cr&#233;ment&#233; &#224; chaque fois qu'il subit une attaque de l'un de ses adversaires. Ce capital est incr&#233;ment&#233; quand le personnage reste un certain temps sans subir de blessure. Le capital initial de chaque type de personnage (gardiens, chasseur) et le temps de r&#233;cup&#233;ration devront &#234;tre des param&#232;tres du programme.  <P> <BR>  <P> Les gardiens peuvent attaquer le chasseur &#224; distance en tirant dessus avec une arme qui tire en ligne droite, et dont le projectile est arret&#233; par un obstacle quelconque (mur, objet, etc.), la cible du gardien doit donc &#234;tre <I>visible</I> pour que le tir ait une chance d'&#234;tre efficace. Pour laisser une chance au chasseur, chaque gardien a un probabilit&#233; de manquer sa cible; cette probabilit&#233; d&#233;pend de l'&#233;tat de sant&#233; du gardien&nbsp;: moins il a de points de vie, plus il tire mal. Le coefficient qui relie l'&#233;tat de sant&#233; d'un gardien &#224; sa capacit&#233; &#224; tirer pr&#233;cis&#233;ment est aussi un param&#232;tre du programme.  <P> <BR>  <P> R&#233;ciproquement, le chasseur peut attaquer les gardiens, il partage avec les gardiens la caract&#233;ristique d'avoir une pr&#233;cision de tir variable avec sont &#233;tat de sant&#233;. Le coefficient n'est pas le m&#234;me que pour un gardien car le tir du chasseur est dirig&#233; par un humain (et est donc bien moins pr&#233;cis que ce que peut faire la machine qui est parfaite!).  <P> <BR>  <P> Le chasseur se d&#233;place dans le labyrinthe dans une direction qui est indiqu&#233;e par la souris et/ou le clavier, c'est le joueur humain qui contr&#244;le compl&#232;tement le chasseur. Par contre, les gardiens sont des incarnations de la machine&nbsp;: ils sont anim&#233;s par une sorte d'instinct artificiel qui les poussent d'une part &#224; <I>prot&#233;ger</I> le tr&#233;sor, et d'autre part &#224; <I>attaquer</I> le chasseur. C'est l'opposition entre ces deux potentiels plus une dose d'al&#233;atoire qui d&#233;cide de leur comportement &#224; chaque instant. Chaque gardien sait exactement o&#249; se trouvent ses cong&#233;n&#232;res et o&#249; est le tr&#233;sor. Un gardien calcule son potentiel de protection en fonction de la distance qui le s&#233;pare du tr&#233;sor, et du potentiel de protection des autres gardiens.  <P> Un gardien va d&#233;cider d'aller &#224; la recherche du chasseur d&#232;s que son potentiel de protection va &#234;tre en dessous d'un certain seuil. Pour &#233;viter que les gardiens se figent &#224; une distance qui &#233;quilibrent leurs potentiels, on va mettre deux seuils&nbsp;: si le potentiel de protection d&#233;passe le seuil haut, le gardien passe &#224; l'attaque, si le potentiel de protection devient inf&#233;rieur au seuil bas, il reste en d&#233;fense. Ces seuils sont des param&#232;tres du programme. Enfin, pour rendre r&#233;aliste le comportement des gardiens, on tirera un nombre al&#233;atoire qui s'ajoutera (ou se retranchera s'il est n&#233;gatif) au potentiel calcul&#233;; cela devrait &#233;viter aux gardiens d'avoir un comportement trop pr&#233;dictible!  <P>  <H2>Le labyrinthe</H2>  <P> Vous devrez r&#233;aliser deux programmes ind&#233;pendants&nbsp;: le programme de jeu proprement dit, et un <I>&#233;diteur</I> de labyrinthe, c'est &#224; dire un filtre qui prend en entr&#233;e une repr&#233;sentation textuelle du labyrinthe (&#224; l'aide des caract&#232;res <TT>+ - |</TT>) et qui la transforme dans la repr&#233;sentation interne du programme de jeu.  <P> Conceptuellement le labyrinthe est en 2D, c'est l'affichage graphique qui va le rendre en 3D, vos personnages &#233;voluent dans un plan o&#249; les murs des pi&#232;ces (ou des couloirs qui ne sont que des pi&#232;ces particuli&#232;res) sont des lignes droites. Le labyrinthe est <I>ferm&#233;</I>, et poss&#232;de deux pi&#232;ces particuli&#232;res&nbsp;:  <BR> <UL> <LI>celle o&#249; le chasseur est plac&#233; initialement, <BR> </LI> <LI>celle o&#249; se trouve le tr&#233;sor. </LI> </UL>  <P>  <H2>Structure du programme</H2>  <P> Pour que votre code soit lisible vous mettrez un gros commentaire au d&#233;but de chaque fichier indiquant &#224; quoi servent les classes qui s'y trouvent, comment elles s'articulent pour constituer le module et &#224; quoi sert ce module. Vous mettrez aussi un petit commentaire en t&#234;te de chaque m&#233;thode indiquant ce qu'elle fait, la signification de chacun de ses arguments, et celle de la valeur de retour. Enfin, mettez un petit commentaire indiquant ce que repr&#233;sente chaque champ de donn&#233;e de vos classes. Veillez aussi &#224; respecter les conventions de nommage qui vous ont &#233;t&#233; indiqu&#233;es dans le cours.  <P> <BR>  <P> C'est &#224; vous de concevoir l'architecture de votre programme de fa&#231;on &#224; ce qu'il ait toutes les qualit&#233;s exig&#233;es d'un bon logiciel&nbsp;: simplicit&#233;, concision, clart&#233;, etc.  <P> Entre autres, commencez par identifier les <I>objets</I> impliqu&#233;s dans le programme, indiquez comment ces objets s'articulent entre eux pour faire ce qu'on vous demande. Parall&#232;lement, commencez &#224; &#233;num&#233;rer les caract&#233;ristiques des ces objets&nbsp;: attributs puis m&#233;thodes, pour identifier leur <I>classe</I>. Ensuite, regardez les relations entre ces classes, peut &#234;tre partagent-elles des caract&#233;ristiques&nbsp;? Vous pourrez impl&#233;menter ces relations avec la d&#233;rivation ou l'utilisation. </BODY> </HTML> 
