gpt4 book ai didi

c++ - 在扑克 C++ 中绘制同一张牌的问题

转载 作者:太空宇宙 更新时间:2023-11-03 10:35:04 24 4
gpt4 key购买 nike

我正在尝试创建一个有 2 名玩家的扑克游戏,每人获得 5 张牌。我遇到的问题是,当第一个玩家抽出他的 5 张牌时,第二个玩家也抽出同样的 5 张牌。在 Deck 中,有一个变量 top_card 每次抽奖时都会递减。但它会重置回 51,而不是从 46 继续。任何人都可以帮助我吗?

 Sample output
nine of clubs
jack of diamonds
queen of clubs
queen of hearts
joker of hearts

nine of clubs
jack of diamonds
queen of clubs
queen of hearts
joker of hearts

//Card 
#include <string>
using namespace std;

enum suits { none, diamond, club, heart, spade };

class card {
public:
card( ){
suit = none;
rank = 0;
}
card( suits sv, int rv) {
rank = rv;
suit = sv;
}

int spots ( ){
return rank;
}
suits kind ( ){
return suit;
}

string toString() const {
return rankString(rank) + " of " + suitString(suit);
}

string rankString(int r) const{
if (1 == r) return "ace";
else if (2 == r) return "two";
else if (3 == r) return "three";
else if (4 == r) return "four";
else if (5 == r) return "five";
else if (6 == r) return "six";
else if (7 == r) return "seven";
else if (8 == r) return "eight";
else if (9 == r) return "nine";
else if (10 == r) return "ten";
else if (11 == r) return "jack";
else if (12 == r) return "queen";
else if (13 == r) return "king";
else return "joker";
}

string suitString(suits s) const {
if (s == spade) return "spades";
else if (s == heart) return "hearts";
else if (s == diamond) return "diamonds";
else if (s == club) return "clubs";
else return "non-suit";
}

protected:
int rank;
suits suit;
};


//Deck
#include "card.h"
#include <ctime>
#include <cstdlib>
using namespace std;

class deck {
public:
deck() {
top_card = 0;
for( int i = 2; i <= 14; i++ )
{
card c1( diamond, i ),
c2( spade, i ),
c3( heart, i ),
c4( club, i );

cards[ top_card++ ] = c1;
cards[ top_card++ ] = c2;
cards[ top_card++ ] = c3;
cards[ top_card++ ] = c4;
}
}

void shuffle() {
srand(time(NULL));
for(int i=0; i<52; i++) {
int a = rand()%52;
card temp = cards[i];
cards[i] = cards[a];
cards[a] = temp;
}
}

bool is_empty() {
return (top_card <= 0);
}

card draw() {
if( !is_empty() ) {
return cards[ --top_card ];
}
else {
card non_card( none, 0 );
return non_card;
}
}

protected:
card cards[ 52 ];
int top_card;
};

最佳答案

你的 ctor for a hand takes a deck by value:

hand(deck a) {
for(int i=0;i<5;i++)
hands[i] = a.draw();
}

因此,当您从牌组中绘制时,只会修改牌组的本地拷贝。

编辑:现在可能还值得注意的是,您正在向一位玩家发 5 张牌,然后向下一位玩家发 5 张牌(玩家 1 拿到牌 1 到 5,玩家 2 拿到牌 6 到 10,依此类推在)。在通常的方案中,您进行循环赛,因此有 2 名玩家,玩家 1 将获得牌 1、3、5、7 和 9,玩家 2 将获得牌 2、4、6、8 和 10。

您的随机播放算法也有缺陷。谷歌搜索“Fisher-Yates”应该可以帮助您弄清楚。您也不想在每次洗牌时再次调用 srand -- 您只想在程序开始时调用它一次。

关于c++ - 在扑克 C++ 中绘制同一张牌的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295502/

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