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");
}
实验结果:
????单行显示,按花色顺序先排列,再将点数从小到大排列第一次实验结果;
第二次实验结果:
第三次实验结果