gpt4 book ai didi

c++ - 抽一张牌,然后呼唤它

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:54 25 4
gpt4 key购买 nike

我正在制作一款二十一点游戏。我已经设置了一个卡片组,我现在只需要实现游戏。

所以我有一个名为 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 功能是错误的。

问题是我无法弄清楚如何从牌组中正确地抽出牌(通过减少顶牌)。那么我该如何调整用户分数呢。我有一个返回 double 值的 getValue() 函数。

最佳答案

Deck 中所需的更改

在现实世界中,牌组知道还剩多少张牌以及下一张是什么。在你的类里面应该是一样的:

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为简单起见未更改。 build 甲板时,next_card应初始化为 0。任何时候 next_card 下面的元素已经绘制,甲板上剩余的元素是那些从 next_card 开始的元素到 51. 如果有人想在牌组中没有牌的情况下抽牌,你也应该处理这种情况。

如何继续游戏

抽牌更容易,因为现在,游戏可以知道抽到的是哪张牌。这允许您根据 PlayCard 更新分数值(value)。而且您不再需要跟踪最上面的卡片:

Blackjack::Blackjack(){
// Deck a; <====== this should be a protected member of Blackjack class
a.shuffle();
playerScore = 0;
dealerScore = 0;
}

我不确定玩家只能抓 2 张牌。因此,我建议将您的游戏玩法更改为循环。

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 ,那就去做吧。

关于c++ - 抽一张牌,然后呼唤它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47611815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com