Проблема с рисованием одной и той же карты в покере C ++ - PullRequest
1 голос
/ 14 марта 2011

Я пытаюсь создать покерную игру с 2 игроками, каждый получает по 5 карт.У меня проблема в том, что когда первый игрок берет свои 5 карт, второй игрок тоже берет те же 5 карт.в колоде есть переменная 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 ]

5 голосов
/ 14 марта 2011

Ваш 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.

Ваш алгоритм перемешивания также имеет недостатки.Поиск в Google по «Fisher-Yates» должен помочь вам разобраться в этом.Вы также не хотите снова вызывать srand каждый раз, когда вы тасуете - вы хотите вызывать его только один раз в начале программы.

1 голос
/ 14 марта 2011

Потому что, когда вы передаете «newDeck» в конструктор руки, вы передаете его копию. Следовательно, каждый экземпляр руки (p1 и p2) использует разные колоды.

Измените конструктор руки, чтобы взять ссылку (или указатель) на колоду.

То есть:

hand(deck &a)
{
    for(int i=0;i<5;i++)
        hands[i] = a.draw();
}
1 голос
/ 14 марта 2011

Вы передаете колоду по значению каждой руке.Это означает, что каждый игрок получает свою собственную копию колоды!

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

Попробуйте вместо этого перейти по ссылке (колода & a).

1 голос
/ 14 марта 2011

Вы передаете свою колоду по значению, поэтому рука уменьшает переменную top_card для копии колоды. Передайте его по ссылке.

hand(deck & a) { <-- CHANGE HERE
        for(int i=0;i<5;i++)
            hands[i] = a.draw();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...