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. Ca 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 DLLs, 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 :


