洗牌一张牌

Shuffling a deck of cards?

本文关键字:一张      更新时间:2023-10-16

i是非常新的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;
}

我看过很多课程的卡程序,但是我什至不确定我们本学期是否要学习这些程序。

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

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

如注释中所建议的,您应该使用struct表示卡片。例如,请参见本文

对于洗牌算法,这是一个提示:如果您可以洗牌N-1卡的甲板,您可以洗牌n牌吗?

为什么要使它复杂?

一包卡包含52个元素。每个元素可以用两个字符表示。如您的帖子中所述,西装和(为了一个更好的单词)数字。构造该数组。您不需要向量的费用等。阵列的大小是固定的。52个项目,每个项目2个字符。

然后有一个循环 - 运行,看起来像您想要的那样多次。

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

去阅读乔恩·本特利(Jon Bentley)的编程珍珠。在第一章中,有一种用于生成随机排列的算法。该算法以同样的可能性生成每个排列,更重要的是,在阅读它结束时,您将了解为什么。

他的算法使用单个索引进行排列。在您的情况下,请使用n = 52,并通过(整数)商生成两个索引,然后在4.分开后剩余的零件。商给您一个卡索引;其余的给您西装。