数据结构课程设计之纸牌游戏_第1页
数据结构课程设计之纸牌游戏_第2页
数据结构课程设计之纸牌游戏_第3页
数据结构课程设计之纸牌游戏_第4页
数据结构课程设计之纸牌游戏_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*大学数据结构课程设计报告题目: 纸牌游戏院(系):计算机工程学院 学生姓名: 班级: 学号:起迄日期: 2011.6.21-2011.7.1指导教师: 20102011年度 第 2 学期 一、需求分析 1.问题描述:随机产生52个数按照某一规则计算正面牌数。编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;.再依次5的倍数的牌翻一次,6的,7的 直到 以52为基数的 翻过,输出:这时正面向上的牌有哪些。 2.基

2、本功能: 选择纸牌是顺序排序还是随机排序随机,1为随机排序,其他数字为顺序排序,输入一个数使程序运行,随机产生52张纸牌,运行之后输出正面向上的牌。之后输入1重新运行,输入其他数字回车停止3.输入输出: 1)输入一个数字选择是使用顺序放牌还是随机放牌,1为随机放牌,其他数字为顺序放牌,输入一个正整数种子值,程序运行,输出52张纸牌的排列顺序,列出纸牌序列,输出正面向上的牌,进入选择语句,是否再玩一局,输入1,程序从新运行,输入其他,程序运行结束。 二、 概要设计1.设计思路: 当每个号码每次遇到是某个数的倍数的时候,都会相应的翻一次牌,这样,每张牌翻得次数就个不一样,可能很多次,也可能只有一两

3、次,结果就只是要输出在经过各个不同次数的反派后,正面向上的牌都有哪几个。例如24,第一次他是2的倍数时要从背面翻到背面,当进行到3时,又要从背面返回来。如果他在多次翻拍后,正面还向上了,那么他就是要输出的结果之一。/操作函数void operate(void) rcard rc; int i,j; rc=Random();/获得纸牌不同排序方式 /翻面游戏 for(j=2;j<=NUM;j+) /j为基数,也是开始翻面的位置 for(i=j;i<=NUM;i+)/i为纸牌位置 if(%j=0) rc.ci-1.state=rc.ci-1.state?0:1;

4、 2.基本算法:算法的主要流程为:选择所需纸牌是随机还是顺序建立代表52张牌的链表链表可以选择顺序链表和随机链表输出这52张牌调用翻牌算法按照规则进行翻牌输出翻牌算法之后的结果选择是否从新开始。3.数据结构设计:实体:card 其中的特征为int info,int postion ,int state实体:rcard 它中的元素就是card,包涵card中的特征。函数名 返回值类型 Main() void Select() void operate2 voidoperate2() voidrandom() rcard shunxu() rcardh_bian() voidl_bian() vo

5、idinformation() viod 4.数据结构设计: 定义程序中用到的抽象数据类型;抽象数据类型线性表的定义如下:ADT card 数据对象:D=ai| ai cNUM,i=1,2,3,n,n0数据关系:R1=<ai-1,ai>| ai-1,ai D,i=1,2,3,,nADT rcard 数据对象:D=ai| ai rc,i=1,2,3,n,n0数据关系:R1=<ai-1,ai>| ai-1,ai D,i=1,2,3,,n基本操作:h_bian(void)操作结果:构成输出纸牌的两边纵向边框。l_bian(void)操作结果:构成输出纸牌的横向边框。void

6、information(int info)初始条件:info已存在。操作结果: 输出构成所选定纸牌的编号。z_picture(int info)操作结果:输出所选定纸牌Random()初始条件:线性表num已存在。操作结果:形成随机链表序列。shunxu()初始条件:线性表num已存在。操作结果:形成顺序链表序列。 void operate1(void)初始条件:随机数列存在。操作结果:输出正面向上的纸牌。void operate2(void)初始条件:顺序数列存在。操作结果:输出正面向上的纸牌。select(void)操作结果:判断调用两个操作函数中的一个。5.软件结构设计:1. 按需求分析

7、中的功能进行模块划分: 1) 定义两个实数体。2) 构造输出纸牌的外观和信息。3) 形成顺序或随机数列4) 对选择数据进行操作5) 选择操作函数6) 主函数6.函数原型:定义两个实体struct : card rcard图形输出函数: z_picture() 调用函数l_bian()、h_bian()和information()选择函数: select()操作函数: operate1() 调用函数random() Operate2() 调用函数shunxu()排序函数:random() Shunxu()三、 详细设计 1.详细算法模块1. /定义两个实体,其中card为52张纸牌,rcard为

8、被选中操作的纸牌struct int info; /纸牌编号 int postion; /纸牌位置,从1开始计 int state; /纸牌状态,1表示纸牌正面向上,0表示纸牌背面向上card;#define NUM 52 /定义常量,方便调试和验证。typedef struct card cNUM;rcard;2 构造纸牌输出界面,形成输出的纸牌形。/纸牌横向边框void h_bian(void) int i; printf("nt"); for(i=0;i<10;i+) printf("*");/纸牌列向边框void l_bian(void)

9、int i,j; for(i=0;i<2;i+) printf("nt"); printf("*"); for(j=0;j<8;j+) printf(" "); printf("*"); 3输出正面向上的纸牌信息。/纸牌序号信息void information(int info) printf("nt"); if(info<10) printf("* %d *",info); else printf("* %d *",info);/纸牌正

10、面void z_picture(int info) h_bian(); l_bian(); information(info); l_bian(); h_bian(); printf("nn");4被调用函数,分别由operate1和 operate2 调用其中random形成52张随机数列,shunxu形成52张顺序序列。/获得纸牌不同排序方式rcard Random() rcard rc; int contNUM; /将需要的数存放到数组中,然后通过调换数组中数的位置,达到随机排列目的。 unsigned int seed; /申明初始化器的种子,注意是usigned

11、int 型的 int index, i,t; /初始化纸牌状态 for(i=0;i<NUM;i+) rc.ci.state=1; /对数组进行初始化 for (i=0; i<NUM; i+) conti = i+1; /提供随机种子 printf("请输入一个正整数种子值: n"); scanf("%u",&seed); srand(seed); /生成随机序列 for (i=0; i<NUM-1; i+)/交换NUM-1次 index=(rand()%(NUM-i-1)+i+1;/产生从i+1到NUM-1的一个随机数 /交换

12、t=conti; conti=contindex; contindex=t; printf("纸牌编号按顺序排列为:n"); for(i=0;i<NUM;i+) =conti; /纸牌编号 rc.ci.postion=i+1; /对应纸牌位置 printf("%d ", ); return rc;5对选定操作对象进行操作,即进行选择和翻面。/ /操作函数void operate1(void)/操作函数1,实现随机序列翻牌操作 rcard rc; int i,j; rc=Random();/获得纸牌不同排序方式

13、 /翻面游戏 for(j=2;j<=NUM;j+) /j为基数,也是开始翻面的位置 for(i=j;i<=NUM;i+)/i为纸牌位置 if(%j=0) rc.ci-1.state=rc.ci-1.state?0:1; /打印,用纸牌图形打印。 printf("n正面向上的牌有:"); for(i=0;i<NUM;i+) if(rc.ci.state) z_picture(); printf("n");void operate2(void)/操作函数2,实现顺序序列翻牌操作 rcard rc;

14、 int i,j; rc=shunxu();/获得纸牌不同排序方式 /翻面游戏 for(j=2;j<=NUM;j+) /j为基数,也是开始翻面的位置 for(i=j;i<=NUM;i+)/i为纸牌位置 if(%j=0) rc.ci-1.state=rc.ci-1.state?0:1; /打印,用纸牌图形打印。 printf("n正面向上的牌有:"); for(i=0;i<NUM;i+) if(rc.ci.state) z_picture(); printf("n");6选择函数,用于程序运行结

15、束后选择是否再来一局或者结束游戏。/选择设计void select(void) char c; while(1) system("cls");/清屏 char a;printf("请输入要选择的初始放牌序列输入1为随机,其他为顺序n"); scanf("%c",&a); if(a='1')operate1();/判断输入 else operate2(); fflush(stdin); printf("再玩一局?按1继续,按其他键退出!n请输入选择:"); c=getchar(); fflus

16、h(stdin); switch(c) case '1':select(); default:exit(0); 7主函数/定义主函数int main(int argc, char* argv) select();system("color 3e"); return 0;2=j设一个一维数组 card52,并将所有变量赋初值为1,表示直拍正面向上2.实现主函数的流程图。开始.jij52 Ni52j+ N Y N Y翻牌,如果cardi-1为0,则变为1;如果为1,则变为0i%j=0i+输出card数组中正面向上的序号结束4. 函数之间的调用关系图Main()o

17、perate1Operate2select()system("color 3e")l_bian()z_picture()shunxu()random()a=1l_bian()结束information(int info)四、 调试分析 1.这题的时间复杂度是O(52)。按照操作指示,可以选择顺序放牌很随机放牌,选择后运行程序即可输出相应放牌顺序下的正面向上的牌。2.虽然本次程序的题目难度与其他问题想必不是很高,但是仍有很多问题我们是很容易忽视的,其一:在理解题目要求时,应注意翻拍次数可能很多次;其二:for循环的嵌套使用在书写是很容易漏掉大括号。3.在程序调试期间根据提示还

18、是很容易找出问题,但是自己编写时就不会发现,应注意培养自己的严谨认真,4.编写完程序之后,发现程序要求很简单,但是我应该编写更多的玩法,由于刚接触MFC感觉是个很好的工程,以后有机会可以利用MFC自己开发一个真正可以玩起来的纸牌游戏。五、测试结果1.其输入要选择的初始放排序列1为随机,其他为顺序。输入:1其输入一个正整数种子值。输入:1纸牌序列按顺序排列为。47 19 45 21 15 18 4 51 6 34 42 30 916 26 46 24 3 22 25 48 33 52 44 41 8 29 20 10 28 38 17 12 14 47 13 37 32 5011 36 35 3

19、1 27 5 23 7 43 1 39 2正面向上的纸牌47 19 40 15 4 42 9 31 7 43 1 39再玩一局?按1继续,按其他键退出!n请输入选择:输入:1(从新开始游戏)输入:其他(程序运行结束)2. 其输入要选择的初始放排序列1为随机,其他为顺序。输入:2其输入一个正整数种子值。输入:1纸牌序列按顺序排列为。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

20、 49 50 51 52 正面向上的牌。1 4 9 16 25 36 49再玩一局?按1继续,按其他键退出!n请输入选择:输入:1(从新开始游戏)输入:其他(程序运行结束)六、用户手册1.输入摆放纸牌的顺序,1为随机摆放,其他为顺序摆放。并输入一个种子值使程序运行。2.输出纸牌的摆放顺序,3.对应输出正面向上的纸牌。 4.如果选择其他数字则纸牌为顺序摆放。5.顺序摆放时输出正面向上的纸牌。 6.程序运行到最后,输入1,重新运行程序。7.输入其他数字,例如3程序运行结束七、体会与自我评价 在为期不到两周的课程设计中,我体会颇多,学到很多东西。我对如何用 MFC编写可视化界面的应用程序还没有完全掌

21、握,否则我相信这次程序我可以做得更加完美,留下了一点遗憾,但是自己亲自动手的机会还是使我加强了对C的认识,复习了自己以前的知识,自己的逻辑思考能力也提高不少。从而对Microsoft Visual C+ 6.0又有了更深入的认识!在这次课程设计中,我还懂得了程序开发的一些比较重要的步骤,比如需求分析、总体设计、数据库设计(含概念设计、逻辑设计、物理设计)、程序模块设计(含功能需求、用户界面设计、程序代码设计与分析、运行结果)、系统使用说明等。总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。最重要的还是激发了我编程的兴趣和热情,让我从一个只懂理论变成了能做一些小型

22、程序,让我对编程更加热爱了。整体地评价这次课程设计,我认为收获很大,正如上面所说的那样,通过课程设计,既复习了以前的旧知识,又学到了一些新的知识;设计增强了我们用所学知识去解决具体问题的能力,进一步培养了我们独立思考问题和解决问题的能力。特别是学会了在Visual C+ 集成开发环境中如何调试程序的方法。当然,老师的悉心指导和同学的帮助也是不可忽视的,在此感谢本次课程设计中所有辅导老师对我的关心和帮助,诚心诚意感谢他们对我的鼓励与教导,是她们在我迷茫的时候给了我些许提示,激发了我编程的灵感;在编写过程中遇到的问题也不再是翻不过去的大山,在亲手写程序的过程中我真正体会到动手的乐趣,我慢慢学会了利

23、用编程思想解决现实中的问题,把理论运用于实践,对于我们这些计算机学院的本科生来说,实际能力培养远至关重要,而这种实际能力的培养只从课堂上学习是远远不够的,必须从课堂组向实践,也是我们学习的目的。 数据结构及其算法在解决现实生活中的常见问题和书写软件设计方面上都有着重要的意义,我们应该好好掌握它的相关知识,在以后的学习过程中,更多的学会如何与用知识。 源代码/ strong_poker.cpp : Defines the entry point for the console application./#include "stdafx.h"#include "std

24、lib.h"#include "stdio.h"#include "iostream.h"typedef struct int info; /纸牌编号 int postion; /纸牌位置,从1开始计 int state; /纸牌状态,1表示纸牌正面向上,0表示纸牌背面向上card;#define NUM 52 /定义常量,方便调试和验证。typedef struct card cNUM;rcard;/纸牌横向边框void h_bian(void) int i; printf("nt"); for(i=0;i<10;i

25、+) printf("*");/纸牌列向边框void l_bian(void) int i,j; for(i=0;i<2;i+) printf("nt"); printf("*"); for(j=0;j<8;j+) printf(" "); printf("*"); /纸牌序号信息void information(int info) printf("nt"); if(info<10) printf("* %d *",info); else

26、 printf("* %d *",info);/纸牌正面void z_picture(int info) h_bian(); l_bian(); information(info); l_bian(); h_bian(); printf("nn");/获得纸牌不同排序方式rcard Random()/ 产生随机序列 rcard rc; int contNUM; /将需要的数存放到数组中,然后通过调换数组中数的位置,达到随机排列目的。 unsigned int seed; /申明初始化器的种子,注意是usigned int 型的 int index, i,

27、t; /初始化纸牌状态 for(i=0;i<NUM;i+) rc.ci.state=1; /对数组进行初始化 for (i=0; i<NUM; i+) conti = i+1; /提供随机种子 printf("请输入一个正整数种子值: n"); scanf("%u",&seed); srand(seed); /生成随机序列 for (i=0; i<NUM-1; i+)/交换NUM-1次 index=(rand()%(NUM-i-1)+i+1;/产生从i+1到NUM-1的一个随机数 /交换 t=conti; conti=conti

28、ndex; contindex=t; printf("纸牌编号按顺序排列为:n"); for(i=0;i<NUM;i+) =conti; /纸牌编号 rc.ci.postion=i+1; /对应纸牌位置 printf("%d ", ); return rc;rcard shunxu()/产生顺序序列 rcard rc; int i; for(i=0;i<NUM;i+) rc.ci.state=1; printf("纸牌编号按顺序排列为:n"); for(i=0;i<NUM;i+) =i+1; /纸牌编号 rc.ci.postion=i+1; /对应纸牌位置 printf("%d ", ); return rc;void operate1(void)/操作函数1,实现随机序列翻牌操作 rcard rc; int i,j; rc=Random();/获得纸牌不同排序方式 /翻面游戏 for(j=2;j<=NUM;j+) /j为基数,也是开始翻面的位置 for(i=j;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论