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

标签 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;     
};

最佳答案

你的 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/

相关文章:

c++ - undefined reference .. - mingw - winxp - eclipse juno

C++ 调用析构函数并没有真正从内存中删除对象

OOP 中的 Python MQTT 回调

python - 如何从列表中的列表中删除对象?

Java/C++ 加密和 JNI 接口(interface)

c++ - g++ AND gcc 不被识别为内部或外部命令

java - 我应该创建一个带有 setter 的构造函数吗

asp.net-mvc - 正确使用强类型部分 View 吗?

php - 在函数内创建新类或将其作为 PHP 中的参数传递更快吗

c++ - 为什么 C++ 中的析构函数会增加它们所在对象的大小?