Перетасовывать колоду карт?

Я очень новичок в C++, и я до сих пор не рассмотрел основные концепции, но мой профессор хочет, чтобы мы написали алгоритм для перемешивания и отображения колоды карт, и колода должна быть представлена ​​в виде двумерного массива.

Однако у меня возникли проблемы с симуляцией колоды карт!

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<char> 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(card[j] suit[i]);
        }       
    }

    return 0;
}

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

4 ответа

Используя простую структуру, вы можете редактировать свой код следующим образом:

#include <iostream>
#include <vector>

using namespace std;

struct Card {
  char suit, number;
  Card(char aSuit, char aNumber) : suit(aSuit), number(aNumber) { }
};

int main() {
    vector<Card> deck;
    char suit[] = {'h','d','c','s'};
    char num[] = {'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(Card(suit[i], num[j]);
        }
    }

    // now, deck[0] to deck[51] hold all the cards
    // first card's suit is deck[0].suit, number is deck[0].number

    return 0;
}

Читайте " Программирование жемчужин" Джона Бентли. В первой главе описан алгоритм генерации случайных перестановок. Алгоритм генерирует каждую перестановку с равной вероятностью, и, более того, к концу чтения вы поймете почему.

Его алгоритм использует один индекс для перестановки. В вашем случае используйте N=52 и сгенерируйте два ваших индекса по (целочисленному) коэффициенту и остатку после деления на 4. Коэффициент дает вам карточный индекс; остаток дает вам костюм.

Как предлагается в комментариях, вы должны использовать структуру для представления карты. Смотрите, например, эту статью

Для алгоритма перемешивания есть подсказка: если вы можете перемешать колоду из n-1 карт, можете ли вы перемешать колоду из n карт?

Зачем усложнять?

Колода карт содержит 52 элемента. Каждый элемент может быть обозначен двумя символами. Как упомянуто в вашем посте, костюм и (если хотите лучшего слова) номер. Построить этот массив. Вам не нужно расходовать векторы и т. Д. Размер массива фиксирован. 52 предмета, каждый предмет 2 символа.

Затем сделайте цикл - запустите, который будет выглядеть столько раз, сколько вы хотите.

Каждый раз в цикле выбирали два элемента от 0 до 51 (помните, что в мире C++ все начинается с нуля). Эти два числа являются случайными (см. Rand). Поменяйте их местами (оба символа - или желательно использовать struct).

Другие вопросы по тегам