c随机发牌课程设计报告_第1页
c随机发牌课程设计报告_第2页
c随机发牌课程设计报告_第3页
c随机发牌课程设计报告_第4页
c随机发牌课程设计报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、学号16082202032016-2017 学年 第 2 学期高级语言程序设计课程设计报告题目:随机发牌专业:网络工程班级:16(3)姓名:代应豪指导教师:代美丽成绩:目录一、设计内容及要求3二、概要设计3(1)系统功能与分析(填写你所设计的菜单及流程图)3(2). 数据结构(程序中所使用的变量、数组、结构体)8(3). 模块设计9(4)调试过程 : 测试数据及结果,出现了哪些问题,如何修改的10三、设计结果与分析11(5)程序有待改进的地方及本次实习的收获和建议13四、程序代码13附录:完整、可运行代码及注释16一、设计内容及要求1 进一步掌握和利用C 语言进行程设计的能力;2、进一步理解和

2、运用结构化程设计的思想和方法;3、初步掌握开发一个小型实用系统的基本方法;4、学会调试一个较长程序的基本方法;5、学会利用流程图或N-S 图表示算法;6、掌握书写程设计开发文档的能力(书写课程设计报告);二、概要设计( 1)系统功能与分析(填写你所设计的菜单及流程图)系统功能综述本文本编辑器通过菜单的选择可以实现对扑克牌的构建、洗牌和发牌的功能,并可将最初始的扑克牌的花色与面值显示出来以及发牌后的花色与面值显示出来设计的主菜单程序初始化主窗口选择执行的操作1 低效洗牌2 低效发牌4高效洗牌3 退出 N-S 流程图main() 主函数定义显示菜单的函数定义构建扑克牌的函数定义低效洗牌的函数定义低

3、效发牌的函数定义高效洗牌、发牌的函数定义扑克牌花色的函数定义扑克牌面值的函数初始化二维数组deck 为 0初始化一维数组huase初始化一维数组dianshu调用菜单函数调用构建扑克牌函数当为真时输入用户所需要的选择根据根用据户根的据选择进行功能void suit(struct puke pk52)判断行数,打印正确的花色void face(struct puke pk52)判断列数,打印正确的面值分析与设计说明每个函数的基本功能及函数的重要变量的意义:void menu()/* 打印主菜单栏*/void make(struct puke pk52)/* 构建一副扑克并打印起初的扑克顺序voi

4、d ordinary_shuffle(struct puke pk52)/* 进行低效洗牌*/void ordinary_deal(struct puke pk52)/* 进行低效发牌 */*/void effective(int deck13,char huase,char dianshu)/* 进行高效洗牌、发牌*/void suit(struct puke pk52)/* 打印扑克的花色*/void face(struct puke pk52)/* 打印扑克的面值*/各函数中的重要变量的意义详见下面源程序段的解释说明部分各函数的之间的相互关系:(2) . 数据结构(程序中所使用的变量、数

5、组、结构体)变量e 使用户选择所需要操作的功能的按键i定义为 1 52 张牌,在14 内的随机变量t 定义为随机变量进行运算后所赋的值tds某张牌的面值在实现洗牌功能时暂时存放的变量地址ths某张牌的花色在实现洗牌功能时暂时存放的变量地址temp 扑克牌在实现高效洗牌、发牌时,某张牌暂时存放的变量地址 row 表示行数column表示列数card代表 52 张扑克牌jishu表示在实现高效洗牌、发牌时,发牌的牌数数组deck413定义为一个4x13 的二维数组deck 表示一副牌。 行与花色对应: 第 0 行代表红心、第 l 行代表方块、第2 行代表草花、第3 行代表黑心。列代表牌的面值:第0

6、 列到第9 列对应于“A”到9,第10 列到第12 列对应于“J”、“ Q和“ K”。字符串数组suit代表四种花色,字符串数组face代表13 张牌的面值。huase4定义扑克牌的花色:第0 行代表红心、第l 行代表方块、第2 行代表草花、第3行代表黑心dianshu13定义扑克牌的面值:第0到13列分别用A , 2, 3 , 4 , 5 , 6, 7 , 8,9,10,J,Q K结构体struct puke用来定义扑克牌的花色与面值,使得扑克牌被打印时能够显示出每张牌的特征( 3) . 模块设计根据功能需要:在运行程序时调用了 这几个头文件源文件函数名功能fapai-xipai.cvoid

7、 main()主函数void menu()打印主菜单栏void make(struct puke pk52)构建一副扑克并打印起初的扑克顺序void ordinary_shuffle(struct puke进行洗牌pk52)voidordinary_deal(structpuke进行发牌pk52)voideffective(intdeck13,char进行高效的洗牌、发牌huase,char dianshu)void suit(struct puke pk52)打印扑克的花色void face(struct puke pk52)打印扑克的面值( 3)总体设计思想:先定义一个扑克牌的结构体变量,

8、成员列表中包含扑克牌的花色与面值创建主菜单栏,表明此程序的主要用途及相关操作步骤如果要进行此游戏则进行构建一副扑克牌并将其牌最初始的52 张牌的花色与面值显示出来以达到游戏的公正性1. 询问是否进行洗牌操作,若选择“1”则调用 void ordinary_shuffle(structpuke pk52)函数进行洗牌。此函数是循环有限次,在每次循环时都让系统随机取一个数除52 取余得变量 t 即范围为1 13(也就是在AK 这 13 个数中任取一数),并同时将52 张牌的首个面值与花色付给变量tds 与 ths, 然后利用上面的变量t 在这 52 张牌中随机取值,将其花色与面值从第1 张牌开始进

9、行随机地替换,这样就达到了低效洗牌的功效了;2. 然后继续询问要执行哪个操作。3.若选择“ 2”则调用voidordinary_deal(struct puke pk52) 函数进行发牌。进行52 次循环,调用 suit(pk) 函数(利用 switch 语句显示每张牌的花色:第 1 行代表红心、第 2 行代表方块、第 3 行代表草花、第 4 行代表黑心)与 face(pk) 函数(利用 switch 语句显示每张牌的面值: 第 0 列到第 9 列对应于“ A”到 9,第 10 列到第 12 列对应于 “ J”、“Q和“ K”)。这样就可以把 52 张牌的花色与面值显示出来,从而也就完成了发牌

10、的功能。的每一张牌呢 ?因为数组 suit 来获得花色。同样,打印字符串已经预载人了四种花色,所以通过打印字符串facecolumn可获得牌的面值。suitrow4.接着继续询问要进行哪个操作,若选择“4 ”,则调用voideffective(intdeck13,charhuase,char dianshu) 函数进行高效的洗牌、发牌操作。首先,把数组deck 清为 0;然后,随机地从 0 3 中选择一行 (row) ,从0 12 中选择一列 (column) 。把数 1 插入到数组元素deckrowcolumn 中并作标记 card=1 ,之后的每一个循环就依次累加。表示这张牌将是从洗好的牌

11、中发出的第一张牌。继续这个过程,把数2、 3、 、 52 随机地插入到数组 deck中表示从洗好的牌中发出的第2、第3、 、第52 张牌。若 card 已经标记到 13,则需换行。在把发牌序号插入到数组deck 中的过程中,一张牌被选择两次是可能的,即选中它时, deckrowcolumn 可能会重复。遇到此情况,系统就会把它忽略不做任何处理,跳出本循环,继续反复地随机选择其它的row 和 column ,直到发现没有被选中过的牌为止。这样牌的序号 1 到 52 最终会分给数组deck 中的 52 张牌。这时,这副牌就算完全洗好了。用这种方法系统调用的函数就只有一个,而且使用嵌套的 for 循

12、环使系统运行得更有效率。5. 如此循环地询问操作,直至用户输入“3”退出此程序。( 4)调试过程 : 测试数据及结果,出现了哪些问题,如何修改的调试过程:在发牌的过程中,第一张牌缺少花色原因:对变量局部 i 进行重复定义,导致变量 i 值在第二次调用时出错修改:将局部变量 i 定义成全局变量在使用recycle 函数递归调用时,并没有多次循环,只执行一次就结束了原因:在此程序中,recycle 函数的递归调用并没有限制条件,它会无终止地进行,导致内存空间不足,甚至死机修改:将recycle 函数改成while 函数进行多次循环在执行完发牌之后,进行循环, 可是第二次循环却未执行洗牌之后的工作,

13、而进行在此循环原因: scanf 与 getch()函数在输入上有所区别。利用getch()函数输入一个字符之后,必须再按回车键,而所按的回车键会被内存记录,使得“n”成为变量e 的一个值,从而导致多输入了一次shuffle the deck(1/0)?:语句。若使用scanf 函数则不会出现此问题,虽然也要再输入回车键,但并不会将“n”赋值给e 变量修改:将输入Y/N 形式修改为1/0,并将 e=getch(); 修改为 scanf(“%d”,&e);在使用 void effective(int deck13,char huase,char dianshu) 进行高效洗牌、发牌操作时,发出的

14、牌显示得很凌乱,没有规律性的分布原因:高效发牌时,并不是每张牌都会打印出来,因此会显得凌乱,没有规律修改:增加初始化了的变量jishu ,在打印完扑克牌之后,判断是否已经达到发过13 张牌,若已发过 13 张牌,则换行三、设计结果与分析初始化界面输入“ 1”进行低效洗牌后,会继续询问用户作何操作然后继续输入“2”后就会显示低效洗牌后的结果,并继续询问用户作何操作然后继续输入“4”进行高效洗、发牌显示其结果,并继续询问用户作何操作然后继续输入“3”后,就会推出DOS界面,结束此程序( 5)程序有待改进的地方及本次实习的收获和建议待改进:本程序是将扑克牌的正面(即牌面的花色与面值都显示出来) ,而

15、实际生活中洗牌与发牌的过程都是背面朝上, 并不能知道其牌值。 因此洗牌、 发牌过程中的正反面问题有待改进本程序是用文本编辑器win-tc 写的,发牌效果不是特别好,需将牌的展示生动化写成图形界面效果更佳本程序还有一些小小的细节问题,仍有待改进收获 :由于这是第一次自己写这么大型的程序(相对以往写的程序而言),一开始琢磨了很久也琢磨不出什么,通过一番努力。 终于写出了一些程序段,然而在写程序的过程中出现了很多错误,碰了不少钉子, 但通过他人的指导、帮助与自己不断修改与改进让我对C 语言的知识有了更进一步的改进,学会了如何从一个题目入手进行有效的算法分析, 写出合理的数据结构,并使程序运行得更加有

16、效率。同时也发现了自己的不足:对 C 语言的掌握还不是特别好,特别是到了指针那部分之后就基本上没有什么概念了。建议 :C 语言课程的内容较多,运用起来时常会出错,有时甚至怎么找也找也找不出来,老师能多在下面转转, 观察观察学生的实践情况以及设计进度, 适时提出合理的建议或意见供同学们参考。自己也要多看看书,把C 语言掌握透彻 ; 多上机实践,从问题中不断地提高编程能力四、程序代码void menu()printf(*n);printf(*This is Automatic Dealing Card program!*n);printf(* In one game 52 cards are di

17、vided into 4 grounds. *n); printf(*n); printf(ordinary(1:shuffle 2:deal 3:exit )n); printf(effetive(4:shuffle and deal)nn);该程序段的功能是打印初始时的主菜单,显示其主要功能void make(struct puke pk52) printf(The original puke:n); for(i=0;i52;i+)int t=i%13+1; pki.dianshu=t;for(i=0;i52;i+)int t=i/13+1;pki.huase=t;for(i=0;i52;

18、i+)ordinary_deal (pk);该程序段是构建一副扑克牌,让扑克牌有规律地排在一块并显示,以达到游戏的公证性void ordinary_shuffle(struct puke pk52)for(i=0;i52;i+)int t;int tds=0,ths=0;t=rand()%52;/*tds=pki.dianshu;/*取随机数 */进行牌与牌之间的随机替换*/ths=pki.huase;pki.dianshu=pkt.dianshu;pki.huase=pkt.huase;pkt.dianshu=tds;pkt.huase=ths;该程序段是通过取随机变量进行52 张牌的之间的

19、随机替换以达到洗牌的功能void ordinary_deal(struct puke pk52)for(i=0;i52;i+)suit(pk);/* 打印扑克的花色*/face(pk);/* 打印扑克的面值*/void suit(struct puke pk52)switch(pki.huase)case 1: printf(%c,3); break;case 2: printf(%c,4); break;case 3: printf(%c,5); break;case 4: printf(%c,6); break;void face(struct puke pk52)switch(pki.d

20、ianshu)case 1: printf(%s,A); break;case 2: printf(%s,2); break;case 3: printf(%s,3); break;case 4: printf(%s,4); break;case 5: printf(%s,5); break;case 6: printf(%s,6); break;case 7: printf(%s,7); break;case 8: printf(%s,8); break;case 9: printf(%s,9); break;case 10: printf(%s,10); break;case 11: pr

21、intf(%s,J); break;case 12: printf(%s,Q); break;case 13: printf(%s,k); break;printf( );if(i+1)%13=0) printf(n);调用 suit(pk) 函数打印洗完牌后的花色,调用 face(pk) 函数打印洗该程序段是进行发牌功能,完牌后的面值void effective(int deck13,char huase,char dianshu)int i,j;int temp;int row;/* 行 */int column;/* 列 */int card;/* 计数器 */int jishu=0;f

22、or(card=1;card=52;card+)/* 循环 52 张牌 */row=rand()%4; column=rand()%13;deckrowcolumn=card;/* 将牌放在选择的位置中 */for(row=0;row=3;row+)/*循环 deck 中的每一行 */for(column=0;column=12;column+)/*循环 deck 中的每一列 */i=rand()%4; j=rand()%13; temp=deckij; deckij=deckrowcolumn; deckrowcolumn=temp;if(deckrowcolumn=card)/*如果当前位

23、置有牌,则打印*/+jishu;printf(%c%-3c,huaserow,dianshucolumn);if(jishu%13=0) printf(n);/*打印 13 张牌后换行*/*结束effective函数 */该程序段是用随机数洗牌,用嵌套式的for循环进行发牌附录:完整、可运行代码及注释#include#include#include#includestruct puke/* 创建扑克的花色与面值的结构共同体*/int huase;int dianshu;void main()void menu();void make(struct puke pk52);void ordinar

24、y_shuffle(struct puke pk52); void ordinary_deal(struct puke pk52);void effective(int deck13,char huase,char dianshu);void suit(struct puke pk52);void face(struct puke pk52);char e;struct puke pk52;int deck413=0;/*初始化数组deck*/char huase4=3,4,5,6; /* 初始化数组face*/char dianshu13=A,2,3,4,5,6,7,8,9,10,J,Q,K

25、;menu();/* 打印主菜单栏*/make(pk);/* 构建一副扑克牌并打印起初的扑克顺序*/while(1)printf(nplease enter your choice:);scanf(%d,&e);/* 选择所要操作的功能*/switch(e)case 1:ordinary_shuffle(pk);break;/* 普通方法洗牌 */ case 2:ordinary_deal(pk);break;/* 普通方法发牌 */ case 3:exit(0);break; /* 退出程序 */case 4:effective(deck,huase,dianshu);break;/* 高效

26、洗牌、发牌 */ default:printf(Error!n);break;getch();void menu()printf(*n);printf(* This is Automatic Dealing Card program! *n); printf(* In one game 52 cards are divided into 4 grounds. *n); printf(*n); printf(ordinary(1:shuffle 2:deal 3:exit )n); printf(effetive(4:shuffle and deal)nn);int i;void make(st

27、ruct puke pk52)printf(The original puke:n); for(i=0;i52;i+)int t=i%13+1;pki.dianshu=t;for(i=0;i52;i+)int t=i/13+1;pki.huase=t;for(i=0;i52;i+)ordinary_deal (pk);void ordinary_shuffle(struct puke pk52)for(i=0;i52;i+)int t;int tds=0,ths=0; t=rand()%52;/* 取随机数 */tds=pki.dianshu;/* 进行牌与牌之间的随机替换 */ ths=pk

28、i.huase;pki.dianshu=pkt.dianshu;pki.huase=pkt.huase;pkt.dianshu=tds;pkt.huase=ths;void ordinary_deal(struct puke pk52)for(i=0;i52;i+)suit(pk);/* 打印扑克的花色*/face(pk);/* 打印扑克的面值*/void effective(int deck13,char huase,char dianshu)int i,j;int temp;int row;/* 行 */int column;/* 列 */int card;/* 计数器 */int jishu=0;for(card=1;card=52;card+)/* 循环 52 张牌 */row=rand()%4;column=rand()%13;deckrowcol

温馨提示

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

评论

0/150

提交评论