/PokerGame

Primary LanguageC++MIT LicenseMIT

Projet Poker Game

Exemple

home

Installation

Il faut spécifier --recursive au git clone pour installer le submodule de GoogleTests :

  • git clone https://github.com/codewithjordy/projet---pocker-Salvas21.git --recursive

Si il y a une erreur à propos du submodule lors du git clone, essayer de faire :

  • git submodule update --remote

Si ça marche toujours pas :

  • Essayer d'installer la librairie de GoogleTests manuellement https://github.com/google/googletest.git
  • Sinon me demander je peux prendre le temps de fix le submodule de mon bord et le push ou bien sinon t'envoyer ma copie des fichiers

Configuration

  • Tout développement, builds et tests ont été faits à l'aide de CLion, donc je recommande fortement d'utiliser mon programme à l'aide de ce dernier
  • Dans le cas que les "Run/Debug Configurations" ne fonctionnent pas, s'assurer d'avoir un CMake Profile dans les Préférences de CLion ("Preferences" > "Build, Execution, Deployment" > "CMake")

Patrons de conceptions

Factory

J'utilise la Factory pour pouvoir décider lors de l'exécution le style de poker à instancier. Je passe en parametre le choix du style de poker de l'utilisateur et la Factory retourne un objet enfant de PokerStyle.

Template Method

J'utilise une Template Method pour ma fonction play() de mes PokerStyles, la fonction est definie pure virtual (abstract) par le parent PokerStyle et les enfants doivent absolument la redéfinir selon leurs besoins.

Builder

J'utilise un genre de Builder pour la création de ma Chain of Responsibility. Lorsque j'ajoute un prochain Handler à ma chaine, la fonction retourne ce dernier pour que je puisse donc continuer à ajouter directement mes Handlers un à la suite des autres : handler->setNext(lou)->setNext(lucy).... Je ne pense pas que cette utilisation se justifie comme étant un Builder puisque ce n'est pas le même objet qui appelle toujours les fonctions, mais si l'on se dit que la chaine est un plus gros objet que simplement des Handlers un à la suite de l'autre, le patron du Builder peut faire du sens 🤷‍♂️.

Facade

J'ai aussi une Facade pour la création de ma Chain of Responsibility, la Facade a une fonction publique qui s'assure de créer les Handlers, d'ajouter les Handlers un à la suite de l'autre, de "handle", et de supprimer les Handlers. Ce patron permet donc de simplifier énormément l'utilisation de ma Chaine de responsabilité.

J'utilise aussi une petite Facade au niveau de mes Consoles pour print les informations de fin de jeu tel que les cartes communautaires, les joueurs, leurs cartes initiales, leur rang de main, les cartes de leur main, ainsi que le ou les gagnants.

Chain of Responsibility

Finalement, j'utilise une CoR pour faire la vérification des mains des joueurs. Je lui passe en paramètre les cartes du joueur et les cartes communautaires triés en ordre de numéro. Ensuite la CoR va retourner une Hand avec un HandRank (Ex: Pair, Straight, etc.) ainsi que les 5 cartes faisant partie de la main. J'assigne ensuite la valeur de retour à la main du joueur.

Conclusion

L'utilisation de la CoR

Je trouve que l'utilisation de la Chain of Responsibility était énormément pertinente. Cela permet une façon efficace de vérifier les cartes et de quitter dès qu'elles correspondes à une main. Cela fait donc en sorte que l'on va pas "overwrite" la main d'un joueur avec une main plus faible.