洗牌一副牌?

时间:2012-11-05 19:52:43

标签: c++ algorithm shuffle playing-cards

我是非常 C ++的新手,我还没有完全围绕基本概念,但我的教授希望我们编写一个算法来随机播放并显示一副牌和套牌需要表示为2d数组。

然而,我在模拟卡片组时遇到了麻烦!

#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 个答案:

答案 0 :(得分:2)

使用简单的结构,您可以像这样编辑代码:

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

答案 1 :(得分:0)

根据评论中的建议,您应该使用结构来表示卡片。例如,请参阅this article

对于洗牌算法,这里有一个提示:如果你可以洗牌一副n-1牌,你可以洗牌吗?

答案 2 :(得分:0)

为什么要让它变得复杂?

一副牌包含52个元素。每个元素可以用两个字符表示。正如你的帖子中提到的诉讼和(想要一个更好的词)号码。构造该数组。你不需要花费矢量等。数组的大小是固定的。 52项,每项2个字符。

然后有一个循环 - 运行看起来任意多次。

每次循环选择0-51之间的两个项目(记住在C ++世界中,事物从零开始)。这两个数字是随机的(见rand)。交换它们(两个字符 - 或者最好使用struct)。

答案 3 :(得分:0)

阅读Jon Bentley的 Programming Pearls 。在第一章中,有一种用于生成随机排列的算法。该算法以相同的可能性生成每个排列,并且在阅读结束时,您将理解为什么。

他的算法使用单个索引进行排列。在你的情况下,使用N = 52并用(整数)商生成你的两个指数,然后除以4后的余数。商给你一个卡指数;其余的给你一套。