Home (autres pages) Léa Linux TrustOn Me OpenVPN French Linux Doc Project Livre d'OR

Le projet sans nom : serveur de jeu de stratégie

Pour le moment, seul les archives contenant des binaires pour Windows sont disponibles, le temps que j'arrange et commente les sources...

  • Tester l'archive disponible

dernière version: 11 février 2005

Client graphique compilé pour Windows avec Lazarus
Serveur texte compilé pour Windows avec FreePascal

Résumé

Plusieurs langages auraient pu être utilisés pour la conception de ce serveur de jeu : C, C++, Pascal, Java. Tous ces langages disposes d'interpréteur ou de compilateur multiplateformes du moment qu'on laisse de côté des outils "industriels" (Delphi, .NET, Visual C) qui apportent notamment des problèmes de licence, de distribution, etc.

En définitive, comme j'avais commencé à développer le jeu en Pascal, j'ai poursuivi en adaptant le code pour FreePascal. Le code est fortement orienté objet.

Définition des classes

Le serveur doit gérer des listes de créatures, de bâtiments, de champions puis, par joueur, des listes de créatures en cours de recrutement et recrutés, des bâtiments en cours de construction et construits, une liste de champions, etc.

La différence entre un bâtiment de base et un bâtiment en cours de construction, c'est la localisation de ce bâtiment. En effet, un bâtiment de base comporte un ensemble de caractéristiques propres alors qu'un bâtiment en cours de construction possède une position en plus. L'ensemble des autres objets sont de même type, de base, en cours et positionné.

On peut créer une classe ancêtre dont toutes les autres classes pourront dérivées.

Actuellement, cela donne à peu près ceci:


Ma classe de base est la classe "cMobile" :

cMobile = class
	fUID : integer;
	fName : gString;

Beaucoup de classes ne nécessitent pas de nouveaux champs, comme cRace, cClasses, alors que certaines classes déclarent de nouveaux champs en plus :

cAccount = class(cMobile)
	passwd: string;
	last_login: TDateTime;
	sex: char;
	email: string;
	level: Byte;

le point commun entre cMobile et cAccount, c'est que les deux classes possèdent un champ "nom" et un champ "uid" (unique identifier)

les nouveaux champs de la classe cAccount nécessite d'implémenter de nouvelles méthodes (fonctions ou procédures) qui s'occuperont de manipuler ou apporter des traitements à ces nouveaux champs.

Comparons la définition d'un bâtiment à celle d'une créature :

définition d'un bâtiment : pour construire un bâtiment, il faut un certain capital de ressources. Il est associé à une certaine race. Il se construit en un certain nombre de tours. Il peut nécessiter certains autres bâtiments. Il peut avoir certaines caractéristiques (bonus de défense ou d'attaque, bonus d'exploitation de certaines ressources, rayon d'exploitation, etc.). Il peut permettre l'exploitation de certaines ressources. Il peut permettre de recruter un type de créature. Enfin, il a un nom et un identifiant numérique unique (uid)

définition d'une créature : pour recruter une créature, il faut un certain capital de ressources. Il se recrute en un certain nombre de tours. Il est associé à une certaine race.Il peut avoir certaines caractéristiques (défense, attaque, vitesse, vol, empoisonnement, etc.).Enfin, il a un nom et un identifiant numérique unique (uid)

Le premier point commun est le nom et l'identifiant, ils l'héritent tout deux de la classe cMobile. Le second point commun est la définition de certaines caractéristiques. C'est pour cela que j'ai créé une classe spécifique pour gérer tout type de caractéristiques puis que j'ai créé une classe dérivée de cMobile gérant des caractéristiques.

cMobileCaracts = class(cMobile)
	caracts         :cListeCaractsMob;

puis un bâtiment :

cBatiment = class (cMobileCaracts)
        NbToursNec      :smallint;
        RessParTour     :cRessParTour;
        ressNec,                // ressources nécesaires à la constr. par tour
        ressSurTerrain,         // ressources prises sur le terrain
        ressSurJoueur,          // ressources prises sur le capital du joueur
        ressProduites       :cArrayRessources; // ressources ajoutées au capital du joueur

        batNec          :array of boolean;
        raceNec         :cRace;

        fRecruit        :cMobile;

et enfin une créature :

cCreature = class (cMobileCaracts)
        NbToursNec      :byte;
        NbUnits         :longword;
        RessParTour     :cRessParTour;

        ressNec,                       // ressources nécessaires à la constr. par tour
        ressParTour,                   // ressources nécessaires pour maintenir les troupes
        ressProd        :cArrayRessources;   // ressources que la créature peut apporter
        race      :cMobile;

Chaque nouvelle classe apporte son lot de méthode pour gérer les spécifités de chacunes des classes.

Démarrage et initialisation du serveur

Lorsque le serveur démarre, il lit tout un tas de fichiers contenant les informations nécessaires à la définition des principaux objets de base : bâtiments, créatures, champions, caractéristiques, ressources, races, etc.

Le serveur construit une liste de bâtiments à partir du fichier de définition des bâtiments, puis une liste de créatures selon le même principe.

Ensuite le fichier de définition des joueurs est lu et à partir des listes de bâtiments ou de créatures sont créées et associées aux joueurs.

Me contacter | ©2004 Raum
Livre d'OR