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

时间:2011-03-14 06:36:19

标签: 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
  

//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;     
};

4 个答案:

答案 0 :(得分:5)

你手上的ctor价格为deck

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

因此,当你从牌组中draw时,只会修改牌组的本地副本。

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

您的随机播放算法也存在缺陷。谷歌搜索“费雪耶茨”应该帮助你理顺它。你也可以每次洗牌时再次呼叫srand - 你只想在程序开头只调用一次。

答案 1 :(得分:1)

你通过值传递你的牌组,所以牌递减top_card变量以获得牌组的副本。通过引用传递它。

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

答案 2 :(得分:1)

您正在通过值将牌传递给每只手。这意味着每个玩家都可以获得他自己的套牌副本!

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

尝试通过引用传递(deck&amp; a)。

答案 3 :(得分:1)

因为当您将“newDeck”传递给手构造函数时,您将传递它的副本。因此,手的每个实例(p1和p2)都使用不同的套牌。

更改手构造函数以将引用(或指针)带到套牌。

那是:

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