我正在创建二十一点游戏。我已经设置了纸牌组,现在只需要实现游戏即可。

因此,我有一个名为deck.cpp的文件,其中包含卡片组数组,还有一个卡文件,用于存储值和不包含的值。在deck.cpp文件中,我具有以下可以绘制卡片的功能:

void Deck::draw(int v){
    cout << deck[v].toString();
}

然后,在我实际玩游戏的其他文件中,我调用了牌组类,并对其进行了改组,这也可以正常工作。
#include "Deck.hpp"
#include "PlayingCard.hpp"
#include <string>
using namespace std;


class Blackjack{

    private:
        //Must contain a private member variable of type Deck to use for the game
        Deck a;
        int playerScore;
        int dealerScore;

        bool playersTurn();
        bool dealersTurn();

    public:
        //Must contain a public default constructor that shuffles the deck and initializes the player and dealer scores to 0
        Blackjack();

        void play();
};

现在,我在弄清楚如何绘制两张卡片时将它们打印出来并得到它们的总和时遇到了麻烦:
#include "Blackjack.hpp"
#include "Deck.hpp"
#include <iostream>
#include <iomanip>

using namespace std;
//Defaults the program to run
Blackjack::Blackjack(){
    a.shuffle();
    playerScore = 0;
    dealerScore = 0;
}
void Blackjack::play(){

}

我意识到这可能有问题,因为当用户决定击打时,我们可能不知道甲板上有哪张卡。相信我认为draw函数是错误的。

问题是我不知道如何正确地从卡座上抽出卡片(递减顶部卡片)。然后,我也该如何调整用户分数。我有一个getValue()函数,它返回 double 值。

最佳答案

在Deck中需要进行的更改

在现实世界中,牌组知道还剩下多少张牌,下一张牌是什么。在您的类(class)中,它应该是相同的:

class Deck{
   private:
        PlayingCard deck[52];
        int next_card;         //<=== just one approach
   public:
        ...
};

当您在现实世界中绘制卡片时,手中就会有该卡片。因此绘图返回了一些内容:
class Deck{
        ...
   public:
        Deck();
        void shuffle();
        void printDeck();
        PlayingCard draw();   // <=== return the card
};

该函数将如下所示:
PlayingCard Deck::draw(){
    int v=next_card++;
    cout << deck[v].toString();
    return deck[v];
}

在此实现中,为简单起见,不更改deck。构造套牌时,应将next_card初始化为0。在任何时候,next_card以下的元素都已绘制,并且套牌上剩余的元素是从next_card到51的那些元素。如果有人要绘制,则还应处理这种情况尽管卡组中没有剩余卡,但仍然有一张卡。

如何继续游戏

绘制更容易,因为现在,游戏可以知道绘制的卡了。这使您可以根据PlayCard值更新分数。而且您不再需要跟踪顶级卡:
Blackjack::Blackjack(){
    // Deck a;   <====== this should be a protected member of Blackjack class
    a.shuffle();
    playerScore = 0;
    dealerScore = 0;
}

我不确定玩家只能抽两张牌。因此,我建议您将游戏更改为循环播放。
void Blackjack::play(){
    bool player_want_draw=true, dealer_want_draw=true;
    while (player_want_draw || dealer_want_draw) {
        if (player_want_draw) {
            cout<<"Player draws ";
            PlayCard p = a.draw();
            cout<<endl;
            // then update the score and ask user if he wants to draw more
        }
        if (dealer_want_draw) {
            cout<<"Dealer draws ";
            PlayCard p = a.draw();
            cout<<endl;
            // then update the score and decide if dealer should continue drawing
        }
    }
    // here you should know who has won
}

通过在每个回合中更新分数和一些标志,您可以实施二十一点游戏而不必记住每个玩家抽出的纸牌的值(value)。但是,如果您愿意,可以通过为每个玩家/经销商保留他/她所抓牌的Blackjack来在现实世界中实现它。使用数组,可能但很麻烦。但是,如果您已经了解了 vector ,那么就去吧。

10-08 09:27