数据结构扑克牌发牌问题.docx

上传人:b****3 文档编号:26498683 上传时间:2023-06-20 格式:DOCX 页数:10 大小:48.03KB
下载 相关 举报
数据结构扑克牌发牌问题.docx_第1页
第1页 / 共10页
数据结构扑克牌发牌问题.docx_第2页
第2页 / 共10页
数据结构扑克牌发牌问题.docx_第3页
第3页 / 共10页
数据结构扑克牌发牌问题.docx_第4页
第4页 / 共10页
数据结构扑克牌发牌问题.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据结构扑克牌发牌问题.docx

《数据结构扑克牌发牌问题.docx》由会员分享,可在线阅读,更多相关《数据结构扑克牌发牌问题.docx(10页珍藏版)》请在冰豆网上搜索。

数据结构扑克牌发牌问题.docx

数据结构扑克牌发牌问题

内容:

问题重述:

设计一个四个人玩的纸牌游戏的程序,一共有五十四张牌,要发给四个人,并且每次发出的牌都不一样。

并且符合纸牌的规则(可以是桥牌、升级、红四、斗地主等,但是必须说明规则)。

并且程序能按照设定的游戏规则从小到大进行排序,如果有底牌的话要说明底牌的情况。

最后要验证每次发牌是否合法。

该程序纸牌的玩法:

在一副牌中,去除大小王,然后2最大其次是A,然后按顺序从大到小一次减小。

所用到的具体算法:

冒泡法,

线性表删除元素操作;

具体做法为:

先将一副扑克牌中的大小王拿掉,还会剩下52张牌,在进行随机的洗牌,将所有的排顺序打乱,然后在打乱后一定的顺序情况下,按照规则平均分发给四个人,每人会得到十三张牌,最后将每人手里的牌按照3、4、5、6、7、8、9、10、J、Q、K、A、2的顺序进行排列,在排列过程中会出现花色的前后顺序排列。

再将四个人手里的拍验证,检验是否每张牌是否都出现并且只出现一次。

如果出现并且只出现一次,说明程序成功,否则程序失败,则需要重新进行程序的检验,修改。

流程图大致情况:

设计的结构体变量说明:

charCardColor是存储花色的变量

charCardNumber[2]是存储扑克牌的面值变量

intflag;//判断标志

structpukepaiCard[52]用char类型存储52张扑克牌

intcard[52]用int类型形式

并且,我们在一开始定义每张牌的变量每张牌现在我们给予赋值,例如108代表方块8,212代表红桃Q,其中三位数中第一为代表花色:

1代表方块,2代表红桃,3代表梅花,4代表黑桃。

01代表A,02代表2,依次类推,11代表J,12代表Q,13代表K。

具体的函数说明均在程序中标注,不再重复说明。

程序执行结果为:

1.

2.

3.

结论:

通过以上多次程序运行,满足了多次结果不相同,并保证每次都会有所有的排出现且仅出现一次。

遇到的问题:

对一些代码的含义不太清楚,用起来不太熟练。

解决方法是,通过学习书上的知识,了解代码含义,多训练慢慢熟练。

 

附录运行程序为:

#include

#include

#include

#include

//**********************************************************

//这是一个模仿五十K的发牌游戏

//定义一个结构体,然后定义一个该结构体的数组Card[52](大写的),存储扑克牌(这个存储的是字符串)

//定义一个int类型的card[52](小写的),来表示扑克牌,比如105,1代表花色(方块),05代表面值5

//再比如313,就是梅花K,401就是黑桃A(ASCII表中3,4,5,6分别表示红桃,方块,梅花,黑桃。

将他们减去2就代表百位的数值)

//再说一下排序,就是设置一个标志位,标识牌的面值的大小3->0,4->1,5->2,......,J->8,Q->9,K->10,A->11,2->12

//然后就是card[52]排序,再转换一下到结构体数组Card[52]就行了.

//**********************************************************

//定义结构体,存储扑克牌

structpukepai

{

charCardColor;//存储花色

charCardNumber[2];//存储扑克牌的面值

intflag;//判断标志,如果按照card[52]排序,那么牌由小到大就是:

A,2,3,4,5,6,7,8,9,10,J,Q,K

//而我们需要由小到大排序是:

3,4,5,6,7,8,9,10,J,Q,K,A,2

};

structpukepaiCard[52];//用char类型存储52张扑克牌

intcard[52];//用int类型形式

//*************************************************

//洗牌函数:

将牌打乱

voidxipai()

{

inti,j,k,temp;

srand(time(0));

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

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

card[i*13+j]=(i+1)*100+j+1;

//printf("howmanytimesforcard:

");

//scanf("%d",&count);

//for(j=1;j<=count;j++)

//洗牌

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

{

k=rand()%(51-i+1)+i;

temp=card[i];

card[i]=card[k];

card[k]=temp;

}

printf("\n");

}

//*************************************************

//转换函数:

card[52]->Card[52],将牌的存储由int类型转换为char类型

voidzhuanhuan()

{

inti,temp;

//将数字转换为牌

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

{

Card[i].CardColor=card[i]/100+2;

temp=card[i]%100;

if(temp==1)

{

Card[i].CardNumber[0]='A';

Card[i].CardNumber[1]='\0';

continue;

}

if(temp==10)

{

Card[i].CardNumber[0]='1';

Card[i].CardNumber[1]='0';

continue;

}

if(temp==11)

{

Card[i].CardNumber[0]='J';

Card[i].CardNumber[1]='\0';

continue;

}

if(temp==12)

{

Card[i].CardNumber[0]='Q';

Card[i].CardNumber[1]='\0';

continue;

}

if(temp==13)

{

Card[i].CardNumber[0]='K';

Card[i].CardNumber[1]='\0';

continue;

}

Card[i].CardNumber[0]=temp+48;

Card[i].CardNumber[1]='\0';

}

//设置标志位,用来判断牌的面值大小

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

{

Card[i].CardColor=card[i]/100+2;

temp=card[i]%100;

//一律将面值减3作为标志位

Card[i].flag=temp-3;

//如果是A或者是2,那么标志加上13

if(temp==1||temp==2)

Card[i].flag+=13;

}

}

//*************************************************

//排序:

对char[52]进行排序(不管花色,只看牌的面值)

voidpaixu()

{

inti,j,k;

structpukepaitemp;

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

{

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

for(k=0;k<12;k++)

{

//不管花色,只看牌的面值,所以要对100求余,然后再比较

if(Card[i*13+k].flag>Card[i*13+k+1].flag)

{

temp=Card[i*13+k];

Card[i*13+k]=Card[i*13+k+1];

Card[i*13+k+1]=temp;

}

}

}

}

//输出函数:

输出四个玩家的扑克牌

voidoutput()

{

inti;

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

{

if(i%13==0)

printf("第%d个玩家的牌为:

",i/13+1);

printf("%c%c%c",Card[i].CardColor,Card[i].CardNumber[0],Card[i].CardNumber[1]);

if(i%13==12)

printf("\n");

}

printf("\n");

}

//验证函数:

验证是否有重复的牌

voidyanzheng()

{

intflag=0;

inti,j;

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

for(j=0;j<52;j++)

{

if(i!

=j)

{

//如果有重复的牌,那么就让flag=1

if(card[i]==card[j])

{

flag=1;

}

}

}

if(flag==0)

printf("没有重复的牌!

\n\n");

if(flag==1)

printf("有重复的牌!

\n\n");

}

voidmain()

{

xipai();//洗牌

zhuanhuan();//转换

paixu();//排序

yanzheng();//验证

output();//输出

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1