C ++如何将纸牌游戏中的纸牌相加?

时间:2020-04-22 16:39:07

标签: c++ arrays dynamic

因此,我正在创建一个与二十一点非常相似的游戏,但是直到31而不是21为止。这段代码几乎印制了套牌,然后对其进行了洗牌。我应该如何使卡具有int值,以便可以添加它们?例如,我将给用户2张卡,然后显示这2张卡的总和,并询问他是否还需要一张卡。如果用户停下来,那么该轮到经销商了。

#include <iostream>
#include <ctime>
#include<string>
#include<cstdlib>
#include "card.h"
#include<iomanip>
using namespace std;

const int CARDS_PER_DECK = 52;

class deckOfCards {
public:
    deckOfCards();
    void shuffle();
    card dealCard();
    void printDeck() const;
private:
    card* deck;
    int currentCard;
};
//prints the deck
void deckOfCards::printDeck() const {
    cout << left;
    for (int i = 0; i < CARDS_PER_DECK; i++) {
        cout << setw(19) << deck[i].print();
        if ((i + 1) % 4 == 0)
            cout << endl;
    }
}
//the deck
deckOfCards::deckOfCards() {
    string faces[] = { "A","2","3","4","5","6","7","8","9","10","J","Q","K" };
    string suits[] = { "H","D","C","S" };
    deck = new card[CARDS_PER_DECK];
    currentCard = 0;
    for (int count = 0; count < CARDS_PER_DECK; count++) { //populate the deck in order
        deck[count] = card(faces[count % 13], suits[count / 13]);
    }
}
//shuffles the cards
void deckOfCards::shuffle() {
    currentCard = 0;
    for (int first = 0; first < CARDS_PER_DECK; first++) {
        int second = (rand() + time(0)) % CARDS_PER_DECK;
        card temp = deck[first];
        deck[first] = deck[second];
        deck[second] = temp;
    }
}

card deckOfCards::dealCard() {
    if (currentCard > CARDS_PER_DECK)
        shuffle();
    if (currentCard < CARDS_PER_DECK)
        return(deck[currentCard++]);
    return(deck[0]);
}


int main()
{
    deckOfCards deck;
    card currentCard;
    deck.printDeck();
    deck.shuffle();
    cout << endl << endl;
    deck.printDeck();
    deck.shuffle();
    cout << endl << endl;
    for (int i = 0; i < 2; i++) {
        int sum;
        currentCard = deck.dealCard();
        cout << currentCard.print() << endl;

    }




    return 0;
}

Card.h

#ifndef H_card
#define H_card
#include <string>
#include <iostream>

using namespace std;

class card {
public:
    card(string cardFace, string cardSuit);
    string print() const;
    card();
private:
    string face;
    string suit;
};

card::card()
{
}

card::card(string cardFace, string cardSuit) {
    face = cardFace;
    suit = cardSuit;
}

string card::print() const {
    return (face + " " + suit);
}
#endif

1 个答案:

答案 0 :(得分:1)

解决此问题的最简单方法可能是将值存储在卡本身上-但在二十一点中,根据其余卡的值,A可以为1或11,因此您需要能够说明这一点。

因此,您可以在card上添加一个int value,对于Ace来说是1,对于特许权使用费是10,对于其他每张卡来说都是面值。

int values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };

(创建卡片时,也可以将值计算为std::max(count + 1, 10)而不是使用数组。)

现在,您需要一种方法来对当前手牌中的卡进行得分。这是一个通用功能,可以与任何容器的卡片一起使用:

template <typename T>
int score_hand(T const & cards) {
  int score = 0;
  bool ace = false;

  for (card const & c : cards) {
    if (c.value == 1 && !ace) {
      ace = true;
      score += 11;
    } else {
      score += c.value;
    }
  }

  if (ace && score > 31) {
    score -= 10;
  }

  return score;
}

请注意,甲板不应被声明为card* deck;。您在这里管理自己的内存,而您的实现违反了rule of three/five。而是使用std::vector<card>(如std::vector<card> deck;中一样)。

您几乎永远不需要在C ++中显式使用new。对动态数组使用类似std::vector的容器。在需要堆分配对象的地方使用std::unique_ptrstd::shared_ptr