《数据结构》课程设计报告.docx
《《数据结构》课程设计报告.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告.docx(11页珍藏版)》请在冰豆网上搜索。
《数据结构》课程设计报告
陕西科技大学电信学院
《数据结构》课程设计报告
名称:
C版扎金花
班级:
姓名:
学号:
指导教师:
学年学期:
2011~2012学年第一学期
2011年12月29日
摘要
课程设计的题目是扎金花,扎金花是中国广泛流传的一种民间游戏,是一种既比胆略又比智慧的游戏,现实中不同心理因素之间的较量成为了该游戏的一大特色。
这次C语言版的扎金花运用了数据结构中的线性链表、数组等算法思想,实现了用扑克牌休闲娱乐的方式。
该程序模拟人的发牌过程,把牌发给三个玩家,同时依照规则比较出其大小,规则是:
单<对<顺<花<同花顺<豹子;同一类型则按大小比较1<2<…<13。
开始时玩家拥有一定的金钱,玩家为了赢更多的钱,一定要运用自己的智慧,抓住机会,果断下手。
由于该程序是用C语言编译而成,所以并没有良好的视觉效果,但是它简单而具有的娱乐性质,在紧张的学习之余,可以用来放松自己。
关键词:
发牌;随机数;数字与花色组合;不重复
目录
1需求分析……………………………………………………4
2概要设计……………………………………………………4
3详细设计……………………………………………………5
4调试分析……………………………………………………9
5测试结果……………………………………………………11
6课设总结……………………………………………………11
7参考文献……………………………………………………12
数据结构课程设计报告
1需求分析
a.程序的功能
本组课设主要是为了实现C语言版扎金花,其能够实现计算机模拟人发牌,同时对玩家的牌进行比较,在玩的同时,添加了赌注,赢得玩家可以收获赌注,而输的玩家则失去赌注。
函数主要分三个模块,一是发牌,二是比牌,三是玩牌。
b.输出形式
由于牌分为花色和大小两种数据,花色由字符型输出,大小则有整形数据输出。
显示时,先花色再数据
c.初步测试计划
多次发牌,检查可能出现的漏洞。
2概要设计
1.子函数功能介绍
voiddelete_(inta[],intx,intn)//n为数组长度,x为元素下标
voidrandom(intresults[])//实现随机数进数组
intpaixu(pokerp)//对牌的数据进行判断,观察其是否为顺子,是则返回1,否则返回0
intpanhua(pokerp)//对牌的花色进行判断,观察其是否为同花,是则返回1,否则返回0
intpair(pokerp)//检查是否存在两张大小相同的牌,是则返回1,否则返回0
intsearch(pokerp)//返回数字最大的牌数
intresult(pokerp1,pokerp2)//最后的比牌,由于牌是存在单链表中,传入两个链表的头结点
2.函数的调用关系
pokerplayer1;//指针
pokerplayer2;
pokerplayer3;
player1=paipai(player1,m,n);
player2=paipai(player2,m,n)
player3=paipai(player3,m,n);
kanpai(player1);
kanpai(player2)
kanpai(player3)
winner1=result(player1,player2)
winner2=result(player1,player3
winner2==result(player2,player3
3详细设计
1.主函数流程图
豹子
同花
顺子
对子
单牌
应该是缺少了同花顺(概率最小、后面可以考虑加上)
2.所用到的数据结构的知识及相关数据结构的描述形式
1)结构体
typedefstructpokery
{
intdata;
intcolor;
structpokery*next;
}pokery,*poker;
2)单链表
pokerpaipai(pokerp,intm[],intk){
inti,j,data,col,flag=0,x,n;
pokerhead;
p=(poker)malloc(sizeof(pokery));
p->next=NULL;
for(i=0;i<3;i++)//考虑写一个删除数组中元素的函数
{
j=rand()%k+0;
data=m[j]%13+2;
col=m[j]%4+3;
pokers,p1;
p1=p;
s=(poker)malloc(sizeof(pokery));
s->data=data;
s->color=col;
s->next=p1->next;p1->next=s;s=p1;//生成新的结点,把新生成的元素存入到其中,同时把该结点链入到链表中
delete_(m,j,k);k--;
}
returnp;
}
3.我所承担的发牌设计的函数实现过程
我和赵某某共同担任了这次设计中的发牌过程。
我不会玩扎金花,不过,这并不会影响什么。
发牌设计:
1)每次游戏,必定是一副牌,去掉大小王,一共是52张牌。
每张牌有两个必要元素,花色和数据。
其中花色是四种:
pade-黑桃Club–梅花Diamond-方块Heart-红桃。
数据分为十三种,并且2为最小,A为最大。
从大到小依次为:
K、Q、J、10、9、8、7、6、5、4、3、2。
为了表示方便,用数字代替处理并在需要时进行还原,其规则是这样的A--1,J--11,Q--12,K--13,其他的数字对应其本身。
由于牌的两要素都不可少,所以我们决定采用结构体进行,其具体程序如下:
(记为函数一)
typedefstructpokery
{
intdata;
intcolor;
structpokery*next;
}pokery,*poker;
2)在发牌过程中,为了保证正游戏的公平性,必须要引用随机数random,并且放入数组,其中,随机种子为当前时间,在头函数中表示为#include。
具体程序如下:
(记为函数二)
voidrandom(intresults[])
{
intcandi[length];
inti,n=length,r;
srand((unsigned)time(0));
for(i=0;ifor(i=0;i{
r=rand()%n;
results[i]=candi[r];
candi[r]=candi[--n];
}
}
3)在扎金花游戏中,我们把每局的人数定为三人(其中两位为电脑玩家),在开始时,每人发三张牌,有计算机记录(不显示出给玩家)。
其派发的程序如下:
(记为函数三)
pokerpaipai(pokerp,intm[],intk)//派牌
{
inti,j,data,col,flag=0;
p=(poker)malloc(sizeof(pokery));
p->next=NULL;
for(i=0;i<3;i++)//考虑写一个删除数组中元素的函数
{
j=rand()%k+0;//随机选牌
data=m[j]%13+2;
col=m[j]%4+3;
pokers,p1;
p1=p;
s=(poker)malloc(sizeof(pokery));
s->data=data;s->color=col;
s->next=p1->next;p1->next=s;s=p1;//生成新的结点,把新生成的元素存入到其中,同时把该结点链入到链表中
delete_(m,j,k);k--;//删除
}
returnp;
}
4)由于同一副牌中不可能有相同的出现,那么每派出一张牌,数组里就会必须少这个元素,及删除该数,将数组放入单链表中,则链表的长度减少。
具体程序如下:
(记为函数四)
voiddelete_(inta[],intx,intn)//n为数组长度,x为元素下标
{
intj;
for(j=x;ja[j]=a[j+1];
}
5)发给玩家的牌不可能总是仅被电脑记录不显示出来,为此,必须进行看牌,因此,具体进行发牌,各三张并显示出来的具体程序如下:
(记为函数五)
voidkanpai(pokerp){//p为链表的头结点
intcount=0;
pokerpt;
pt=p->next;
while(pt)
{
printf("%c",pt->color);
switch(pt->data)//A--14,J--11,Q--12,K--13,其他的数字对其本身
{
case1:
printf("%c",'A');break;
case11:
printf("%c",'J');break;
case12:
printf("%c",'Q');break;
case13:
printf("%c",'K');break;
default:
printf("%d",pt->data);
}
count++;
if(count==3)printf("\n");
pt=pt->next;
}
}
至此,我们的子函数部分已经完成,并且多次程序检验是可操作的。
4调试分析
我们最初选择的是分4次进行,每一次在13个数中进行,可是后来发现第二次以后的过程可能选到与前面完全的元素。
而且取到的元素会进入链表,这样后面的发牌过程就会出现完全相同的牌,从而酿成错误。
因此想到假如每次取出该元素后,可以删除该元素,第二次以后就不会再选到。
但是由于是13个元素分4次进行,想要达到这种效果会很困难。
于是又想到有52张牌,可以考虑随机选择1-52的随机数,是全部选出,但是由于随机过程中第二次以后的随机还是可能取到,就运用了两个数组,其中一个为空数组,另外一个数组存着1-52的数,随机取下标然后存入,同时把满数字的数组中取到的数字删去。
循环完成随机取数的过程,最后把随机取到的数存到单链表中去。
其实这样的一个个程序看起来似乎把简单的问题复杂化了,或许我们可以假象为已经有了那么特定的五十二张牌,而发牌就是随机抓取,为此我试写一下函数:
产生一副牌
voidmakecard()
{
inti;
for(i=0;i<52;i++){
poker[i].color=3+i/13;
poker[i].number=i%13+1;
poker[i].use=0;}
}
抓取牌,从以上定义产生的一副牌中
intgetcard()
{
inti,k=0;
while(k==0){
i=rand();
i=i%52;
if(poker[i].use==0){
poker[i].use=1;
k=1;
returni;}}
}
检验的这段程序是可以用的,不过我们和其他部分的已经商量好了写为数组和链表形式,我们随意代替一定会导致三个部分难以连接,因此最后决定用原计划较复杂的程序。
5测试结果
说明输入的数据,看到的结果。
(结果用截图展示!
)
6课设总结
这是我第一次相信自己,因为在学C语言时,李老师说学完C语言就可以变出类似扫雷的小游戏,我一直很怀疑,觉得无从下手。
可是,现在,扎金花游戏真在我的手底下诞生,尽管我不能完成所有,但是却大大的树立了我的信心,让我觉得每天看着一堆字母并不是那么无聊,我们也可以乐在其中。
这次的程序设计是以小组的形式完成的,大家都很认真,分工明确,但也不能完全独立,否则编出的程序会无法连接,其实这并不只是一场知识的考验,更是一种团结的考验。
每个人的能力都是不一样的,性格也不是一样的,这样的层次不齐突然聚在一起完成一个任务,需要的不仅仅是每个人贡献出自己的才智,还有互相帮助,互相尊重的品德。
一个再有能力的人也永远比不上一队结的人。
在此,我不得不谢谢赵伟娟和王世信在这次设计中给予的帮助和指导。
也是通过这次课程设计,我知道了自己与他人的差距,不得不否认,我学得还不够好,思维还不够严谨,但是,我会在将来的学习中好好的磨练自己,我想人与人之间的差距比不过不是永恒的,但是想要缩小它,必须付出比平时更多的时间和精力。
其实《课程设计》并不只是教会我们一些编程吧,我们需要学习的是一种思维,一种简化问题的方法,课程设计正是在教我们如何通过机器语言表达我们的思想,只有这样,我们才能解决尽在眼前的问题。
7参考文献
1严蔚敏数据结构(C语言版)北京:
清华大学出版社197.4.1
2谭浩强C语言程序设计(第四版)北京:
清华大学出版社2010年6月第四版
3NicholasA.Scolter,ScottJ.KleperC++高级编程机械工业出版社2006年1月第一版中文印刷
4杨晓光数据结构实例教程北京:
清华大学出版社北京交通大学出版社2008年12月
5陈锐等零基础学数据结构北京:
机械工业出版社2010年1月