将一副扑克牌中的52张牌1 随机打乱,然后依次发牌,知道发完整副扑克牌.
可以将整个实现过程分为3步
创建数组存放牌面和花色以及每一张牌->定义shuffle函数洗牌->定义deal函数发牌
实现过程
第一步
face数组用于存放13种牌面,定义时直接将其初始化.const用于修饰数组避免传参时修改原始数组.
const string face[13] = { "Ace","Two","Three","Four","Five",
"Six","Seven","Eight","Nine","Ten","Jack","Queen","King" };
suit数组用于存放4种花色,定义时也将其初始化
const string suit[4] = { "Heart","Diamond","Clubs","Spades" };
二维数组deck数组用于存放52张牌,用整数1-52作为标记在定义时进行初始化
int deck[4][13] = { 0 };
int deck_num = 1;
for (int counter = 0; counter <= 3; counter++)
{
for (int counter1 = 0; counter1 <= 12; counter1++)
{
deck[counter][counter1] = deck_num;
deck_num++;
}
}
第二步
shuffle函数声明
void shuffle(int deck[][13], int size);
将deck数组传入,随机打乱二维数组传参时必须直接传入列宽
具体算法为:进入一个52次的循环,依次将1-52号牌与随机一张牌交换.随机牌的行列位置使用两个随机数算出.
void shuffle(int deck[][13], int size)//洗牌函数
{
srand(time(NULL));
int row = 0, colunm = 0;//确定被换的牌的行列位置,循环一次列数+1,
//列数>12时行数+1列数归零
for (int counter = 1; counter <= 52; counter++)
{
int rand_row = rand() % 3;
int rand_colunm = rand() % 12;//随机牌行列位置随机数
int temp = deck[row][colunm];
deck[row][colunm] = deck[rand_row][rand_colunm];
deck[rand_row][rand_colunm] = temp;
colunm++;
if (colunm > 12)//换行
{
row++;
colunm = 0;
}
}
}
第三步
deal函数声明
void deal(int deck[][13],int size_deck,
const string face[], int size_face,
const string suit[], int size_suit);
传入打乱后的deck数组,face数组,suit数组,从1-52依次展示每张牌的牌面和花色.
具体算法为:进入一个52次的循环,依次寻找1-52号牌并打印牌面.
void deal(int deck[][13], int size_deck, const string face[], int size_face, const string suit[], int size_suit)//发牌函数
{
int row = 0, colunm = 0;//从第一张牌开始依次查找,未找到则列数+1,列数>12时行数+1列数归零.找到后行列数都归零,counter+1,开始查找下一张牌.
for (int counter = 1; counter <= 52; counter++)
{
if (counter == deck[row][colunm])
{
cout << left << setw(3) << "第" << setw(3) << counter
<< setw(8) << "张牌是:" << suit[row] << face[colunm]
<< endl;
row = 0;
colunm = 0;
}
else
{
counter--;
colunm++;
}
if (colunm > 12)
{
row++;
colunm = 0;
}
}
}
运行结果
完整代码
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <string>
#include <conio.h>
using namespace std;
void shuffle(int deck[][13], int size);
void deal(int deck[][13], int size_deck, const string face[], int size_face, const string suit[], int size_suit);
int main()
{//初始化deck,face,suit数组
int deck[4][13] = { 0 };
int deck_num = 1;
for (int counter = 0; counter <= 3; counter++)
{
for (int counter1 = 0; counter1 <= 12; counter1++)
{
deck[counter][counter1] = deck_num;
deck_num++;
}
}
const string face[13] = { "Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King" };
const string suit[4] = { "Heart","Diamond","Clubs","Spades" };
shuffle(deck, 4);
shuffle(deck, 4);
deal(deck, 4, face, 13, suit, 4);
char ch = _getch();
return 0;
}
void shuffle(int deck[][13], int size)//洗牌
{
srand(time(NULL));
int row = 0, colunm = 0;
for (int counter = 1; counter <= 52; counter++)
{
int rand_row = rand() % 3;
int rand_colunm = rand() % 12;
int temp = deck[row][colunm];
deck[row][colunm] = deck[rand_row][rand_colunm];
deck[rand_row][rand_colunm] = temp;
colunm++;
if (colunm > 12)//换行
{
row++;
colunm = 0;
}
}
}
void deal(int deck[][13], int size_deck, const string face[], int size_face, const string suit[], int size_suit)//发牌
{
int row = 0, colunm = 0;
for (int counter = 1; counter <= 52; counter++)
{
if (counter == deck[row][colunm])
{
cout << left << setw(3) << "第" << setw(3) << counter << setw(8) << "张牌是:" << suit[row] << face[colunm] << endl;
row = 0;
colunm = 0;
}
else
{
counter--;
colunm++;
}
if (colunm > 12)
{
row++;
colunm = 0;
}
}
}
除去大小王 ↩︎