C++: Il ne peut en rester qu'un

 

Il s'agit de mettre en place une sorte de jeu de la vie qui, au départ, met en oeuvre plusieurs personnages. A la fin, il n'en reste qu'un seul.
On a donc une grille de type échiquier par exemple. Chaque case de la grille comporte ou non un personnage représenté par un nom (maxi 10 caractères).
 
Chaque personnage se caratérise donc par son nom et par sa force (de 1 à 100).
La force d'un personnage lui est attribuée au hasard lors de sa création (en java, voir une fonction random() dans la class Math il me semble, et en C++, on peut utiliser random de stdlib.h).
 
En cas de rencontre de deux personnages sur une même case, le personnage le plus faible disparait.
En cas de force identique, les personnages se repoussent (ils se déplacent sur une autre case tirée aléatoirement) et une nouvelle force leur est attribuée.
 
A chaque tour, les personnages peuvent se déplacer d'une case dans les quatres sens (haut, bas, gauche ou droite). Quand un personnage atteint le bord, alors, il réapparait de l'autre coté. Le sens du déplacement est tiré aléatoirement à chaque tour pour chaque personnage.
 

Mise en oeuvre

Modélisation informelle

Commencez par réfléchir un peu à la modélisation : déterminez rapidement les classes à mettre en oeuvre, leur dépendances et les mécanismes dynamiques. Tout ca se passe sur le papier : un crayon et une gomme.

Mise en place de la grille

Echauffez vous en mettant en place la grille. On va utiliser une grille alphanumérique réaffichée intégralement à chaque tour par println() en java et une fonction équivalente en C++ (invendable ce jeu!).
 
Chaque personnage est représenté par un nom de 10 caractères maxi. On a donc des cases de 12 caractères de long et 1 caractère de hauteur. Utilisez le '|' pour les colonnes et '-' pour les lignes.

Mise en place de la boucle principale

Pour le jeu, on a une boucle principale qui tourne tant qu'il y a plusieurs personnage. Programmez cette boucle en affichant des chaines aléatoirement dans la grille. On part de 10 chaines et à chaque tour, on enlève une chaine. Ca doit donc s'arrêter tout seul.
 

Les personnages

Développez la classe pour la gestion des personnages et intégrez le tout.
 

Infos techniques

Tirage aléatoire

Pour tirer des nombres aléatoirement, on utilise l'heure pour initialiser le générateur de nombres (avec srand()) et ensuite, on tire des nombres aléatoires avec rand().
Voici un exemple :
 
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
 
 
int un_entier ()
{
        struct timeval tv;
        gettimeofday(&tv, 0);
        return (tv.tv_sec + tv.tv_usec);
}
 
main() {
        srand(un_entier());
        printf("%d %d %d\n", rand(), rand(), rand());
        srand(un_entier());
        printf("%d %d %d\n", rand(), rand(), rand());
        srand(un_entier());
        printf("%d %d %d\n", rand(), rand(), rand());
        srand(un_entier());
        printf("%d %d %d\n", rand(), rand(), rand());
}
 
 
 
Et la trace de 4 exécutions successives:
 
04mv019[58]% ./a.out
1500548188 801330453 77016086
1219496835 1740253164 2090868425
853738774 1837504085 1966998417
248904956 146726236 1366320614
04mv019[59]% ./a.out
1241411942 997601400 181237752
2043223128 1941356024 50734529
2100918774 1144803060 1303196832
437058481 539717776 1790218244
04mv019[60]% ./a.out
1618653391 869090800 1903526411
929289298 560036477 1473667699
982005954 839033719 578714913
394118134 239885785 2143452359
04mv019[61]% ./a.out
2100035670 1168421912 824917877
758135550 2113352815 696026369
807131739 241530529 1942991546
219959477 1789014349 1360345880
04mv019[62]% 
 
 
 

Un exemple pour le nommage des personnages

 
Pour 9 personnages et donc, une matrice de 3x3 au maximum :
 
char * noms [] = { "momo", "bibi", "ursule", "copacabana", "bizu", "toto", "jenbono", "zazou", "voyelle" };
class Matrice {
   Matrice (int n, int m) 
   {
        n_ = n;
        m_ = m;
        int pos = 0;
        mat = new string* [n];
        for (int i = 0; i < n; i++) {
            mat[i] = new string [m];
            for (int j = 0; j < m; j++) {
                char buf[512];
                sprintf(buf, "_%d_%d", i, j);
                *mat[i][j] = noms[pos++] + string(buf);
            }
        }
   }
 
   private:
   string ** mat;
   int n_;
   int m_
};