E. On revient au jeu dans sa globalité▲
Maintenant qu'on a la couche haute, la couche basse et la couche de manipulation des données, on peut écrire le fil directeur du jeu plus en détail :
Gfx *
ma_gui =
new
IrrInterface;
// choix client ou serveur
int
server =
ma_gui->
choose_client_server();
switch
(server){
case
0
:{
// serveur
cout <<
"mode serveur démarré"
<<
endl;
Server s;
// ouvrir la socket
s.open_socket(1000
);
// attendre le client
s.wait_for_client();
// récupérer les données du jeu
Flotte f =
s.get_game_data();
// envoyer les données du jeu au client
s.send_game_data_to_client(f);
// le serveur attend que le client ait positionné ses bateaux
s.wait();
// le serveur positionne ses bateaux sur sa grille
if
(ma_gui->
positionner_bateaux(f)==
1
){
// on souhaite quitter
break
;
}
Essais e;
// début du jeu
// tant qu'il nous reste des bateaux
// et qu'on n'a pas touché tous ceux de l'adversaire
while
(f.get_effectif() >
0
&&
f.get_effectif_depart()-
e.get_effectif_adverse()>
0
){
pair<
int
,int
>
coup =
ma_gui->
choisir_attaque(e,f);
if
(coup==
pair<
int
,int
>
(-
1
,-
1
)) // on quitte
break
;
// traitement du tir
s.attaque(coup, e);
ma_gui->
update(e,f);
// on a gagné
if
(f.get_effectif_depart()-
e.get_effectif_adverse() ==
0
)
break
;
s.defend(&
f,&
e);
ma_gui->
attendre();
ma_gui->
update(e,f);
}
// quelqu'un a perdu, on affiche un écran
if
(f.get_effectif() ==
0
){
ma_gui->
affiche_perdu();
cout <<
"terminé : perdu"
<<
endl;
}
else
if
(f.get_effectif_depart()-
e.get_effectif_adverse() ==
0
){
ma_gui->
affiche_gagne();
cout <<
"terminé : gagné"
<<
endl;
}
break
;
}
case
1
:
// le dual pour le client
// ...
delete
ma_gui;
}
Et il vous suffit de changer la première ligne par l'instanciation d'une autre interface pour avoir tout à fait un autre jeu d'un point de vue graphique. Ensuite pour rendre les deux interfaces vraiment indépendantes, on peut tout à fait les compiler séparément et les utiliser au travers de bibliothèques dynamiques dll/so.
E-I. Fonctionnement du jeu▲
Pour fonctionner correctement, toutes les dll doivent être accessibles depuis l'exécutable. Il faut aussi que les données du jeu soient accessibles. Dans l'archive des sources, ce répertoire est accédé via ../data. Si vous changez l'emplacement de l'exécutable, assurez-vous que ce répertoire est toujours accessible. Au besoin, recompilez les sources avec un autre chemin.
Une partie doit être créée avant qu'un client ne tente de la rejoindre. Ça peut paraître évident, mais ça va mieux en le disant. Si vous jouez sur des réseaux séparés, assurez-vous de rediriger le port utilisé pour faire une redirection de port. Par défaut, le port utilisé est le port 1000.
Le joueur qui rejoint la partie est le premier à placer ses bateaux. Pendant qu'il les place, le serveur est bloqué en attente. Puis c'est au serveur de placer ses bateaux. Le serveur est le premier à jouer.
E-II. Téléchargement▲
Si vous souhaitez juste exécuter le jeu, il vous faut télécharger les DLL, les binaires et les données du jeu. L'archive des sources n'est utile que si vous voulez consulter le code et/ou le modifier. Le code source est distribué sous licence GPL.
E-III. Remerciements▲
Je remercie Julp et fearyourself pour leur relecture et Léon Bérelle, qui m'a permis d'utiliser l'une de ses créations :