0

我对 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

4 回答 4

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;
}
于 2012-11-05T20:04:07.613 回答
0

正如评论中所建议的,您应该使用结构来表示卡片。例如见这篇文章

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

于 2012-11-05T20:01:46.597 回答
0

为什么要复杂化?

一包卡片包含 52 个元素。每个元素可以用两个字符表示。正如您在帖子中提到的那样,西装和(为了更好的词)号码。构造该数组。您不需要向量等费用。数组的大小是固定的。52 项,每项 2 个字符。

然后有一个循环 - 运行你希望的多次。

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

于 2012-11-05T20:03:16.907 回答
0

去阅读 Jon Bentley 的Programming Pearls。在第一章中,有一个生成随机排列的算法。该算法以相等的可能性生成每个排列,更重要的是,在阅读它的最后,你会明白为什么。

他的算法使用单个索引进行排列。在您的情况下,使用 N=52 并通过(整数)商和除以 4 后的余数生成两个索引。商为您提供卡片索引;剩下的给你一套西装。

于 2012-11-05T20:25:18.180 回答