C++ 二十一点函数

标签 c++ blackjack

我已经开始自学 C++,并一直在尝试编写一个二十一点程序。我正在尝试使用类来表示牌、牌组和手牌。我相信到目前为止,除了 dealCardToHand() 方法之外,程序中的所有内容都正常运行。

void dealCardToHand(deck& d, hand& h){
    h.setCard(h.getCardsInHand(), d.dealCard());
    h.setCardsInHand(h.getCardsInHand() + 1);
}

它似乎正确地增加了手中的牌数,但没有使用正确的数据调用 setCard() 方法。任何帮助,将不胜感激。我包括相关的类和方法:

class deck{
    int topCard;
    card * cards[52];
 public:
     deck();
     void shuffle();
     void printDeck();
     card dealCard();
};

card deck::dealCard(){//returns top card of deck and increments top card one
    return *cards[topCard++];
}

class hand{
    card * handCards[12];
    int cardsInHand;
public:
    hand();
    card getCard(int i){ return *handCards[i]; }
    void setCard(int i, card c) { handCards[i] = &c; }
    int getCardsInHand() { return cardsInHand; }
    void setCardsInHand(int i) { cardsInHand = i; }
    void printHand();
};

最佳答案

这很危险(可能至少是您问题的一部分):

void setCard(int i, card c) {handCards[i]=&c;}

这里,setCard(...) 按值传递一个 card 对象。这意味着将在临时位置创建调用者的新拷贝。 setCard() 所作用的正是这个拷贝 (c)。通过设置handCards[i]=&c;,您可以保存该临时对象的位置。但是当 setCard() 返回时,该临时对象就不再有效。

但随后您继续在 getCard() 中取消引用 handCards[i]。这会产生未定义的行为。从理论上讲,你应该预料到恶魔会开始从你的 Nose 里飞出来。实际上,您将看到 getCard() 返回的全部垃圾。或者崩溃。或者,如果您足够不幸,最后一个值可能会传递到 setCard()

总体而言,您似乎对指针的运用又快又松。我建议采用以下两种方法之一来解决该问题:

  1. 到处使用指针,切勿按值传递或返回。这可能会导致其他问题,但它们可能并不那么神秘。
  2. 不使用指针。按值传递和返回所有内容。

当然,这些不是唯一的选择,但它们可能会让您暂时的生活更轻松。

关于C++ 二十一点函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131340/

相关文章:

c - 对我的简单二十一点程序的建议/改进

c++ - OpenCV cv::dnn::Net::getBlob 返回 dnn::Blob::matRefConst 有 rows == -1 和 cols == -1

c++ - Visual Studio 非托管 C++ 智能文件资源管理器

python - while 循环不适用于二十一点

python - 如何并排打印我的 ASCII 卡?

python - Blackjack 风格的 Python(计算机)游戏循环不正确

c++ - 如何返回对 'empty' 对象的引用

c++ - std::vector 赋值 SIGNAL 11 和 SIGNAL 6

c++:用户定义类型的 vector ?

c++ - 二十一点计划