扑克牌的洗牌和分发
假设有一副扑克牌,包含52张牌,模拟洗牌和分发的过程,编写程序实现这个过程,并输出相应的结果。
本问题可以进一步拓展:
1.加上大王、小王,共计54张牌,实现相应的过程。
2.共计4副牌,分发给4个人,或者6个人,或者8个人,实现相应的过程。注意,多副牌分发给多个人时,可能出现每一个人的牌的数量不一样。
3.分发给每个人一手牌后,增加理牌,分别按照面值、或者花色进行理牌(即手中的牌按照面值或者花色进行排序,然后输出)。
下面是参考程序,不包括拓展部分。
程序运行结果如下:
一副扑克牌的初始状态
方块K 方块A 方块2 方块3 方块4 方块5 方块6 方块7 方块8 方块9 方块10 方
块J 方块Q 梅花K 梅花A 梅花2 梅花3 梅花4 梅花5 梅花6 梅花7 梅花8 梅花9
梅花10 梅花J 梅花Q 红心K 红心A 红心2 红心3 红心4 红心5 红心6 红心7
红心8 红心9 红心10 红心J 红心Q 黑桃K 黑桃A 黑桃2 黑桃3 黑桃4 黑桃5 黑
桃6 黑桃7 黑桃8 黑桃9 黑桃10 黑桃J 黑桃Q
经过洗牌后一副牌的状态如下
黑桃K 梅花J 黑桃A 红心3 方块9 红心A 黑桃4 方块8 黑桃6 方块5 梅花6 梅
花10 红心2 梅花9 方块K 黑桃Q 红心8 方块10 红心6 红心10 梅花K 方块6 黑
桃3 方块Q 红心7 红心4 方块3 黑桃7 梅花4 方块A 黑桃8 红心5 梅花8 梅花2
方块7 红心J 黑桃J 梅花3 红心K 方块2 黑桃9 黑桃2 红心Q 梅花A 梅花Q
红心9 梅花7 黑桃5 梅花5 黑桃10 方块4 方块J
将一副52张的牌分发给4个人,4 个人手中的牌分别如下(没有理牌的状态):
黑桃K 方块9 黑桃6 红心2 红心8 梅花K 红心7 梅花4 梅花8 黑桃J 黑桃9 梅
花Q 梅花5
梅花J 红心A 方块5 梅花9 方块10 方块6 红心4 方块A 梅花2 梅花3 黑桃2 红
心9 黑桃10
黑桃A 黑桃4 梅花6 方块K 红心6 黑桃3 方块3 黑桃8 方块7 红心K 红心Q 梅
花7 方块4
红心3 方块8 梅花10 黑桃Q 红心10 方块Q 黑桃7 红心5 红心J 方块2 梅花A
黑桃5 方块J
#include<iostream>
using namespace std;
#include<cstdlib>
#include<ctime>
void ShowOnePerk(int num) //输出一张扑克牌
{
int x,y;
num=num%52;
x=num%13;y=num/13;
if(y==0) cout<<"方块";
else if(y==1) cout<<"梅花";
else if(y==2) cout<<"红花";
else if(y==3) cout<<"黑桃";
if(x==0) cout<<"K ";
else if(x==1) cout<<"A ";
else if(x==11) cout<<"J ";
else if(x==12) cout<<"Q ";
else cout<<x<<" ";
}
void MakeRandPerk(int a[],int n) //洗牌
{
int x,y,temp;
srand(time(0));
for(int i=0;i<10000;i++)
{
x=rand()%52;
y=rand()%52;
temp=a[x];
a[x]=a[y];
a[y]=temp;
}
}
void ShowPerk(int a[],int n) //输出含有n个牌的一手扑克牌
{
for(int i=0;i<n;i++)
ShowOnePerk(a[i]);
cout<<endl;
}
void ToFourPerson(int a[],int n,int person[][13]) //将52张牌分发给四个人
{
int k=0;
for(int j=0;j<13;j++)
for(int i=0;i<4;i++)
{
person[i][j]=a[k];
k++;
}
}
void ShowFourPerson(int person[][13],int n) //输出每个玩家手中的牌
{
for(int i=0;i<n;i++)
{
for(int j=0;j<13;j++)
ShowOnePerk(person[i][j]);
cout<<endl<<endl;
}
}
void main()
{
int a[52];
for(int i=0;i<52;i++)
a[i]=i;
cout<<"一副扑克牌的初始状态"<<endl;
ShowPerk(a,52);cout<<endl;
MakeRandPerk(a,52);
cout<<"经过洗牌后一副牌的状态如下:"<<endl;
ShowPerk(a,52);cout<<endl;
int person[4][13];
ToFourPerson(a,52,person);
cout<<"发牌,参赛者的牌如下:"<<endl;cout<<endl;
ShowFourPerson(person,4);cout<<endl;
}