目录一、课题目标 (3)1.1纸牌游戏的简介 (3)1.2纸牌游戏的基本要求 (3)二、概要设计及功能的实现 (3)2.1纸牌游戏的框架图 (3)2.2主函数和子函数的框架图 (4)2.3具体的实现 (7)2.3.1类的设计 (7)2.3.2功能的实现 (7)2.3.2.A发牌的功能 (7)2.3.2.B出牌的功能 (8)2.3.2.C二叉排序树的插入的功能 (11)2.3.2.D二叉树的排序 (12)2.3.2.E主函数的实现 (12)三、调试分析 (15)四、实训的经验与心得 (18)4.1经验 (18)4.2心得 (18)一、课题目标1.1纸牌游戏的简介创建一副扑克牌,通过用户与电脑的轮流出牌,谁先出完牌,谁就获胜。
1.2纸牌游戏的基本要求# 这幅扑克牌没有花色(J、Q、K、A、大小王),俩人进行游戏,其中一个为用户,一个为计算机;# 每人每轮各发五张牌,各自以这五张牌建立二叉排序树;# 游戏由用户先出,轮流出牌,每次只能出一张牌并且要比被别人出的大,如:用户出3,计算机则要出比3打的纸牌,没有则选择不出;# 最先出完纸牌的人获胜。
二、概要设计及功能的实现2.1纸牌游戏的框架图2.2子函数框架图出牌的框架图建立二叉排序树的2.3具体的实现2.3.1类的设计首先在程序中必须有类,而我的纸牌游戏要求是有纸牌和以纸牌建立二叉排序树,故有两个类:class PlayingCards和class tree2.3.2功能的实现2.3.2.A发牌的功能**实现纸牌游戏发牌(fp)的功能,它的初始条件是该纸牌已存在,操作结果是给用户和电脑每人发5张牌。
void PlayingCards::fp(){int l,e;//临时储存随机牌数int f;for(int i = 0;i < 5;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;e = 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张牌,操作结果是由用户先出牌,且后一个人出牌的点数要比前一个人出牌的点数大,谁先出完谁赢。
void PlayingCards::cp(){ int e = 0; int f = 0;int n1 = 0;int n2 = 0;//记录牌打出几张for(int m = 0;m < 5;m++){for(int i = 0;i < 5;i++){for(int j = 0;j < 5;j++){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(int i = 0;i < 5; i++){n1 = n1 + card2[i][0];n2 = n2 + card2[i][1];}if(n1 == 5){cout<<"玩家赢了 ";break;}for( j = 0;j < 5;j++){if(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;i < 5; i++){n1 = n1 + card2[i][0];n2 = n2 + card2[i][1];}if(n2 == 5){cout<<"电脑赢了";break;}}n1 = 0;n2 = 0;for( i = 0;i < 5; i++){n1 = n1 + card2[i][0];n2 = n2 + card2[i][1];}if(n1 == 5 || n2 == 5)break;if(f > e){e = 0;}if(e > f){f = 0;}//有一方没牌可出了,由牌点数大的那一方继续出牌 }}2.2.3.C二叉排序树的插入(churu)的功能**二叉排序树是基于二叉树的动态查找结构,因此,在二叉排序树中,插入不需要移动数据元素,只需要修改相应结点中的一个空指针即可。
node * tree::charu(node *t , int key){if(t == NULL){node * p;p = (node *)malloc(sizeof(node));p->data = key;p->LChild = NULL;p->RChild = NULL;t = p;}else{if(key < t->data)t->LChild = charu(LChild, key);elset->RChild = charu(t->RChild, key);}return t;}2.3.2.D二叉树的排序**就是以中序的方式遍历输出,在排序过程中运用到了递归的算法。
void tree::paixu1(node * t) //中序遍历输出{if(t != NULL){paixu1(t->LChild);cout<< t->data<<" ";paixu1(t->RChild);}}2.3.2.E主函数的实现int main(){int k =0;srand((unsigned)time(NULL));//调用系统时间为随机函数赋初值int n = 0;while(k != -1){cout<<endl<<endl<<endl;cout<<"\t\t\t"<<" **************纸牌游戏****************"<<endl;cout<<"*************************************"<<endl;cout<<"\t\t\t"<<" *************1.游戏说明******** "<<endl;cout<<"\t\t\t"<<" *************2.开始游戏********* "<<endl;cout<<"\t\t\t"<<"**********3.开始出牌 *********** "<<endl;cout<<"\t\t\t"<<"************4游戏结束 ********** "<<endl;cout<<"*************************************"<<endl;cout<<"\t\t\t"<<"请输入(1、2、3、4) : "<<endl;cin>>k;switch(k){case 1: a.yxsm(); break;case 2:{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);cout<<endl;a.xswj();a.xsdn();break;}case 3: {a.cp(); a.qk(); break;}case 4: k = -1; break;}}return 0;}三、调试分析一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。
在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。
测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。
调试则是确定测试中找到的错误性质并改正错误的过程。
测试与调试通常交替进行,即测试——调试——再测试——再调试。
能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。
测试程序需要测试用例,测试用例可用如下公式表示:测试用例=测试数据+预期结果。
好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。
要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。
还应分别测试输入合法数据与非法数据时,程序的运行情况,。
对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。
建立游戏主界面游戏说明开始游戏开始出牌游戏结束四、实训的经验与心得4.1经验通过对本题目的开发,学到要掌握以下几点内容:大程序的设计风格。