当前位置:文档之家› 模拟洗牌发牌的过程

模拟洗牌发牌的过程

模拟洗牌发牌的过程
模拟洗牌发牌的过程

07112003

上机题目:模拟“双地主”发牌洗牌的过程

林伟宏07112003 专业:信息与计算科学

时间:10.23 晚上六点(周二)

地点:E205

实验目的:熟悉各种函数的操作过程

实验方法:上网查找qsort函数的使用,rand函数的使用,自定义函数poker的使用

程序流程描述:

第一步:用rand函数产生0-51个随机数,并判断随机数是否已重复,重复的重新产生

第二步:将52个随机数按位置顺序平均分成四份,分别发给四个数组b,c,d,e

第三步:用qsort函数分别将四个人的牌按从小到大排序

第四步:用自定义的函数poker将四个人手中的随机数转换成对应的花色和点数

程序:

// 07112003.cpp : Defines the entry point for the console application.

//这是我们家乡人(广东)玩的一种牌类游戏,叫“双地主”即黑桃三和黑桃A是双地主,此牌中黑桃三最大,方块四最小,

//花色大小黑桃>红桃>草花>方块,3>2>A>K>Q>J>10>9>8>7>6>5>4

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include "time.h"

int comp(const void*p1,const void*p2);//自己定义一个比较大小并排序的函数

void poker(int x[]);//自己定义一个函数,将0~51的数转换成扑克牌牌面

void main()

{

int a[52],b[13],c[13],d[13],e[13];//定义数组a用来装0~51的随机数,数组b,c,d,e分别表示四个玩家

int b1=0,c1=0,d1=0,e1=0,t=0,i,f,flag;

{

srand(time(0));//用到rand()必须的标准格式

while(t<52)//控制随机产生52个数

{

f=rand()%52;flag=1;

for(i=0;i<52&&flag;i++)

if(f==a[i]) flag=0;//flag=1:产生的随机数没有重复;flag=0:产生的随机数已重复

if(flag)

{

a[t]=f;//将没有重复的随机数放入数组a中

switch(t/13)//将52个随机数分成的四组数分别放入b,c,d,e四个数组中;相当于每人一次拿13张

{

case 0: b[b1++]=a[t];break;

case 1: c[c1++]=a[t];break;

case 2: d[d1++]=a[t];break;

case 3: e[e1++]=a[t];break;

}

t++;

}

}

qsort(b,13,sizeof(int),comp);//将b数组中的数按照从小到大排序,后面调用comp函数实现这个功能

qsort(c,13,sizeof(int),comp);

qsort(d,13,sizeof(int),comp);

qsort(e,13,sizeof(int),comp);

printf("PLAYER1:\n");poker(b);//调用poker()函数

printf("PLAYER2:\n");poker(c);

printf("PLAYER3:\n");poker(d);

printf("PLAYER4:\n");poker(e);

}

}

int comp(const void*p1,const void*p2)//qsort调用的函数

{

return(*(int*)p1-*(int*)p2);

}

void poker(int x[])

{

int i;

char y[]={'4','5','6','7','8','9','0','J','Q','K','A','2','3'};

for(i=0;i<13;i++)

{

switch(x[i]/13)

{

case 0:

{

printf("%c",004);//ASCII表中004表示方块

if(y[x[i]%13]=='0') printf("%d",10);

else printf("%c",y[x[i]%13]);break;

}

case 1:

{

printf("%c",005);//ASCII中005表示草花

if(y[x[i]%13]=='0') printf("%d",10);

else printf("%c",y[x[i]%13]);break;

}

case 2:

{

printf("%c",003);//ASCII中003表示红桃

if(y[x[i]%13]=='0') printf("%d",10);

else printf("%c",y[x[i]%13]);break;

}

case 3:

{

printf("%c",006);//ASCII中006表示黑桃

if(y[x[i]%13]=='0') printf("%d",10);

else printf("%c",y[x[i]%13]);break;

}

}

}

printf("\n");

}

实验结果:

????单行显示,按花色顺序先排列,再将点数从小到大排列第一次实验结果;

第二次实验结果:

第三次实验结果

相关主题
文本预览
相关文档 最新文档