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

Dan*_*Dan 1 c++ oop

我正在尝试用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
Run Code Online (Sandbox Code Playgroud)

//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;     
};
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 5

你手上的ctor需要一个deck值:

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

因此,当你draw从甲板上时,只有甲板的本地副本被修改.

编辑:现在可能还值得注意的是,你正在向一个玩家发行5张牌,然后向下一个玩家发牌5张(玩家1获得卡1至5,玩家2获得卡6至10,依此类推).在通常的方案中,你处理循环,所以对于2名玩家,玩家1将获得卡1,3,5,7和9,玩家2将获得卡2,4,6,8和10.

你的shuffle算法也存在缺陷.谷歌搜索"费雪耶茨"应该帮助你理顺它.你也做希望调用srand每次洗牌一次又一次-你要在节目开始时只有一次调用它.