【问题描述】 编程模拟洗牌和发牌过程。一副扑克有52张牌,分为4种花色(suit):黑桃(Spades)、红桃(Hearts)、草花(Clubs)、方块(Diamonds)。每种花色又有13张牌面(face):A,2,3,4,5,6,7,8,9,10,Jack,Queen,King。要求用结构体数组card表示52张牌,每张牌包括花色和牌面两个字符型数组类型的数据成员。
模拟洗牌即为:将这52张牌随机打散;发牌过程即为:将打散后的52张牌输出到屏幕上。
【方法1】可以用随机函数生成一个1-52之间的随机数,然后模拟该牌已被选中,但是,请注意避免后续生成的随机数在之前已经生成过产生重复。
【方法2】可以用随机函数生成1-13数字之间的一个随机数,随机生成1-4之间的花色的一个随机数,然后组合为一张牌,并记录该牌已被选中。
【方法3】随机生成一个1-52之间的数字后,将该数字代表的牌和指定的某个数字的牌进行交换,连续生成52次随机数,连续交换52次。
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<time.h>
using namespace std;
struct card{char suit[10];char face[10];
};
int main(){srand(time(NULL));
struct card c[52];
char Suit[4][10]={"Spades","Hearts","Clubs","Diamonds"};
char Face[13][10]={"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
for(int i=0;i<52;i++)
{strcpy(c[i].suit,Suit[i/13]);strcpy(c[i].face,Face[i%13]);} for(int i=0;i<52;i++){// cout<<c[i].face<<" "<<c[i].suit<<endl;}int counter=0;//保存生成的数 struct card temp;//用于交换 for(int i=0;i<52;i++)//输出52次 {counter=rand()%(52-i); //在前面没有(52-i)个没有输出的选择一个输出 cout<<c[counter].face<<" "<<c[counter].suit<<endl;temp=c[51-i];c[51-i]=c[counter];//输出过的后边去 c[counter]=temp;}}