纸牌游戏
- 格式:doc
- 大小:327.50 KB
- 文档页数:18
数据结构课程设计
题 目: 纸牌游戏
系 别: 计算机科学与技术系
专业年级: 软件工程2015级
姓 名: 彭 顺
学 号: 20151106219
指导教师: 乔 栋
2016年12月12
日
LULIANG UNIVERSITY
目录
一、设计任务与要求 (1)
1.1 总体目标与任务要求 (1)
1.2 题目选择与目的意义 (1)
1.3 所选题目的主要工作 (1)
二、需求分析 (1)
2.1 功能需求分析 (1)
2.2 游戏需求分析 (2)
三、概要设计 (3)
四、详细设计 (3)
五、源代码 (5)
六、运行结果分析 (5)
七、收获与体会 (13)
八、主要参考资料 (144)
一、设计任务与要求
1.1 总体目标与任务要求
纸牌游戏:
1*问题描述:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过。
输出:这时正面向上的牌有哪些?
1.2 题目选择与目的意义
熟练掌握数据结构这门课程,掌握经性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用。
进一步熟悉抽象数据类型的定义和实现、如何利用数组的动态分酚实现顺序结构、继承的实现方式。
学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、想念结构及基相应的算法并初步掌握算法的时间分析和空间分析的技术。
基本掌握程序设计的基本思路和方法。
利用所学的基本知识和技能,解决简单的程序设计问题各算法描述培养我们的数据抽象能力
1.3 所选题目的主要工作
这个题目的主要工作是 1)建立与 52 张牌分别对应的含 52 个结点的链表; 2)执行翻牌算法之前先输出这 52 张牌;3)调用翻牌算法按照其中判断规则运行翻牌操作; 4)输出在执行翻牌算法之后的结果,即输出所有最终正面向上的牌;通过两个 for 循环的嵌套,对牌号是当前基数的倍数的牌进行翻牌操作.。
二、需求分析
2.1 功能需求分析
功能需求分析模块图如图功能模块图:
功能模块图
2.2 游戏需求分析
开发环境:PC机
Windows 10系统
使用软件:编写实验报告:Microsoft Office Word
画图:亿图
制作程序:Dev-C++
三、概要设计
1.当从第二个编号开始的每张牌每次遇到是其倍数时,都会相应的翻一次,
这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,而结果只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几张。
比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。
如果它在多次的翻牌后,正面还向上了,那么它就是要输出的结果之一。
2.建立代表52张牌的线性表——调用翻牌算法按照规则翻牌——输出翻牌
算法的结果。
四、详细设计
1.定义头文件
#include<stdio.h>
#include<stdlib.h>
2.定义结构体
typedef struct card//定义单链表结构体card
{
int count;//存放纸牌被翻次数
int num;//存放纸牌编号
int state;//存放纸牌当前状态
card *next;//指向下一张纸牌
}LNode,*Linklist;//LNode是结构体struct card的简称;Linklist是指针类型。
3.主函数进行牌的翻转
int main()
{
int choice,i,num;
char m,n;
int a;
Linklist L;//定义头结点
L=(Linklist)malloc (sizeof(LNode));//为头结点分配内存
card *p=L,*q;
for(i=1;i<=52;i++)//为每张牌建立结点,并用单链表指示下一张牌的位置
{
q=new card;
q->num=i;
q->count=0;
q->state=1;//正面向上
p->next=q;
p=q;
}
p->next=NULL;
p=L;
for(i=2;i<=52;i++)
{
p=L;
for(a=0;a<i;a++)
{
p=p->next;
}
while(p!=0)
{
if(a%i==0)
{
p->state=p->state*(-1);//反向
p->count++;
}
p=p->next;
a++;
}
}
p=L;
printf("最终正面向上的牌有:\n"); while(p!=0)
{
if(p->state==1)
printf("第%d张牌",p->num); p=p->next;
}
printf("\n");
五、源代码
#include<stdio.h>
#include<stdlib.h>
/*--------------定义结构体--------------*/
typedef struct card//定义单链表结构体card
{
int count;//存放纸牌被翻次数
int num;//存放纸牌编号
int state;//存放纸牌当前状态
card *next;//指向下一张纸牌
}LNode,*Linklist;//LNode是结构体struct card的简称;Linklist是指针类型int main()
{
int choice,i,num;
char m,n;
int a;
Linklist L;//定义头结点
L=(Linklist)malloc (sizeof(LNode));//为头结点分配内存
card *p=L,*q;
for(i=1;i<=52;i++)//为每张牌建立结点,并用单链表指示下一张牌的位置{
q=new card;
q->num=i;
q->count=0;
q->state=1;//正面向上
p->next=q;
p=q;
}
p->next=NULL;
p=L;
for(i=2;i<=52;i++)
{
p=L;
for(a=0;a<i;a++)
{
p=p->next;
}
while(p!=0)
{
if(a%i==0)
{
p->state=p->state*(-1);//反向
p->count++;
}
p=p->next;
a++;
}
}
p=L;
printf("最终正面向上的牌有:\n"); while(p!=0)
{
if(p->state==1)
printf("第%d张牌",p->num); p=p->next;
}
printf("\n");
do{
printf(" 纸牌游戏\n");
printf("\t1.查看指定编号纸牌翻牌次数\n");
printf("\t2.显示所有编号纸牌翻牌记录\n");
printf("\t0.按0键结束\n");
printf("请输入您的选择(数字0-2):");//主界面
scanf("%d",&choice);
switch(choice)//通过switch语句进行功能的选择
{
case 1:{
do{
printf("\t请输入您想查询的纸牌编码:");
scanf("%d",&num);
if(num<1 || num>52)//纸牌的序号为1-52,所以其他数值都为输入错误。
printf("\t输入错误!\n");
else
{
p=L->next;
for(i=1;i<num;i++)
{
p=p->next;
}
printf("\t纸牌翻转记录如下:");
printf("\t该纸牌翻转次数为%d\n",p->count);
for(i=2;i<=52;i++)//内循环,基数倍数条件判断。
{
if(num%i==0)
{
printf("\t在以编号%d为基数时此纸牌有一次翻转。
\n",i);
}
}
}
}while(m=='Y');
printf("是否回到主菜单?(Y/N):");
n=getchar();
n=getchar();
if(n=='Y'||n=='y')break;
else if(n=='N'||n=='n')
choice=0;
else printf("**************(提示:输入错误,默认为继续。
)***** *****\n");
break;
} break;
case 2:{
for(num=1;num<=52;num++)
{
p=L->next;
for(i=1;i<num;i++)
{
p=p->next;
}
printf("\t----第%d张纸牌翻转次数为%d---- ",num,p->count);
if(num%2==0)
printf("\n\n");
}
printf("是否回到主菜单?(Y/N):");
n=getchar();
n=getchar();
if(n=='Y'||n=='y')break;
else if(n=='N'||n=='n')
choice=0;
else printf("**************(提示:输入错误,默认为继续。
)***** *****\n");
break;
} break;
case 0:break;
default:printf("\t输入错误,请重新输入!\n");
}
}while(choice!=0);//0作为整个循环的结束条件。
}
六、运行结果分析
1.菜单:进入系统后,会出现如下菜单
用户根据自己需求选择输入数字(0-2)即可进入相应功能。
2.录入模块:
3.系统改进设想:
在编写的时候只使用了相对较为简单的基础语言,代替了相对较为复杂的语言,降低了运行效率。
测试输入的数据也有一定的局限性,但是基本可以满足游戏的需求。
这个程序有许多地方可以改进,例如:
①使用的语言较基础,运行效率较低,可以考虑写一些较为复杂但运行效率高的
语言。
②界面不够美观,菜单也只是局限在左上角,可以修改。
七、收获与体会
这个学期是我第一次接触《数据结构》,也是我第一次接触“课程设计”,在完成设计的过程中,我遇到了一系列的问题,能明显感觉到自己在很多方面的不足,但另一方面,问题是要分析解决的,找出问题以便为完善学习计划,改变学习内容与方法提供实践依据。
通过这次课程设计,加强了我们的动手、思考和解决问题的能力。
在设计过程中,经常会遇到这样那样的情况,总觉得思路对着,可是就是行不通,所以耗费时
间比较多。
在做课程设计的同时,我对课本知识也得到了巩固和加强,由于课本上的东西太多,平时课间的学习并不能很好的理解和运用各个知识点的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多知识点的功能,并且对数据结构有了更多的了解。
在平时看课本的过程中,有些问题老是弄不明白,做完课程设计,有些问题就迎刃而解了。
而且还可以记住很多东西。
通过动手实践让我们映象深刻,知识来源于实践。
实践是认识的动力和最终目的,也是检验真理的唯一标准。
所以这次课程设计对我们的帮助很大。
所以在整个过程中,我不断加深了对数据结构的理解与一些程序写书时要注意的事项,体会了《数据结构》这门课程在解决现实生活问题上的可行性,也更进一步地激发了我的学习热情。
做一个课程设计要注意很多方面,无论是格式,还是书写的内容和要表达的思想都得严格要求自己,所以做起来真的不算容易。
对我们而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次设计必将成为我人生旅途上一个非常美好的回忆!通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论的知识是远远不够的,只有把所有的理论知识与实践结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
这毕竟是第一次做,难免会与到各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握的不够牢固。
除此之外,也学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益匪浅,自己也能扛得起并高质量的完成项目。
八、主要参考资料
1、严蔚敏、吴伟民,数据结构C语言版,清华大学出版社,1997年4月
2、夏涛,C语言程序设计,北京邮电大学出版社,2007年3月
3、谭浩强,C程序设计(第三版),清华大学出版社,2006年2月
4、百度:百度知道,百度文库
指导教师签字:
年月日。