扑克牌

 

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

 

以下是输出的结果:

第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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值