Bien structurer mes classes ? (bis)

Bien structurer mes classes ? (bis) - C++ - Programmation

Marsh Posté le 21-06-2009 à 14:20:54    

Hello,
je suis en train de faire un petit jeu en C++ en console : un Rogue-like. Mon projet à déjà bien avancé, mais je viens de me rendre compte que j'ai fais un truc pas très jolie dans mon code. Et j'aurais besoin de vous pour savoir comment le faire bien.
 
Je vous explique la situation :  
J'ai une classe Donjon qui a comme attribut un tableau à deux dimension de Case. Cela me sert de map dans mon jeu. Les Cases ont comme attribut : char skin (qui est le char affiché à l'écran), bool is_obstacle, et bool is_visible.
 
Je n'ai que 5 types de Case dans mon jeu pour le moment :
Case vide (skin = ' '; is_obstacle = false)
Case porte (skin = '+'; is_obstacle = false)
Case escalier (skin = '>'; is_obstacle = false)
Case horizontale (skin = '-'; is_obstacle = true)
Case verticale (skin = '|'; is_obstacle = true)
Avec is_visible toujours à false à l'initialisation.
 
Pour le moment j'utilise un constructeur Case(char skin, bool is_obstacle), et pour tester le type de la case : char get_skin() { return skin; }
Bref, c'est vraiment mal foutus. Si je veux changer le skin d'un type de case ça me fait plein de modification, et puis c'est pas très jolie...
Comment organiser le code pour avoir plusieurs types de Case ? Faut il utiliser un enum ? De l'héritage ? Autre chose ?
 
Merci d'avance ! :)

Reply

Marsh Posté le 21-06-2009 à 14:20:54   

Reply

Marsh Posté le 21-06-2009 à 15:00:54    

Pattern Flyweight + Pattern Factory

Reply

Marsh Posté le 21-06-2009 à 17:14:57    

Joel F a écrit :

Pattern Flyweight + Pattern Factory


Merci beaucoup pour ta réponse !
N'etant pas très à l'aise avec les Design Pattern, est ce que vous pouvez me confirmer que c'est bien ce genre de chose qu'il faut faire (j'ai juste utilisé Factory) :
 

Code :
  1. public Case {
  2. private:
  3.    char skin;
  4.    bool is_visible;
  5.    bool is_osbtacle;
  6. public:
  7.    Case(char skin, bool is_osbtacle) {
  8.       this->skin = skin;
  9.       this->is_obstacle = is_obstacle;
  10.       is_visible = false;
  11.    }
  12.    char get_skin() {
  13.       return (is_visible)? skin : '.';
  14.    }
  15.    bool get_is_visible() {
  16.       return is_visible;
  17.     }
  18.    bool get_is_obstacle() {
  19.       return is_obstacle;
  20.    }
  21. };
  22. public class CaseFactory {
  23. public:
  24.    Case get_case_empty() {
  25.       return new Case(' ', false);
  26.    }
  27.    Case get_case_door() {
  28.       return new Case('+', false);
  29.    }
  30.    Case get_case_stair() {
  31.       return new Case('>', false);
  32.    }
  33.  
  34.    Case get_case_horizontal() {
  35.       return new Case('-', false);
  36.    }
  37.  
  38.    Case get_case_vertical() {
  39.       return new Case('|', false);
  40.    }
  41. };
  42. main() {
  43.    CaseFactory c;
  44.    Case c1, c2;
  45.    c1 = c.get_case_door();
  46.    c2 = c.get_case_empty();
  47. }


 
?
Et si je veux tester le type de la case, comment faire ? Car c1.get_skin() == '>' c'est moche :/


Message édité par magicpotu le 21-06-2009 à 18:37:34
Reply

Marsh Posté le 21-06-2009 à 18:45:41    

surcharge == pour Case


Message édité par Joel F le 21-06-2009 à 18:46:10
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed