Et oui, encore un BlackJack avec Dev-cpp en interface DOS.
Source / Exemple :
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cctype>
typedef enum { Trefles = 0, Carreaux, Coeur, Pike } Suit;
typedef enum { Continue, Win, Bust } State;
typedef struct {
Suit suit;
char value;
} Card;
class Deck {
public:
Deck() {
cards = new Card[52];
CreateDeck();
}
~Deck() {
delete[] cards;
}
void CreateDeck() {
for(int x = 0; x < 4; ++x) {
for(int i = 1; i <= 13; ++i) {
cards[i + (x * 13) - 1].suit = static_cast<Suit>(x);
cards[i + (x * 13) - 1].value = i;
}
}
deck = 52;
MelangeDeck();
}
void MelangeDeck() {
for(int x = 0; x < 4; ++x) {
for(int i = 1; i <= 13; ++i) {
std::swap(cards[i + (x * 13) - 1], cards[rand() % 52]);
}
}
int melange = 3;
do {
for(int x = 0; x < 2; ++x) {
for(int i = 1; i < 13; ++i) {
std::swap(cards[i + (x * 13) - 1], cards[(i+2) + (x * 13)]);
}
}
} while(--melange);
}
Card DrawCard() {
if(deck <= 0) {
Card c = { static_cast<Suit>(-1), 0 };
return c;
}
return cards[--deck];
}
void ShowCard(int i) {
ShowCard(cards[i]);
}
void ShowCard(Card card) {
Suit suit = card.suit;
int value = card.value;
switch(value) {
case 1: std::cout << "As de "; break;
case 11: std::cout << "Chevalier de "; break;
case 12: std::cout << "Renne de "; break;
case 13: std::cout << "Roi de "; break;
default: std::cout << value << " de ";
}
switch(suit) {
case Trefles: std::cout << "Trefles"; break;
case Carreaux: std::cout << "Carreaux"; break;
case Coeur: std::cout << "Coeur"; break;
case Pike: std::cout << "Pike"; break;
}
std::cout << std::endl;
}
private:
Card *cards;
int deck;
};
class BlackJack : public Deck {
public:
BlackJack() {
croupier.score = croupier.index = 0;
croupier.cards = new Card[12];
joueur.score = joueur.index = 0;
joueur.cards = new Card[12];
}
~BlackJack() {
delete[] croupier.cards;
delete[] joueur.cards;
}
State give_joueur_card(void) {
Card card = this->DrawCard();
if(!card.value)
return Bust;
joueur.cards[joueur.index++] = card;
joueur.score = count_cards(joueur.cards, joueur.index);
if(joueur.score > 21)
return Bust;
else if(joueur.score == 21)
return Win;
return Continue;
}
State give_croupier_card(void) {
Card card = this->DrawCard();
if(!card.value)
return Bust;
croupier.cards[croupier.index++] = card;
croupier.score = count_cards(croupier.cards, croupier.index);
if(croupier.score > 21)
return Bust;
else if(joueur.score == 21)
return Win;
return Continue;
}
void show_joueur_cards(void) {
std::cout << " Cartes du joueur" << std::endl;
ShowCards(joueur.cards, joueur.index);
std::cout << std::endl;
}
void show_croupier_cards(bool show_all) {
std::cout << " Cartes du Croupier" << std::endl;
if(show_all) {
ShowCards(croupier.cards, croupier.index);
std::cout << "Score: " << croupier.score;
} else
ShowCards(croupier.cards+1, croupier.index-1);
std::cout << std::endl;
}
int get_joueur_score(void) { return joueur.score; }
int get_croupier_score(void) { return croupier.score; }
void ShowCards(Card *cards, int size) {
for(int i = 0; i < size; ++i)
ShowCard(cards[i]);
}
private:
struct {
int score, index;
Card *cards;
} croupier, joueur;
int count_cards(Card *cards, int size) {
int total = 0;
bool CAs = false;
for(int i = 0; i < size; ++i) {
if(CAs && size > 2) {
total -= 10;
CAs = false;
}
if(cards[i].value == 1) {
if((total + 11) < 21) {
total += 10;
CAs = true;
}
++total;
} else if(cards[i].value >= 10)
total += 10;
else
total += cards[i].value;
}
return total;
}
};
int main(void)
{
srand(time(0));
BlackJack *jack = new BlackJack();
bool busted = false, joueur_hit = true;
State croup, joueur;
std::string message = "";
jack->give_croupier_card();
jack->give_joueur_card();
do {
int cscore = jack->get_croupier_score();
if(cscore < 15) croup = jack->give_croupier_card();
if(joueur_hit) joueur = jack->give_joueur_card();
int jscore = jack->get_joueur_score();
char b = 0;
if(jscore <= 21 && cscore <= 21) {
do {
jack->show_croupier_cards(false);
jack->show_joueur_cards();
std::cout << "Que voulez vous faire? " << jscore << ") [P=Prendre/L=Laisser] ";
std::cin >> b; b = std::toupper(b);
} while(b != 'P' && b != 'L');
}
joueur_hit = (b == 'P');
if(!joueur_hit) {
while(cscore < 15) {
croup = jack->give_croupier_card();
cscore = jack->get_croupier_score();
}
if(jscore > cscore || joueur == Win || croup == Bust)
message = "Gagnant!!!";
else if(cscore > jscore || croup == Win || joueur == Bust)
message = "Perdu";
else if(cscore == jscore)
message = "Dommage";
break;
}
busted = (joueur == Bust || croup == Bust);
} while(!busted);
std::cout << "+---- " << message << " ----+" << std::endl << std::endl;
jack->show_croupier_cards(true);
std::cout << std::endl;
jack->show_joueur_cards();
std::cout << "Score: " << jack->get_joueur_score() << std::endl;
system("pause");
return 0;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.