Генерация деки карт

Я не совсем понимаю, к каким указателям или управлению памятью вы обращаетесь. Однако это

cin >> a[1000];

неверно. Массив с 1000 элементами имеет последний действительный индекс как 999. Вы получаете доступ к массиву за пределами, что вызывает неопределенное поведение. Может случиться что угодно (ну, не совсем, но лучше так об этом думать).

Правильный цикл должен быть («правильный» как в «минимальных изменениях, чтобы избежать уб»):

for(int h = 0;h < g; h++){
    cout << "  Input number: ";
    cin >> a[h];
}

Однако, это также вызовет проблемы, когда пользователь вводит число больше чем 1000 для g. Что вы действительно должны использовать, так это std::vector, который позволяет вам выдвигать элементы сколько угодно, не указывая их размер во время компиляции.

PS: Если ваш код работает без указателей или ручного управления памятью, то нет причин добавлять его. Указатели и (ручное) управление памятью сложны, обучение тому, как с ними обращаться, в основном сводится к тому, как их избежать.

8
задан Bill the Lizard 18 September 2012 в 03:06
поделиться

11 ответов

Попытайтесь создать класс Карты с иском и карты как участник и установить его как тип вектора. Как

public class Card {
 public:
  Card(char suit, char card);
  char suit, card;
};

int main() {
    vector<Card> deck;
    char suit[] = {'h','d','c','s'};
    char card[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
    for (int j=0; j<13; j++) {
        for (int i=0; i<4; i++) {
                deck.push_back(new Card(card[j],suit[i]));
        }               
    }
    return 0;
}

также использование перечислений вместо символов в иске и карте сделало бы это более ясным.

12
ответ дан 5 December 2019 в 04:28
поделиться

Я думаю, что Вы надеетесь использовать, перечисление. Это сделает Ваш код более четким и разрешит Вашу проблему.

enum SUIT { HEART, CLUB, DIAMOND, SPADE }; 
enum VALUE { ONE, TWO, THREE, ..., TEN, JACK, QUEEN, KING};
31
ответ дан 5 December 2019 в 04:28
поделиться

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

Вы создаете фактическую игру, и структуры данных просто должны поддерживать геймплей?

Если так, я создал бы класс карты с перечислимым полем для иска и числового типа (со значениями 1 - 13) для номинальной стоимости.

С другой стороны, при создании аналитического приложения или плеера AI затем модель могла бы немного отличаться.

Несколько лет назад я записал средство моделирования для вычисления вероятностей в различных сценариях Техас Холдема, и я хотел, чтобы оно произвело подсчеты ДЕЙСТВИТЕЛЬНО быстро. Я начал с очень простой моделью (класс карты, перечисление иска, и т.д.), но после большого профилирования и оптимизации, я закончил с поразрядным представлением.

Каждая карта была шестнадцатиразрядным значением, с тринадцатью старшими битами, представляющими номинальную стоимость, два бита низкоуровневых, представляющие иск, и с битом [2] как специальный флаг, указывающий на туз (используемый только в случаях, где туз мог бы появиться в A2345 прямо).

Вот несколько примеров:

0000000000001001  <----  Two of hearts
0100000000000011  <----  King of spades
1000000000000110  <----  Ace of diamonds

^^^^^^^^^^^^^            ("face-value" bits)
             ^           ("low-ace" flag)
              ^^         ("suit" bits)

Можно вообразить, как с дизайном как это это освещает быстро для поиска пар, threes-of-a-kind, и дорожки (сбросы немного более хитры).

Я не войду во все конкретные операции, но достаточно сказать, что этот вид поддержек модели миллионы операций в секунду...

Конечно, имейте в виду, я на самом деле не защищаю это, Вы используете дизайн как это в простой игровой реализации. Единственная причина я закончил с этим дизайном, состоит в том, потому что я должен был провести крупные статистические моделирования.

Поэтому думайте тщательно о том, как Вы хотите смоделировать:

  • Каждая карта
  • Рука игрока
  • Вся дека
  • Состояние таблицы... включая все руки плеера (включая игроков, которые разделили их начальную руку), возможно, шесть туфель на платформе, груда отбрасывания, и т.д.

Полная прикладная модель и цели приложения в целом, определят в большой степени типы структур данных, это будет самым соответствующим.

Развлекайтесь!!!

9
ответ дан 5 December 2019 в 04:28
поделиться

Используйте 'T' вместо 10.

6
ответ дан 5 December 2019 в 04:28
поделиться

Вы попытались заменить J 11, Q с 12 и K с 13? Затем Вы могли использовать integers, а не charагенты. Замените 11-13 соответствующей буквой позже.

5
ответ дан 5 December 2019 в 04:28
поделиться

Ну, в первую очередь, дека [0] является одним символом, все же Вы пробуете, для наполнения "2 ч" в него. (в настоящий момент мы проигнорируем что, как Вы делаете, который является неправильным.)

В основном необходимо будет сделать деку a vector<std::string>. Сделайте карту массивом константы char*s и преобразуйте элементы для строкового представления.

затем использование:

deck.push_back(std::string(card[j]) + suit[i]);
3
ответ дан 5 December 2019 в 04:28
поделиться

Как упомянуто другими, можно использовать 'T' для десять, J, Q, и K для чисел. До push_back.. так как дека является вектором символов, можно передать только один символ push_back как аргумент. Передача обоих значение карты (1... 9, T, J, Q, K) и его комплект не работает.

Я лично создал бы немного структуры, для представления Карты, со Значением и свойством Suite. Затем можно сделать деку вектором Карт.

Отредактированный: фиксация последнего слова начиная с вектора (меньше) Карта (больше - чем) была представлена, как векторизовали (ничто).

2
ответ дан 5 December 2019 в 04:28
поделиться

Так как это - программа блэк джека, Вы будете добавлять и сравнивать значение карт.

При этом можно сохранить себя некоторое дополнительное программирование и боль путем предоставления значений интервала карт (1-13) вместо символьных значений.

1
ответ дан 5 December 2019 в 04:28
поделиться

Я пошел бы с предложением Ross для использования целых чисел. Большинство карточных игр включит некоторые биты математики, таким образом, это будет лучшим представлением.

Преобразуйте в или 'ACE' и т.д. на выводе.

0
ответ дан 5 December 2019 в 04:28
поделиться

Это не могло бы скомпилировать, но здесь является подходом, который я был бы (и использовать). Вы собираетесь хотеть использовать ints для представления карт, но можно легко абстрагировать это в классе. Который я запишу для Вас.

class Card
{
public:
    enum ESuit
    {
        kSuit_Heart,
        kSuit_Club,
        kSuit_Diamond,
        kSuit_Spade,
        kSuit_Count
    };

    enum ERank
    {
        kRank_Ace,
        kRank_Two,
        kRank_Three,
        kRank_Four,
        kRank_Five,
        kRank_Six,
        kRank_Seven,
        kRank_Eight,
        kRank_Nine,
        kRank_Ten,
        kRank_Jack,
        kRank_Queen,
        kRank_King,
        kRank_Count
    };

    static int const skNumCards = kSuit_Count * kRank_Count;

    Card( int cardIndex )
    : mSuit( static_cast<ESuit>( cardIndex / kRank_Count ) )
    , mRank( static_cast<ERank>( cardIndex % kRank_Count ) )
    {}

    ESuit GetSuit() const { return mSuit );
    ERank GetRank() const { return mRank );

private:
    ESuit mSuit;
    ERank mRank;
}

Теперь его очень простое для добавления к этому классу для получения всего Вы хотите из него. Генерировать список его столь же простой как ниже.

rstl::vector<Card> mCards;
mCards.reserve( Card::skNumCards );

for ( int cardValue = 0; cardValue < Card::skNumCards; ++cardValue )
{
    mCards.push_back( Card( cardValue ) );
}

Необходимо ли переставить?

#include <algorithm>
std::random_shuffle( mCards.begin(), mCards.end() );

Как насчет видят, каково значение первой карты?

if ( mCards[0].GetSuit() == Card::kRank_Club && mCards[0].GetRank() == Card::kRank_Ace )
{
    std::cout << "ACE OF CLUBS!" << std::endl;
}

Я не скомпилировал ни одного из этого, но это должно быть близко.

2
ответ дан 5 December 2019 в 04:28
поделиться

Так как это - домашняя работа для C++, я собираюсь предположить, что Вы, как ожидают, будете использовать классы. Иначе используйте перечисления, и если это было использованием C структура или что-то.

И для некоторых игр, кроме значения точек, Вы хотели бы сохранить некоторый разряд для карты, которая будет зависеть от текущего режима игры.

Я не выполнил в плоскости C навсегда, но я имею в виду что-то вроде этого:

typedef struct struct_card {
  unsigned short int suit:2;
  unsigned short int card:4;
//  unsigned short int valu:4;
} card;

int main() {
  card a_card;
  card std_deck[52];
  const unsigned short int rummy_value[13] = {1,2,3,4,5,6,7,8,9,10,10,10,10};
  const char *std_card_name[13] = {"Ace","Two","Three","Four","Five","Six",
    "Seven","Eight","Nine","Ten","Jack","Queen","King"};
  const char *std_suit_name[4] = {"Spades","Clubs","Hearts","Diamonds"};

  int j, k, i=0;
  for(j=0; j<4; j++){
    for(k=0; k<13; k++){
      a_card.suit=j; a_card.card=k;
      std_deck[i++] = a_card;
    }
  }

  //check our work
  printf("In a game of rummy:\n");
  for(i=0;i<52;i++){
    printf("  %-5s of %-8s is worth %2d points.\n",
        std_card_name[std_deck[i].card],
        std_suit_name[std_deck[i].suit],
        rummy_value[std_deck[i].card]);
  }

  //a different kind of game.
  enum round_mode {SHEILD_TRUMP, FLOWER_TRUMP, BELL_TRUMP, ACORN_TRUMP, BOCK, GEISS} mode;
  const card jass_deck[36]={
    {0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},
    {1,1},{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{1,8},
    {2,2},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7},{2,8},
    {3,3},{3,1},{3,2},{3,3},{3,4},{3,5},{3,6},{3,7},{3,8},
  };
#define JASS_V {11,0,0,0,0,10,2,3,4}
  const unsigned short int jass_value[9] = JASS_V;
#define JASS_TRUMP_V {11,0,0,0,14,10,20,3,4}
  const unsigned short int jass_trump_value[9] = JASS_TRUMP_V;
#define JASS_BOCK_V {11,0,0,8,0,10,2,3,4}
  const unsigned short int jass_bock_value[9] = JASS_BOCK_V;
#define JASS_GEISS_V {0,11,0,8,0,10,2,3,4}
  const unsigned short int jass_geiss_value[9] = JASS_GEISS_V;
  const char *jass_card_name[9] = {"Ace","Six","Seven","Eight","Nine","Banner",
    "Under","Ober","King"};
  const char *jass_suit_name[4] = {"Sheilds","Flowers","Bells","Acorns"};
  const unsigned short int jass_all_value[6][4][9] = {
    { JASS_TRUMP_V, JASS_V, JASS_V, JASS_V },
    { JASS_V, JASS_TRUMP_V, JASS_V, JASS_V },
    { JASS_V, JASS_V, JASS_TRUMP_V, JASS_V },
    { JASS_V, JASS_V, JASS_V, JASS_TRUMP_V },
    { JASS_BOCK_V, JASS_BOCK_V, JASS_BOCK_V, JASS_BOCK_V },
    { JASS_GEISS_V, JASS_GEISS_V, JASS_GEISS_V, JASS_GEISS_V }
  };

  //check our work 2: work goes on summer vacation
  printf("In a game of jass with trump (Sheilds | Flowers | Bells | Acorns) | Bock | Geiss\n");
  for(i=0;i<36;i++){
    printf("  %-6s of %-7s is worth %8d%10d%8d%9d%8d%8d\n",
        jass_card_name[jass_deck[i].card],
        jass_suit_name[jass_deck[i].suit],
        jass_all_value[SHEILD_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[FLOWER_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[BELL_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[ACORN_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[BOCK][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[GEISS][jass_deck[i].suit][jass_deck[i].card]);
  }
  return 0;
}

Вывод похож:

In a game of rummy:
  Ace   of Spades   is worth  1 points.
  Two   of Spades   is worth  2 points.
  Three of Spades   is worth  3 points.
  Four  of Spades   is worth  4 points.
  Five  of Spades   is worth  5 points.
...
  Nine  of Diamonds is worth  9 points.
  Ten   of Diamonds is worth 10 points.
  Jack  of Diamonds is worth 10 points.
  Queen of Diamonds is worth 10 points.
  King  of Diamonds is worth 10 points.
In a game of jass with trump (Sheilds | Flowers | Bells | Acorns) | Bock | Geiss
  Ace    of Sheilds is worth       11        11      11       11      11       0
  Six    of Sheilds is worth        0         0       0        0       0      11
  Seven  of Sheilds is worth        0         0       0        0       0       0
  Eight  of Sheilds is worth        0         0       0        0       8       8
  Nine   of Sheilds is worth       14         0       0        0       0       0
  Banner of Sheilds is worth       10        10      10       10      10      10
...
  Under  of Acorns  is worth        2         2       2       20       2       2
  Ober   of Acorns  is worth        3         3       3        3       3       3
  King   of Acorns  is worth        4         4       4        4       4       4

Блэк джек является скучным. Этот код действительно компилирует.

0
ответ дан 5 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: