Bonjour,
Je suis confronté à un problème de conception depuis hier soir et j'ai beau retourner le problème dans tous les sens, je ne trouve pas de solutions qui me satisferaient.
Je suis en train de faire une version "personnalisé" du jeux de Go en C++, nous avons donc :
- un contrôleur contenant plusieurs plateaux.
- plusieurs plateaux constitués de plusieurs socles.
- des socles sur lesquels on peut mettre un seul pion sur un socle.
Les pions sont posés par un joueur appartenant à une équipe (4 équipe max. 2 joueur max par équipe).
Un pion appartient à un groupe de pion contenant initialement un seul pion.
Lorsqu'au moins deux groupes appartenant à la même équipes sont côte à côté suite à la pose d'un pion, on fusionne le groupe.
Le groupe pourra par la suite manger un groupe adverse adjacent (si le groupe adverse n'a aucun socle adjacent libre) ou se faire manger.
Mais j'aimerais pouvoir ajouter des règles spéciales pouvant toucher n'importe quel élément cité ci-dessus.
Exemple :
- un pion spécial qui ne pourra jamais être fusionné à un groupe et jamais être mangé
- un contrôleur avec 2 plateau où chaque joueur d'une équipe joue sur un seul plateau chacun.
- un plateau où on ne peut pas poser de pions spéciaux.
- un socle qui, si est libre à la fin du jeux offre non pas 1 pion mais 2.
Tout ceci dans le but d'offrir d'autres perspectives en joueur contre joueur mais aussi pour nous permettre de créer des petites énigmes.
Mais il y a tellement de possibilité que c'en est très complexe.
Dans un sens, j'aimerais faire quelque chose d'assez simple mais en même temps je n'aimerais pas trop être bloqué si jamais je veux rajouter quelque chose.
J'ai déjà penser à quelques simplifications :
- chaque élément (socle/pion...) a une (ou plusieurs) liste d'effet (règles + effets spéciaux).
- un "effet" a un booléen (Activé) permettant de l'activer ou non.
- un "effet" a un pointeur sur l'élément lançant l'effet afin de jouer une animation s'il le faut.
- On peut détruire l'effet en l'enlevant de la liste d'effet de l'élément ( surtout pour les interdictions d'effets sur le plateau).
- On privilégie au maximum la modification d'effet.
ex : un pion spécial interdisant de faire X sur les cases adjacentes, reviendra à un effet de rajout "d'effet interdisant de faire X" sur les socles adjacents.
Les socles transmettent souvent leur effet au pion et le pion transmet souvent son effet au groupe.
Je pense donc à chaque "évènement" transmettre au contrôleur qui regardera dans sa liste "d'effet", qui retransmettra au plateau, qui transmettra au pion à l'origine de l'évènement (ou du socle en cas de pose de pion) qui transmettra aux groupes adjacents.
Mais je compte plus de 5 évènements sachant que certains effets pourront générer d'autres évènements
- pose
- fusion de groupe
- mise en contact d'un groupe adverse
- destruction de groupe
- fin de partie (comptage des points)
L'évènement étant aussi transmit sous forme de numéro d'évènement ainsi qu'un pointeur sur le pion à partir duquel on peut récupérer (et modifier) :
- le joueur qui l'a poser (et par ce biais l'équipe du joueur)
- le groupe auquel il appartient (et par ce biais l'équipe du groupe)
- le socle sur lequel est posé le pion (et par ce biais le plateau auquel le socle appartient et on peut récupérer le contrôleur à partir du plateau).
Ainsi je pense qu'on peut réussir à conserver un maximum de possibilités.
Mais je trouve que c'est assez compliqué...
Surtout qu'au départ, on va pas beaucoup utiliser les éléments avec des effets spéciaux et que ce n'est qu'ensuite que nous rajouterons des pions/socles spéciaux pour les besoins d'une nouvelle énigme ou autre...
J'ai essayé de définir pour chaque élément les types d'effets qu'il pourra produire.
Exemple pour le socle :
- Changer les points lors d'un ajout de pion
- Modifier les effet du pion (notamment pour déclencher un effet lorsque le point est détruit)
Mais soit je me retrouve avec trop de types d'effets, soit je me retrouve uniquement avec des effets faisant varier les points.
Je me demande donc si il n'existe pas de design pattern très pratique pour ce que je veux faire ou si vous aviez des conseils à me donner.
Mon but n'est pas de faire toutes ces choses compliquées tout de suite mais de pouvoir les faire si jamais j'en éprouvait le besoin sans à avoir à réécrire tout le code...
Merci de m'avoir lu,
Neckara