C++ 在扑克牌C+中绘制同一张卡时出现问题+;

C++ 在扑克牌C+中绘制同一张卡时出现问题+;,c++,oop,C++,Oop,我正在尝试创建一个有2名玩家的扑克游戏,每个玩家可以得到5张牌。我遇到的问题是,当第一个玩家抽5张牌时,第二个玩家也抽同样的5张牌。在牌组中,有一张可变的顶牌,每次抽牌都会递减。但它重新设置为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

我正在尝试创建一个有2名玩家的扑克游戏,每个玩家可以得到5张牌。我遇到的问题是,当第一个玩家抽5张牌时,第二个玩家也抽同样的5张牌。在牌组中,有一张可变的顶牌,每次抽牌都会递减。但它重新设置为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

//卡
#包括
使用名称空间std;
enum套装{none、diamond、club、heart、spade};
班级卡{
公众:
卡片(){
西装=无;
秩=0;
}   
卡(适用于sv、int rv){
等级=rv;
西服=sv;
}
整数点(){
返回等级;
} 
西服类(){
反诉;
}
字符串toString()常量{
返回rankString(秩)+“+suitString(suit)”中的“+”;
}
字符串rankString(int r)常量{
如果(1==r)返回“ace”;
如果(2==r)返回“二”;
否则如果(3==r)返回“三”;
如果(4==r),则返回“四”;
如果(5==r)返回“五”;
如果(6==r)返回“六”;
如果(7==r),则返回“七”;
如果(8==r),则返回“八”;
如果(9==r),则返回“九”;
如果(10==r),则返回“十”;
否则,如果(11==r)返回“杰克”;
如果(12==r)返回“queen”;
如果(13==r)返回“king”,则返回else;
否则返回“小丑”;
}
字符串suitString(suits)常量{
如果(s==spade)返回“spades”;
否则,如果(s==heart)返回“hearts”;
如果(s==菱形),则返回“菱形”;
否则,如果(s==俱乐部)返回“俱乐部”;
否则返回“不起诉”;
}
受保护的:
整数秩;
西服;
};
//甲板
#包括“card.h”
#包括
#包括
使用名称空间std;
甲板{
公众:
甲板(){
顶卡=0;

对于(inti=2;i你通过值传递你的牌组,因此对于牌组的副本,手部递减top_card变量。通过引用传递它

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

hand(deck&a){你通过值传递你的牌组,因此手部减少牌组副本的top_card变量。通过引用传递它

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

hand(deck&a){手牌的ctor按值取
deck

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

对于(int i=0;i你的手牌ctor按值取一个
牌组

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

对于(inti=0;i你将按值将牌组传递给每只手。这意味着每个玩家都有自己的牌组副本

手牌(a组){

对于(inti=0;i你将按值将牌组传递给每只手。这意味着每个玩家都有自己的牌组副本

手牌(a组){
对于(inti=0;i,因为当您将“newDeck”传递给hand构造函数时,您正在传递它的副本。因此,hand的每个实例(p1和p2)都使用不同的deck

更改手动构造函数以获取对数据组的引用(或指针)

即:

hand(deck &a)
{
    for(int i=0;i<5;i++)
        hands[i] = a.draw();
}
手动(甲板和a)
{
对于(inti=0;i,因为当您将“newDeck”传递给hand构造函数时,您正在传递它的副本。因此,hand的每个实例(p1和p2)都使用不同的deck

更改手动构造函数以获取对数据组的引用(或指针)

即:

hand(deck &a)
{
    for(int i=0;i<5;i++)
        hands[i] = a.draw();
}
手动(甲板和a)
{

对于(int i=0;i这里是将顶牌设置为51的部分?有关洗牌函数,请参见
std::random\u shuffle
。(它还将使用比您现有的更好的洗牌算法)。将顶牌设置为51的部分在哪里?有关洗牌函数,请参见
std::random\u shuffle
。(它还将使用更好的洗牌算法。)修改函数声明为hand(deck&a)或更好,只需调用
std::random_shuffle
。他甚至需要或想要洗牌吗?如果是draw(),他在0和top_卡之间随机选择一张卡,将其与最后一张卡交换,然后返回。类似于:card draw(){tmp=rand()%top_卡;--top_卡;std::swap(cards[tmp],cards[top_卡]);return cards[top_卡];}(当然,除此之外,std::random_shuffle。尽管我在过去看到过一些有缺陷的实现。)@James Kanze:嗨,好久没有听到。你提出了一个很好的观点——虽然事后看来很明显,但可以说,我并没有真正考虑增量洗牌。修改函数声明(deck&a)或者更好的是,只需调用
std::random_shuffle
。他甚至需要或想要洗牌吗?如果在draw()中,他在0和top_卡之间选择一张随机卡,将其与最后一张卡交换,然后返回。类似于:card draw(){tmp=rand()%top_卡;--top_卡;std::swap(卡[tmp]、卡片[top_card])、返回卡片[top_card];}(当然,还有std::random_shuffle。尽管我在过去见过一些有缺陷的实现。)@James Kanze:嗨,好久没听到了。你提出了一个很好的观点——尽管事后看来很明显,我并没有真正考虑过增量洗牌。