2017-10-15 8 views
-1

Je dois programmer un simple jeu de blackjack pour mon intro en classe C++ et la façon dont le professeur veut que nous construisions le deck me confond avec la façon dont je suis censé programmer l'As pour choisir automatiquement Après avoir lu d'autres solutions possibles, il y a eu des idées contradictoires pour d'abord fixer la valeur de l'as à 11 et soustraire 10 si vous avez fait faillite (Comment mon professeur préférait-il que la valeur soit 11)?), mais la plupart je vois dire pour mettre la valeur à 1 et ajouter 10 si nécessaire.C++ BlackJack Stuck essayant de programmer Ace

ci-dessous est la façon dont il voulait mettre en place nos classes de cartes et de plate-forme:

#include <iostream> 
#include <string> 
#include <vector> 
#include <ctime> 

using namespace std; 

class card 
{ 
string rank; 
string suit; 
int value; 

public: 
string get_rank() 
{ 
    return rank; 
} 
string get_suit() 
{ 
    return suit; 
} 
int get_value() 
{ 
    return value; 
} 

//Contstructor 
card(string rk = " ", string st = " ", int val = 0) 
{ 
    rank = rk; 
    suit = st; 
    value = val; 
} 


//print function 
void print() 
{ 
    cout << rank << " of " << suit << endl; 
} 
}; 

class deck 
{ 
card a_deck[52]; 
int top; 

public: 
card deal_card() 
{ 
    return a_deck[top++]; 
} 

//Deck constructor 
deck() 
{ 
    top = 0; 
    string ranks[13] = { "Ace", "King", "Queen", "Jack", "Ten", "Nine", 
"Eight", "Seven", "Six", "Five", "Four", "Three", "Two" }; 
    string suits[4] = { "Spades", "Diamonds", "Hearts", "Clubs" }; 
    int values[13] = { 11,10,10,10,10,9,8,7,6,5,4,3,2 }; 

    for (int i = 0; i < 52; i++) 
     a_deck[i] = card(ranks[i % 13], suits[i % 4], values[i % 13]); 

    srand(static_cast<size_t> (time(nullptr))); 
} 

void shuffle() 
{ 
    for (int i = 0; i < 52; i++) 
    { 
     int j = rand() % 52; 
     card temp = a_deck[i]; 
     a_deck[i] = a_deck[j]; 
     a_deck[j] = temp; 

    } 
} 
}; 

Ensuite, il nous a créer une classe de joueur dans lequel nous construisons la main dans un vecteur

class player 
{ 
string name; 
vector<card>hand; 
double cash; 
double bet; 

public: 

//Constructor 
player(double the_cash) 
{ 
    cash = the_cash; 
    bet = 0; 
} 

void hit(card c) 
{ 
    hand.push_back(c); 
} 


int total_hand() 
{ 
    int count = 0; 
    for (int i = 0; i < hand.size(); i++) 
    { 
     card c = hand[i]; 
     count = count + c.get_value(); 
    } 
    return count; 

} 
}; 

Comment est-ce que j'irais coder l'As? il est juste passé à peine à créer un "ami" de dernière classe. devrais-je créer une fonction friend dans le deck qui change la valeur de Ace dans le tableau en un? Mon cerveau me fait mal, excuses si je n'ai pas de sens.

+0

* Comment est-ce que je pourrais coder l'As? * - Avez-vous déjà entendu parler des déclarations "if-else"? L'ensemble du code que vous avez publié ne l'utilise nulle part, et c'est probablement ainsi que vous coderiez une carte spéciale qui a l'une des deux valeurs en fonction d'un certain scénario. – PaulMcKenzie

Répondre

0

Vous pouvez l'implémenter dans les deux sens.

Pour ajouter 10 plus tard, vous pouvez changer votre fonction total_hand() pour devenir:

int total_hand 
{ 
    int count = 0; 
    int num_of_aces = 0; 
    for (int i = 0; i < hand.size(); i++) 
    { 
     card c = hand[i]; 
     if (c.get_value() == 11){ 
      num_of_aces += 1; 
      count += 1; 
     } 
     else 
      count = count + c.get_value(); 
    } 
    for (int i = 0; i < num_of_aces; i++){ 
     if (count + 10 <= 21) 
      count += 10; 
    return count; 
} 

Soustraire 10 plus tard (comme votre intuition suggère), vous pouvez effectuer les opérations suivantes:

int total_hand 
{ 
    int count = 0; 
    int num_of_aces = 0; 
    for (int i = 0; i < hand.size(); i++) 
    { 
     card c = hand[i]; 
     if (c.get_value() == 11) 
      num_of_aces += 1; 

     count = count + c.get_value(); 
    } 

    while(count > 21 && num_of_aces--) 
     count -=10; 

    return count; 
} 
+0

Le cas "ajouter 10" peut être rendu plus simple et plus rapide, car il n'est pas nécessaire de compter les as. Gardez juste un drapeau si un as a été vu ou pas, et si total <12, ajoutez 10 juste une fois, pas dans une boucle. –