Projet JEU DE GUERRE
1.1. Contraintes
Langage de programmation : C++
1.2. Groupes
- Groupe 1: EL MARTI PIerre, DIALLO Ibrahima Bano
- Groupe 2: CHAOUCHI Salah, BOULGHALEGH Oussama
- Groupe 3: OUSSET Clément, CAMUS Firmin
- Groupe 4: CERNOT Karelle, CHAIGNE Alexandre
- Groupe 5: CHERRE Antonin, COJUCARI Daniel
1.3. Sujet
On dispose d'un plateau de jeu de 112 cases réparties sur 8 lignes par 14 colonnes.
Deux joueurs disposent initialement de 8 unités de combat composées de 3, 5, 7 ou 10 soldats qui vont s'affronter :
- 2 unités à 3 soldats
- 2 unités à 5 soldats
- 2 unités à 7 soldats
- 2 unités à 10 soldats
Soit un total de 50 soldats pour chaque joueur.
Au début, les unités de chaque joueur sont positionnées aléatoirement soit du côté droit (joueur 2, colonnes 10 à 14), soit du côté gauche (joueur 1, colonnes 1 à 5).
Le gagnant est le joueur qui possède le plus de soldats au bout de 100 tours de jeu ou celui qui réussit à éliminer toutes les unités de son adversaire en moins de 100 tours.
Chaque unité de combat se déplace en restant bien entendu sur l'aire de jeu :
- de une à trois cases sur l'horizontale ou la verticale
- de deux cases sur les diagonales
Cela donne les 16 déplacements autorisés suivants :
...|...
.\.|./.
...|...
---*---
...|...
./.|.\.
...|...
On identifie les unités par des numéros :
- 1 à 8 pour le joueur 1
- 9 à 16 pour le joueur 2
Les unités se déplacent en utilisant les coordonnées (y,x) :
- y variant de 1 à 8
- x variant de 1 à 14
les règles d'engagement sont les suivantes :
- R1 (fusion) : si les soldats d'un joueur se déplacent sur une case où se trouvent des soldats du même joueur, alors on fusionne les unités : on ne garde qu'une seule unité composée de la somme des soldats des deux unités
- R2 (attaque 1) : si les soldats d'un joueur se déplacent sur une case où se trouvent des soldats du joueur adverse,
celui qui gagne est celui qui possède le plus de soldats dans son unité mais il perd la moitié du nombre de soldats du
joueur adverse. Par exemple si j'ai 20 soldats et que mon adversaire a 15 soldats alors, il perd son unité, je garde la
mienne mais elle n'est plus composée que de $20 - (15 / 2) = 20 - 7 = 13$ soldats
- R3 (attaque 2) : si il y a le même nombre de soldats chez les deux adversaires les deux unités sont supprimées pour
chaque joueur
1.4. Spécificités
Pour ce jeu, on va opposer un être humain à l'ordinateur et on réalisera un tournoi qui verra chaque équipe s'affronter. On établira un classement en fonction du nombre de victoires.
On vous demande :
- de mettre en place des structures de données et fonctions communes à tous les groupes de manière à pouvoir réaliser une compétition entre groupes de projet
- de développer une fonction de jeu pour l'ordinateur qui prendra les mêmes paramètres
pour tous les groupes de projet et retournera l'unité à déplacer et la case de destination à partir d'une situation de jeu
- de tester que la fonction de jeu pour l'ordinateur fonctionne correctement
Il n’est pas nécessaire de développer une interface graphique.
1.5. Implantation
1.5.1. Modules
On va utiliser trois modules / fichiers comme suit :
- jeu.cpp qui contiendra les fonctions
liées au fonctionnement du jeu
- appli.cpp qui sera le programme
principal
- ia<N>.cpp où $N$ est le numéro de
votre groupe de projet, qui donne une intelligence artificielle pour
jouer
1.5.2. Structures de données
On va utiliser plusieurs structures de données :
- une Unité de soldats est composée de plusieurs champs : identifiant,
position sur le plateau de jeu (x,y), nombre de soldats
- une Armée se compose de 8 unités et correspond à un joueur
- le plateau de jeu se compose de 8 lignes de 14 colonnes de pointeurs
sur des unités ou un pointeur nul si il n'y a pas d'unité
- le jeu se compose du plateau ainsi que des armées
1.5.3. Fonctions à implanter
Pour jeu.h et jeu.cpp:
#pragma once
#include <iostream>
#include <iomanip>
using namespace std;
const int MAX_JOUEURS = 2;
/**
* Définition d'un type pour les joueurs
*/
typedef enum {
JOUEUR_1 = 0,
JOUEUR_2 = 1
} type_joueur;
/**
* Définition d'un type pour la stratégie de déplacement
* pour l'IA
*/
typedef enum { FUSION = 0,
ATTAQUE,
FUITE,
IA1,
IA2
} type_strategie;
/**
* Unité de soldats
*/
typedef struct {
// indique si l'unité est toujours en jeu
bool valide;
// identifiant d'unité : 1 à 8 pour joueur 1, 9 à 16 pour joueur 2
int id;
// indique à quel joueur appartient l'unité
type_joueur appartient_a;
// position sur le plateau de jeu
int x, y;
// nombre de soldats
int soldats;
// stratégie utilisée par l'IA
type_strategie strategie;
} type_unite;
/**
* Nombre d'unités par joueur
*/
const int MAX_UNITES_PAR_JOUEUR = 8;
/**
* Une armée représente les unités détenues par un joueur
*/
typedef struct {
type_unite unites[ MAX_UNITES_PAR_JOUEUR ];
} type_armee;
const int PLATEAU_MAX_LIGNES = 8;
const int PLATEAU_MAX_COLONNES = 14;
#define unite_vide nullptr
/**
* Type Jeu composé
* d'un plateau de jeu avec pointeurs sur unités
* des unités de chaque joueur
*/
typedef struct {
// Unités pour chaque joueur
type_armee armees[ MAX_JOUEURS ];
// Plateau de jeu
type_unite *plateau[ PLATEAU_MAX_LIGNES ][ PLATEAU_MAX_COLONNES ];
// joueur qui doit jouer
type_joueur joueur;
// tour de jeu
int tour;
} type_jeu;
void cout_red( string s );
void cout_green( string s );
void cout_blue( string s );
/**
* Initialiser le jeu :
* - créer les armées de chaque joueur et positionner
* les unités dans chaque camp respectif
* - mettre le nombre de tour à 1
* - choisir aléatoirement le joueur qui commencera
*/
void jeu_initialiser( type_jeu& jeu );
/**
* Afficher le plateau de jeu et éventuellement les armées
* de chaque joueur
*/
void jeu_afficher( type_jeu& jeu );
/**
* Indique si le jeu est terminé, càd :
* - le nombre de tours est supérieur à 100
* - ou l'un des joueurs ne peut plus jouer
*/
bool jeu_est_termine( type_jeu& jeu );
/**
* Indique si un déplacement est valide pour le joueur 'joueur'
* l'unité d'identifiant 'u_id' vers la position (y,x)
*/
bool jeu_deplacement_valide( type_jeu& jeu, int u_id, int y, int x );
/**
* Joue le déplacement pour le joueur 'joueur'
* l'unité d'identifiant 'u_id' vers la position (y,x)
*/
void jeu_deplacement_jouer( type_jeu& jeu, int u_id, int y, int x );
void jeu_tour_suivant( type_jeu& jeu );
typedef enum {
J1 = 1,
J2,
MATCH_NUL,
AUCUN
} type_gagnant;
/**
* indique si le joueur 1 ou le joueur 2 est gagnant ou si il y a
* match nul (autant de soldat dans chaque camp, ou si on est dans
* AUCUN de ces cas de figure
*/
type_gagnant jeu_possede_gagnant( type_jeu& jeu );
Pour appli.cpp :
#include <iostream>
using namespace std;
#include "jeu.h"
int main() {
type_jeu jeu;
jeu_initialiser( jeu );
while (!jeu_est_termine( jeu )) {
jeu_afficher( jeu );
if (jeu.joueur == JOUEUR_1) {
cout << "Tour " << jeu.tour << "/100, joueur 1" << endl;
} else {
cout << "Tour " << jeu.tour << "/100, joueur 2" << endl;
}
int u, y, x;
while (true) {
cout << "(unite,y,x) ? ";
cin >> u >> y >> x;
if (jeu_deplacement_valide( jeu, u, y, x)) break;
}
jeu_deplacement_jouer( jeu, u, y, x);
jeu_tour_suivant( jeu );
}
type_gagnant gagnant = jeu_possede_gagnant( jeu );
string labels[] = { "Joueur 1", "Joueur 2", "Match nul" };
cout << "gagnant = " << labels[ gagnant ] << endl;
return EXIT_SUCCESS;
}
Pour ia0.h et ia0.cpp :
#pragma once
#include "jeu.h"
/**
* Déplacement d'une unité
*/
typedef struct {
int x_initial, y_initial;
int x_final, y_final;
type_unite *unite;
} type_deplacement;
/**
* Intelligence artificielle qui détermine quelle unité déplacer
* d'une position initiale vers une position finale
*/
void ia( int tour, type_jeu& jeu, type_deplacement& deplacement );
1.6. Tournoi
1.6.1. Règles
Chaque groupe doit proposer un fichier C qui comporte une fonction qui retourne le prochain coup à jouer.
Chaque groupe affronte un adversaire 10 fois et on comptabilise le nombre de victoires, défaites ou matchs nuls.
Si le code fourni par un groupe :
- gènère une erreur qui fait se terminer le programme
- ne donne pas de solution dans un temps raisonnable (2 minutes maximum)
- donne un coup non jouable
alors la partie est considérée perdue par ce groupe.
1.6.2. Résultats
1 |
- |
- |
- |
2 |
- |
- |
- |
3 |
- |
- |
- |
4 |
- |
- |
- |
5 |
- |
- |
- |
Résultats du tournoi