洗牌一张牌
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.分开后剩余的零件。商给您一个卡索引;其余的给您西装。
相关文章:
- 如何从另一张地图构造一张地图
- C++显示图像并将其保持到下一张图像的最佳方法
- OpenGL Ping Pong可与一张通行证一起工作,而不是两个通行证
- 画一张卡,并打电话给它
- 洗牌一张牌
- 检查一张图片是否与另一张图片偏移
- 在 Windows 中自动将 xlsx 文件转换为多个 (MS-DOS) CSV 文件(每张一张一个)
- 把一个价格(例如89.95美元)读成一张双人床
- 如何将地图的反面复制到另一张地图上
- CUDA,我需要一张新卡吗?1.0、1.1、2.0、2.1的差异
- 如何找到不在另一张地图的键中的地图键
- 有没有一张多维地图
- 用c++中的printf制作一张表格
- 用简单的opengl图像库(SOIL)加载一张图像(颜色空间:GRAY)
- 找一张智能地图
- 使用openCv的嘴巴检测只在一张脸上返回很多圆圈
- 每隔一秒捕捉一张图像
- 一张未经设计的地图会是一个不错的选择吗
- 从地图中获取详细信息并将其保存到另一张地图中
- 在OpenCV中将两张撕破的纸合并成一张图像