使用随机算法生成一副扑克牌,并分发到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