diff --git a/snippets/Coinche.cpp b/snippets/Coinche.cpp new file mode 100644 index 0000000..4c99c01 --- /dev/null +++ b/snippets/Coinche.cpp @@ -0,0 +1,236 @@ +// +// Created by trotfunky on 25/04/19. +// + +#include "Coinche.h" + + +std::vector generate_cards() +{ + std::vector deck; + deck.reserve(32); + + for(int couleur = Couleur::coeur ; couleur != Couleur::last ; couleur++) + { + for(int carte = Force::sept ; carte != Force::dernier ; carte++) + { + int valeur; + switch (carte) + { + case sept: + case huit: + case neuf: + valeur = 0; + break; + case dix : + valeur = 10; + break; + case valet: + valeur = 1; + break; + case dame: + valeur = 2; + break; + case roi: + valeur = 3; + break; + case as: + valeur = 11; + break; + case dernier: + default: + valeur = 0; + } + + deck.push_back({static_cast(couleur), static_cast(carte), valeur}); + } + } + + std::shuffle(deck.begin(),deck.end(),randomDevice); + + return deck; +} + +void update_values(Couleur atout, std::vector& deck, std::vector& jeu) +{ + for(card& carte : deck) + { + if(carte.couleur == atout) + { + if(carte.force == Force::valet) + { + carte.value = 20; + } + else if(carte.force == Force::neuf) + { + carte.value = 14; + } + } + } + + for(card& carte : jeu) + { + if(carte.couleur == atout) + { + if(carte.force == Force::valet) + { + carte.value = 20; + } + else if(carte.force == Force::neuf) + { + carte.value = 14; + } + } + } +} + +card play(card played, std::vector& jeu, Couleur atout) +{ + const card* minGagnant = nullptr; + const card* minAtout = nullptr; + const card* minCouleur = nullptr; + const card* minPerdant = nullptr; + + for(const card& carte : jeu) + { + if(carte.couleur == played.couleur) + { + if((!minGagnant && carte.value > played.value ) || + (minGagnant && carte.value > played.value && carte.value < minGagnant->value)) + { + minGagnant = &carte; + } + else if(!minCouleur || ( carte.value < played.value && carte.value < minCouleur->value) ) + { + minCouleur = &carte; + } + } + else + { + if(carte.couleur == atout) + { + if(!minAtout || carte.value < minAtout->value) + { + minAtout = &carte; + } + } + else + { + if(!minPerdant || carte.value < minPerdant->value) + { + minPerdant = &carte; + } + } + } + } + + if(minGagnant) + { + return(*minGagnant); + } + else if(minCouleur) + { + return(*minCouleur); + } + else if(minAtout) + { + return(*minAtout); + } + else + { + return(*minPerdant); + } +} + +Couleur pick_atout() +{ + int nbCouleurs; + for(nbCouleurs = Couleur::coeur; nbCouleurs != Couleur::last ; nbCouleurs++); + nbCouleurs--; + + std::uniform_int_distribution uniformIntDistribution(0,nbCouleurs); + + return(static_cast(uniformIntDistribution(engine))); +} + +bool WonOrLost(card played, card chosen, Couleur atout) +{ + if(played.couleur == chosen.couleur) + { + return(chosen.value > played.value); + } + else + { + return(chosen.couleur == atout); + } +} + + + +std::ostream& operator<<(std::ostream& ostream, const Couleur& couleur) +{ + std::string str; + switch (couleur) + { + case coeur: + str = "cœur"; + break; + case carreau: + str = "carreau"; + break; + case pique: + str = "pique"; + break; + case trefle: + str = "trèfle"; + break; + case last: + default: + str = "cassé"; + } + return ostream << str; +} + + +std::ostream& operator<<(std::ostream& ostream, const Force& force) +{ + std::string valeur; + switch (force) + { + case sept: + valeur = "sept"; + break; + case huit: + valeur = "huit"; + break; + case neuf: + valeur = "neuf"; + break; + case valet: + valeur = "valet"; + break; + case dame: + valeur = "dame"; + break; + case roi: + valeur = "roi"; + break; + case dix: + valeur = "dix"; + break; + case as: + valeur = "as"; + break; + case dernier: + default: + valeur = "rien"; + } + return ostream << valeur; +} + + +std::ostream& operator<<(std::ostream& ostream, const card& card) +{ + std::string prefixe = (card.force == Force::dame ? "une " : "un "); + return ostream << prefixe << card.force << " de " << card.couleur; +} \ No newline at end of file diff --git a/snippets/Coinche.h b/snippets/Coinche.h new file mode 100644 index 0000000..e44665a --- /dev/null +++ b/snippets/Coinche.h @@ -0,0 +1,29 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +enum Couleur {coeur, carreau, pique, trefle, last}; +enum Force { sept, huit, neuf, valet, dame, roi, dix, as, dernier }; + +struct card { + Couleur couleur; + Force force; + int value; +}; + +std::ostream& operator << (std::ostream& ostream,const Couleur& couleur); +std::ostream& operator <<(std::ostream& ostream, const Force& force); +std::ostream& operator << (std::ostream& ostream, const card& card); + +static std::random_device randomDevice; +static std::default_random_engine engine(randomDevice()); + +std::vector generate_cards(); +void update_values(Couleur atout , std::vector &deck, std::vector &jeu); +Couleur pick_atout(); +bool WonOrLost(card played, card chosen, Couleur atout); +card play(card played, std::vector &jeu, Couleur atout); diff --git a/snippets/playCoinche.cpp b/snippets/playCoinche.cpp new file mode 100644 index 0000000..cac3ce3 --- /dev/null +++ b/snippets/playCoinche.cpp @@ -0,0 +1,49 @@ +// +// Created by trotfunky on 25/04/19. +// + +#include + +#include "Coinche.h" + + +int main() +{ + std::cout << "Faisons un pli de coinche ! " << std::endl << std::endl; + + // On génère un deck + std::vector deck = generate_cards(); + + std::vector main; + + // On génère une main à partir de ce deck + for(int i = 0;i<8;i++) + { + main.push_back(deck.back()); + deck.pop_back(); + } + + std::cout << "Voilà notre main : " << std::endl; + for(const card& carte : main) + { + std::cout << carte << std::endl; + } + + // On choisit un atout + Couleur atout = pick_atout(); + std::cout << std::endl << "On a choisi l'atout " << atout << std::endl; + + // Puis on met à jour les valeurs des cartes de l'atout (9 et valet) + update_values(atout,deck,main); + + // On fait jouer une carte aléatoire à l'adversaire, vu que le tableau est mélangé de manière aléatoire + card played = deck.back(); + std::cout << std::endl << "L'adversaire a joué " << played << " !" << std::endl; + + // On décide la carte que nous allons jouer + card toPlay = play(played,main,atout); + std::cout << "Nous allons donc jouer " << toPlay << std::endl; + + // On gagne ou perd + std::cout << "C'est " <<(WonOrLost(played,toPlay,atout) ? "gagné ! " : "perdu :(") << std::endl; +} \ No newline at end of file