扑克牌

 

使用随机算法生成一副扑克牌,并分发到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、付费专栏及课程。

余额充值