1目录一、课题目标........................31.1纸牌游戏的简介...........................31.2纸牌游戏的基本要求.......................3二、概要设计及功能的实现.............32.1纸牌游戏的框架图.........................32.2主函数和子函数的框架图...................42.3具体的实现...............................72.3.1类的设计...............................72.3.2功能的实现.............................72.3.2.A发牌的功能...........................72.3.2.B出牌的功能...........................82.3.2.C二叉排序树的插入的功能..............112.3.2.D二叉树的排序........................122.3.2.E主函数的实现........................12三、调试分析........................15四、实训的经验与心得................184.1经验....................................184.2心得....................................182一、课题目标1.1纸牌游戏的简介创建一副扑克牌,通过用户与电脑的轮流出牌,谁先出完牌,谁就获胜。1.2纸牌游戏的基本要求#这幅扑克牌没有花色(J、Q、K、A、大小王),俩人进行游戏,其中一个为用户,一个为计算机;#每人每轮各发五张牌,各自以这五张牌建立二叉排序树;#游戏由用户先出,轮流出牌,每次只能出一张牌并且要比被别人出的大,如:用户出3,计算机则要出比3打的纸牌,没有则选择不出;#最先出完纸牌的人获胜。二、概要设计及功能的实现2.1纸牌游戏的框架图纸牌游戏主页面游戏说明开始游戏开始出牌游戏结束32.2主函数和子函数的框架图开始定义变量进入while主循环进入对应的选项,选择相应的功能调用相应的函数进入for/if循环实现相应的功能退出/执行相应的操作结束否是4子函数框架图出牌的框架图开始进入3次for循环判断用户的牌书是否大于电脑的牌用户出牌电脑出牌否是判断是否用户/电脑还有牌结束是否5建立二叉排序树的开始建立二叉排序树定义变量进入for循环执行相应的语句进入if语句返回一定的值执行相应的语句结束62.3具体的实现2.3.1类的设计首先在程序中必须有类,而我的纸牌游戏要求是有纸牌和以纸牌建立二叉排序树,故有两个类:classPlayingCards和classtree2.3.2功能的实现2.3.2.A发牌的功能**实现纸牌游戏发牌(fp)的功能,它的初始条件是该纸牌已存在,操作结果是给用户和电脑每人发5张牌。voidPlayingCards::fp(){intl,e;//临时储存随机牌数intf;for(inti=0;i5;i++){l=rand()%9+2;//用户得到牌的点数cout发到的牌l;f=rand()%4+3;while(card1[l-1][f-3]==1){l=rand()%9+2;f=rand()%4+3;}card1[l-1][f-3]=1;//标记哪些牌被发出b[i]=l;bhuase[i]=f;7e=rand()%9+2;//电脑得到牌的点数f=rand()%4+3;while(card1[e-1][f-3]==1){e=rand()%9+2;f=rand()%4+3;}card1[e-1][f-3]=1;//标记哪些牌被发出c[i]=e;chuase[i]=f;}}2.3.2.B出牌的功能**实现纸牌游戏的出牌(cp)功能,它的初始条件是用户和电脑每人手上拥有5张牌,操作结果是由用户先出牌,且后一个人出牌的点数要比前一个人出牌的点数大,谁先出完谁赢。voidPlayingCards::cp(){inte=0;intf=0;intn1=0;intn2=0;//记录牌打出几张for(intm=0;m5;m++){for(inti=0;i5;i++){for(intj=0;j5;j++)8{if(b[j]f&&card2[j][0]==0){cout玩家出牌bhuase[j]b[j]endl;card2[j][0]=1;//标记b(玩家)的第i张牌已经打出e=b[j];Sleep(800);break;}}n1=0;n2=0;for(inti=0;i5;i++){n1=n1+card2[i][0];n2=n2+card2[i][1];}if(n1==5){cout玩家赢了;break;}for(j=0;j5;j++){9if(c[j]e&&card2[j][1]==0){cout电脑出牌chuase[j]c[j]endl;card2[j][1]=1;f=c[j];Sleep(800);把密码转换成ANSCII码break;}}n1=0;n2=0;for(i=0;i5;i++){n1=n1+card2[i][0];n2=n2+card2[i][1];}if(n2==5){cout电脑赢了;break;}}n1=0;n2=0;for(i=0;i5;i++)10{n1=n1+card2[i][0];n2=n2+card2[i][1];}if(n1==5||n2==5)break;if(fe){e=0;}if(ef){f=0;}//有一方没牌可出了,由牌点数大的那一方继续出牌}}2.2.3.C二叉排序树的插入(churu)的功能**二叉排序树是基于二叉树的动态查找结构,因此,在二叉排序树中,插入不需要移动数据元素,只需要修改相应结点中的一个空指针即可。node*tree::charu(node*t,intkey){if(t==NULL){11node*p;p=(node*)malloc(sizeof(node));p-data=key;p-LChild=NULL;p-RChild=NULL;t=p;}else{if(keyt-data)t-LChild=charu(LChild,key);elset-RChild=charu(t-RChild,key);}returnt;}2.3.2.D二叉树的排序**就是以中序的方式遍历输出,在排序过程中运用到了递归的算法。voidtree::paixu1(node*t)//中序遍历输出{if(t!=NULL)12{paixu1(t-LChild);coutt-data;paixu1(t-RChild);}}2.3.2.E主函数的实现intmain(){intk=0;srand((unsigned)time(NULL));//调用系统时间为随机函数赋初值intn=0;while(k!=-1){coutendlendlendl;cout\t\t\t**************纸牌游戏****************endl;cout*************************************endl;cout\t\t\t*************1.游戏说明********endl;cout\t\t\t*************2.开始游戏*********endl;13cout\t\t\t**********3.开始出牌***********endl;cout\t\t\t************4游戏结束**********endl;cout*************************************endl;cout\t\t\t请输入(1、2、3、4):endl;cink;switch(k){case1:a.yxsm();break;case2:{a.qk();a.fp();node*t1=NULL;t1=tr.jianlib(t1);tr.paixu1(t1);//中序遍历输出node*t2=NULL;t2=tr.jianlic(t2);n=0;//初始化tr.paixu2(t1,&n);n=0;tr.paixu3(t2,&n);coutendl;a.xswj();14a.xsdn();break;}case3:{a.cp();a.qk();break;}case4:k=-1;break;}}return0;}三、调试分析一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试——调试——再测试——再调试。能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。测试程序需要测试用例,测试用例可用如下公式表示:测试15用例=测试数据+预期结果。好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。还应分别测试输入合法数据与非法数据时,程序的运行情况,。对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。建立游戏主界面游戏说明16开始游戏开始出牌游戏结束17四、实训的经验与心得4.1经验通过对本题目的开发,学到要掌握以下几点内容:大程序的设计风格。按“自顶向下,逐步细化,模块化”的方法进行程序设计。编写函数,并进行测试与调试。当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。数据结构--C++所要求我们掌握的是组织数据、存储数据和处理数据的基本方法,并加强在实际应用中选择合适的数据结构和算法进行训练。定义函数时,应选好参数的个数和数据类型。4.2心得在本次实训中,我遇到的问题是二叉树排序用到了递归的思想,这一块让我感到有点难。自己把课本有关这一块的内容仔细的看了一遍,终于领悟了递归调运的方式和算法。也知道了我的程序纸牌存储在数组里,二叉排序树存储在链表中。排序是需要调运18数组里的元素。老师问我最后一个问题是n=0是什么意思?后来我又看了一遍,明白了它是初始化的意思。在编译程序错误,改了很多次依然显示错误,而且修改时自己能力不足不能一次性修改完,对很多地方的程序不是很熟悉,很多资料都是网上学习然后修改,也有寻求他人帮助的。希望以后能更加努力并做到更好。