使用随机算法生成一副扑克牌,并分发到4个游戏者手中。
算法使用另一篇提到的乱序算法,由于比较简单,并没有做对象包装。
另外,随机算法可以改进为多副牌的随机。
// Poke.cpp : Defines the entry point for the console application.
// 编写:xmxoxo
// 日期:2006-11-12
// 版本:v1.0
#include "stdafx.h"
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
//花色常数
const char str_spade[]="黑桃";
const char str_diamonds[]="方块";
const char str_heart[]="红心";
const char str_clubs[]="草花";
const char str_king[]="王";
const char cardname[5][5]={"黑桃","方块","红心","草花","王"};
// str_spade,str_diamonds,str_heart,str_clubs,str_king};
//"黑桃","方块","红心","草花","王"
//
//枚举花色
enum cardcolor
{
spade=0, //0黑桃
diamonds=1, //1方块
heart=2, //2红心
clubs=3, //3草花
king=4 //4大小王
};
//定义一副牌的张数
const unsigned short int size_card=54;
//定义牌
struct pcard
{
cardcolor color; //花色 0黑桃 1方块 2红心 3草花 4大小王
int value; //点数 1-13,color=4,value=1,小王;color=4,value=2,大王
};
//定义标准54张牌数组
pcard arrPoke[size_card];
//定义游戏者结构
struct player
{
short int direction; //方向 0东 1南 2西 3北
pcard pcards[26]; //手上的牌,最多26张,两副
bool SetCard(pcard []); //设置牌方法
};
bool player::SetCard(pcard PlayerCard[])
{
//pcards[0]=a;
return 0;
}
//定义4个游戏者
player arrPlayer[3];
//初始化
void init()
{
int i=0;
int j=0;
//先初始化一副牌
//先放小王和大王
arrPoke[0].color = king;
arrPoke[0].value = 1;
arrPoke[1].color = king;
arrPoke[1].value = 2;
//再放四色牌
for (i=0;i<4;i++)
{
for (j=1;j<=13;j++)
{
arrPoke[i*13+j+1].color = (cardcolor) i;
arrPoke[i*13+j+1].value = j;
}
}
}
//生成[a,b]之间的随机整数
int Random (int a, int b)
{
int area=0;
int ret=0;
//生成区间
area=b-a+1;
//生成随机数
ret=(int)(rand()*area/(1.0 * RAND_MAX)+a);
return ret;
}
//生成0-n不重复的随机数字
void GetRand(int n,int arr[])
{
int i; //数组下标
int p; //存放随机数的变量
int tmp; //用于交换数据的临时变量
for (i=0;i<=n;i++)
{
arr[i]=i;
}
for (i=n;i>0;i--)
{
p=Random(0,i); //生成随机数
tmp=arr[p]; //将随机数下标与最后位置对换
arr[p]=arr[i];
arr[i]=tmp;
}
}
//洗牌,得到洗过后的牌result[]
void RandCard(pcard result[])
{
int i=0;
int p=0;
//随机取牌数组
int sign[size_card];
//开始洗,[0,size_card-1]
GetRand(size_card-1,sign);
//取牌
for (i=0;i<size_card;i++)
{
result[i] =arrPoke[sign[i]];
}
}
//输出牌函数
void output(pcard arr[])
{
int i=0;
for (i=0;i<size_card;i++)
{
printf("%4s%2d ",cardname[(int)arr[i].color], arr[i].value);
if (i==size_card-7)
{
printf(" 以下6张底牌: ");
}
else
{
if (i<size_card-7)
{
if (i%4==3)
printf(" ");
}
}
}
printf(" ");
}
//用于打的牌
pcard useCard[2*size_card];
//主程式
int main(int argc, char* argv[])
{
srand((unsigned)time(NULL));
int i;
/*
// 测试随机
int j;
int testaa[54];
for (j=0;j<10;j++)
{
for (i=0;i<54;i++)
testaa[i]=i;
GetRand(53,testaa);
for (i=0;i<54;i++)
{
//printf("%2d,",Random(0,9));
printf("%2d,",testaa[i]);
//printf("%2d,",(int)(rand()*10/(1.0 * RAND_MAX)));
if (i%10==9 && i>0)
printf(" ");
}
printf(" ");
}
return 0;
*/
//初始化
init();
//output(arrPoke);
for (i=1;i<=2;i++)
{
printf("第%d次洗牌 ",i);
//洗牌
RandCard(useCard);
//输出洗后的牌
output(useCard);
printf(" ");
}
return 0;
}
// 编写:xmxoxo
// 日期:2006-11-12
// 版本:v1.0
#include "stdafx.h"
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
//花色常数
const char str_spade[]="黑桃";
const char str_diamonds[]="方块";
const char str_heart[]="红心";
const char str_clubs[]="草花";
const char str_king[]="王";
const char cardname[5][5]={"黑桃","方块","红心","草花","王"};
// str_spade,str_diamonds,str_heart,str_clubs,str_king};
//"黑桃","方块","红心","草花","王"
//
//枚举花色
enum cardcolor
{
spade=0, //0黑桃
diamonds=1, //1方块
heart=2, //2红心
clubs=3, //3草花
king=4 //4大小王
};
//定义一副牌的张数
const unsigned short int size_card=54;
//定义牌
struct pcard
{
cardcolor color; //花色 0黑桃 1方块 2红心 3草花 4大小王
int value; //点数 1-13,color=4,value=1,小王;color=4,value=2,大王
};
//定义标准54张牌数组
pcard arrPoke[size_card];
//定义游戏者结构
struct player
{
short int direction; //方向 0东 1南 2西 3北
pcard pcards[26]; //手上的牌,最多26张,两副
bool SetCard(pcard []); //设置牌方法
};
bool player::SetCard(pcard PlayerCard[])
{
//pcards[0]=a;
return 0;
}
//定义4个游戏者
player arrPlayer[3];
//初始化
void init()
{
int i=0;
int j=0;
//先初始化一副牌
//先放小王和大王
arrPoke[0].color = king;
arrPoke[0].value = 1;
arrPoke[1].color = king;
arrPoke[1].value = 2;
//再放四色牌
for (i=0;i<4;i++)
{
for (j=1;j<=13;j++)
{
arrPoke[i*13+j+1].color = (cardcolor) i;
arrPoke[i*13+j+1].value = j;
}
}
}
//生成[a,b]之间的随机整数
int Random (int a, int b)
{
int area=0;
int ret=0;
//生成区间
area=b-a+1;
//生成随机数
ret=(int)(rand()*area/(1.0 * RAND_MAX)+a);
return ret;
}
//生成0-n不重复的随机数字
void GetRand(int n,int arr[])
{
int i; //数组下标
int p; //存放随机数的变量
int tmp; //用于交换数据的临时变量
for (i=0;i<=n;i++)
{
arr[i]=i;
}
for (i=n;i>0;i--)
{
p=Random(0,i); //生成随机数
tmp=arr[p]; //将随机数下标与最后位置对换
arr[p]=arr[i];
arr[i]=tmp;
}
}
//洗牌,得到洗过后的牌result[]
void RandCard(pcard result[])
{
int i=0;
int p=0;
//随机取牌数组
int sign[size_card];
//开始洗,[0,size_card-1]
GetRand(size_card-1,sign);
//取牌
for (i=0;i<size_card;i++)
{
result[i] =arrPoke[sign[i]];
}
}
//输出牌函数
void output(pcard arr[])
{
int i=0;
for (i=0;i<size_card;i++)
{
printf("%4s%2d ",cardname[(int)arr[i].color], arr[i].value);
if (i==size_card-7)
{
printf(" 以下6张底牌: ");
}
else
{
if (i<size_card-7)
{
if (i%4==3)
printf(" ");
}
}
}
printf(" ");
}
//用于打的牌
pcard useCard[2*size_card];
//主程式
int main(int argc, char* argv[])
{
srand((unsigned)time(NULL));
int i;
/*
// 测试随机
int j;
int testaa[54];
for (j=0;j<10;j++)
{
for (i=0;i<54;i++)
testaa[i]=i;
GetRand(53,testaa);
for (i=0;i<54;i++)
{
//printf("%2d,",Random(0,9));
printf("%2d,",testaa[i]);
//printf("%2d,",(int)(rand()*10/(1.0 * RAND_MAX)));
if (i%10==9 && i>0)
printf(" ");
}
printf(" ");
}
return 0;
*/
//初始化
init();
//output(arrPoke);
for (i=1;i<=2;i++)
{
printf("第%d次洗牌 ",i);
//洗牌
RandCard(useCard);
//输出洗后的牌
output(useCard);
printf(" ");
}
return 0;
}
以下是输出的结果:
第1次洗牌
方块13 草花12 红心 6 方块 9
王 1 方块12 红心 2 王 2
草花 6 红心 8 草花 3 红心 3
红心 5 黑桃 4 方块 6 草花11
方块 2 黑桃 6 红心 9 红心 4
红心11 草花 8 黑桃 9 草花 2
黑桃13 草花 4 草花 9 红心13
方块 4 方块 3 方块 1 红心12
黑桃12 红心 7 黑桃 8 方块11
草花10 方块 7 草花 7 黑桃10
黑桃11 黑桃 3 红心 1 黑桃 7
草花 1 方块10 黑桃 2 方块 8
以下6张底牌:
草花 5 红心10 草花13 方块 5 黑桃 5 黑桃 1
第2次洗牌
红心 4 草花 6 方块 3 方块13
黑桃 3 草花 2 方块 7 黑桃11
方块12 黑桃10 方块 2 黑桃 4
黑桃 1 方块 5 黑桃12 草花 4
方块10 红心13 红心 1 王 1
草花 8 方块 4 红心 3 黑桃 6
草花11 方块11 红心 9 黑桃 8
草花 3 草花12 黑桃 2 红心10
草花 7 方块 6 方块 1 红心 2
草花13 黑桃 7 红心 7 黑桃 5
草花10 草花 5 方块 8 黑桃13
红心11 红心 6 草花 9 王 2
以下6张底牌:
黑桃 9 方块 9 红心12 草花 1 红心 5 红心 8