\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{a4,graphicx}
\usepackage{indentfirst,fancyhdr}
\usepackage[rdkeywords,index]{listings}
\setlength{\textwidth}{18cm}
\setlength{\textheight}{24cm}
\setlength{\hoffset}{-2.5cm}
\setlength{\voffset}{-2.5cm}
\lhead{1ere Candidature Informatique (Groupe 5): Projet 6}
\chead{}
\rhead{Henry Ledoux}
\lfoot{\thepage}
\cfoot{}
\rfoot{7 Décembre 2001.}
\addtolength{\headheight}{14pt}
\pagestyle{fancy}
\begin{document}
\lstset{language=c++,basicstyle=\small,commentstyle=\itshape,stringstyle=\ttfamily,stringspaces=false}
\title{Projet 5: Combat naval}
\author{Henry Ledoux}
\date{7 Décembre 2001}
\maketitle
\section*{Problème}
Il est demandé de réaliser une implémentation en C++ d'un jeu de combat naval humain contre ordinateur.
L'ordinateur choisis une grille parmis une panoplie prédéfinie, tandisque l'utilisateur doit entrer l'emplacement de ses 5 bateaux (respectivement de 5, 4, 3, 3 et 2 cases).
L'ordinateur doit controler l'emplacement de chacun des bateaux de l'utilisateur avant de valider la grille.

A chaque tour de jeu, l'utilisateur entre les coordonées du point ou il veut tirer, l'ordinateur lui choisis une case au hasard jusqu'a ce qu'il touche un bateau,
il cherche ensuite autour du point qu'il a touché, et enfin bombarde dans les deux directions.

La partie se termine lorsque tous les bateaux du joueur ou de l'ordinateur sont touchés.

\section*{Résolution}

Pour y parvenir de façon simple, on crée principalement trois classes, une classe JoueurHumain, qui s'occupe de gérer le jeu de l'utilisateur et son interface;
une classe JoueurVirtuel, qui elle s'occupe du jeu de l'ordinateur, elle contiendra le même type de fonctions, mais avec un contenu différent car les coups joués seront choisis par l'ordinateur.
La troisieme classe est la classe jeu, qui appelle successivement ces fonctions et échange les "coups" entre l'utilisateur et l'ordinateur. Elle joue en quelque sorte le role d'arbitre.

Les classes Joueur contiennent comme données les deux plans de jeu: l'un contenant les bateaux du joueur et les coups destinés à ceux-ci, l'autre contenant uniquement les coups tirés contre l'adversaire,
et un vecteur d'entiers de longueur 5, contenant le nombre de cases restantes pour chaque bateau, ceci afin de permettre de vérifier facilement si un bateau est coulé ou pas. Ce vecteur est aussi utilisé lors du placement des bateaux
(dans le cas du joueur humain) car il est initialisé à la longueur de départ des bateaux et n'est pas encore modifié.

Ces classes contiennent diverses méthodes leur permettant de communiquer:

- \lstinline!tir(int &pos_x, int &pos_y)!qui renvoie par référence le coup choisi par l'un ou l'autre camp; 

- \lstinline!int recevoir_tir(int pos_x, int pos_y)! qui prends en parametre les coordonées du coup tiré et reretourne un entier qui représente le résultat (0 touché, 1 coulé, 2 a l'eau);

- \lstinline!void donner_resultat(int result, int pos_x, int pos_y)! sert à informer le tireur du résultat de son coup et enfin

- \lstinline!bool is_ended()! qui renvoie {\itshape true} lorsque le joueur a perdu.

Toutes ces fonctions sont appelées a chaque tour par un élément de la classe Jeu selon l'exemple suivant:

\begin{lstlisting}{}
int pos_x, pos_y, res;
User.tir(pos_x, pos_y);
res = Machine.recevoir_tir(pos_x, pos_y);
User.donner_resultat(res, pos_x, pos_y);
\end{lstlisting}{}
\section*{Vérifications}

Afin de vérifier le bon fonctionnement du programme, il a falu reproduire certains cas limites, principalement pour ce qui est du controle de l'emplacement des bateaux de l'utilisateur, et de la stratégie de l'ordinateur.

Par exemple, pour le controle des emplacements, il a falu tester l'entrée de bateaux en diagonale, le long de chaque bord, de bateaux l'un contre l'autre. Pour la stratégie de l'ordinateur,
les premiers tirs étant en partie aléatoires, il faut réessayer de facon a obtenir que le bateau soit touché sur un bout, ou encore que le bateau touché sois sur un bord du jeu.

Tous ces tests se sont avérés positifs.

\section*{Mode d'utilisation du programme}

Lors de l'affichage des plans de jeu, la grille de gauche représente les bateaux de l'utilisateur avec les coups provenants de l'ordinateur, celle de droite représente les coups tirés par l'utilisateur.

En premier lieu, l'ordinateur demande d'entrer les extrémités de chacun des bateaux. Il faut entrer la lettre représentant la ligne suivie d'un numéro de 1 à 10 représentant la collonne.
Si les positions entrées sont permises, l'ordinateur affichera les grilles avec le premier bateau placé, sinon il redemande les coordonées du bateau jusqu'à ce qu'elles soient correctes.

Une fois cette premiere étape terminée, il faut entrer de la meme maniere (lettre puis chiffre) les coordonées du point où tirer, l'ordinateur affiche ensuite le résultat du tir de l'utilisateur et
de son tir a lui, modifie les grilles et affiche le résultat a l'écran.

A la fin de la partie, l'ordinateur affiche un message désignant le gagnant.

\section*{Le code}
\lstinputlisting{projet5.cpp}



\end{document}
