《数据结构》课程设计报告.docx

上传人:b****6 文档编号:5899027 上传时间:2023-01-02 格式:DOCX 页数:11 大小:59.88KB
下载 相关 举报
《数据结构》课程设计报告.docx_第1页
第1页 / 共11页
《数据结构》课程设计报告.docx_第2页
第2页 / 共11页
《数据结构》课程设计报告.docx_第3页
第3页 / 共11页
《数据结构》课程设计报告.docx_第4页
第4页 / 共11页
《数据结构》课程设计报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

《数据结构》课程设计报告.docx

《《数据结构》课程设计报告.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告.docx(11页珍藏版)》请在冰豆网上搜索。

《数据结构》课程设计报告.docx

《数据结构》课程设计报告

 

陕西科技大学电信学院

《数据结构》课程设计报告

 

名称:

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;i

for(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;j

a[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月

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

当前位置:首页 > 自然科学

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

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