纸牌游戏数据结构实训报告.docx
- 文档编号:9901775
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:13
- 大小:124.36KB
纸牌游戏数据结构实训报告.docx
《纸牌游戏数据结构实训报告.docx》由会员分享,可在线阅读,更多相关《纸牌游戏数据结构实训报告.docx(13页珍藏版)》请在冰豆网上搜索。
纸牌游戏数据结构实训报告
一、课题目标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、QKA、大小王),俩人进行游戏,其中一个为用户,一个为计算机;
#每人每轮各发五张牌,各自以这五张牌建立二叉排序树;
#游戏由用户先出,轮流出牌,每次只能出一张牌并且要比被别人出的大,如:
用户出3,计算机则要出比3打的纸牌,没有则选择不出;
#最先出完纸牌的人获胜。
二、概要设计及功能的实现
2.1纸牌游戏的框架图
22主函数和子函数的框架图
子函数框架图
出牌的框架图
建立二叉排序树的
2.3具体的实现
2.3.1类的设计
首先在程序中必须有类,而我的纸牌游戏要求是有纸牌和以纸牌建立二叉排序树,故有两个类:
classPlayingCards和classtree
2.3.2功能的实现
2.3.2.A发牌的功能
**实现纸牌游戏发牌(fp)的功能,它的初始条件是该纸牌已存在,操作结果是给用户和电脑每人发5张牌。
voidPlayingCards:
:
fp()
{intl,e;//临时储存随机牌数
intf;
for(inti=0;i<5;i++)
{
l=rand()%9+2;//用户得到牌的点数
cout<<"发到的牌"< 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张牌,操作结果是由用户先出牌,且后一个人出牌的点数要比前一个人出牌的点数大,谁先出完谁赢。 voidPlayingCards: : cp() {inte=0;intf=0; intn1=0;intn2=0;//记录牌打出几张 for(intm=0;m<5;m++){ for(inti=0;i<5;i++) { if(b[j]>f&&card2[j][0]==0) { cout<<"玩家出牌"< 打出 card2[j][0]=1;//标记b(玩家)的第i张牌已经 e=b[j];Sleep(800); break; } } n1=0;n2=0; for(inti=0;i<5;i++) { n1=n1+card2[i][0]; n2=n2+card2[i][1]; } if(n1==5) {cout<<"玩家赢了"; break; } if(c[j]>e&&card2[j][1]==0) cout<<"电脑出牌"< 把密码转换成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; 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,intkey) { 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->LChild=charu(LChild,key); else t->RChild=charu(t->RChild,key); } returnt; } 2.3.2.D二叉树的排序 **就是以中序的方式遍历输出,在排序过程中运用到了递归的算法。 voidtree: : paixu1(node*t)//中序遍历输出 { if(t! =NULL) paixu1(t->LChild); cout< } } 2.3.2.E主函数的实现 intmain() {intk=0; srand((unsigned)time(NULL));//调用系统时间为随机函数赋初值 intn=0; while(k! =-1) 纸牌游 {cout< cout<<"\t\t\t"<<"************** < cout<<"\t\t\t"<<" *************1. 游戏说明******** "< cout<<"\t\t\t"<<" *************2. 开始游戏********* cout<< W*************************************'' < "< "< "< cout<<"\t\t\t"<<"请输入(1、2、3、4): "< cin>>k; 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);cout< a.xswj(); a.xsdn(); break;} case3: { a.cp();a.qk();break; } case4: k=-1;break; } } return0; } 三、调试分析 一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。 在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。 测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。 调试则是确定测试中找到的错误性质并改正错误的过程。 测试与调试通常交替进行,即测试——调试——再测试——再调试。 能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。 测试程序需要测试用例,测试用例可用如下公式表示: 测试 用例=测试数据+预期结果。 好的测试用例应该是用尽可能少的测试数据发现尽可能多的错 误,即发现错误的概率要大。 要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。 还应分别测试输入合法数据与非法数据时,程序的运行情况,。 对于合 法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。 建立游戏主界面 ********;L⅛⅛i⅛∣3≠≠≠⅛4⅜≠κ⅜=*⅛*≠21 i⅛⅞i⅛Λ 游戏说明 ⅛⅛≠^⅛≠⅛⅛⅛ψ*i⅛f^^^Jζ∣J⅛⅛⅛⅛⅛≠⅛⅛⅛⅛⅛⅛⅛⅛*⅛ : ⅛**≠≠**≠⅛***=≠***≠≠**≠=≠**≠≠**3∣ζ≠⅛**≠≠**≡∣C≠** ⅛*⅛⅛r⅛⅛⅛⅛ct≠ψ⅛⅛: Ia游戏说明⅛⅞-≠ψ⅛⅛r⅛⅛jfc⅛≠4cj⅛++≠⅛++≠≠2j弃》會潘戏*≠⅛***⅛≠*⅛≠⅛⅛⅛≠*≡∣rr≠**^3,开j看出牌*≠^⅛⅛^≠⅛⅛≠⅛ ⅛⅛⅛4L≠⅛⅛e≠⅛∣c⅛i⅛L⅛4⅛ι'S'Jλt⅛r□F⅛j⅛^⅛et⅛⅛e⅛⅛jt⅛ ≠+≠4⅛++≠^≠*4^++4^+≠4⅛++*^≠*^≠*≠^+≠ 请输入口、誤J4; 最兀出完 厚建立二叉樹*由用户先出,轮流岀牌 开始出牌 游戏结束 半****芈半****牢****半****牢半**************半牢*** ≠+≠≠+≠+≠++≠+≠1.游戏i兑明******** φ≠≠⅛≠ψ≠≠≠≠≠+≠2.弁始潴戏**********************3.并始出牌*+≠≠+≠≠≠≠⅛≠≠^: ≠ψ≠*ψ≠ψ*≠⅛≠+≠4i⅛⅛⅛□⅛********** ******牢***半半****牢半**********牢***半牢*** 请输入⑴2、3、4) pressanykeytoCOntirIUe 四、实训的经验与心得 4.1经验 通过对本题目的开发,学到要掌握以下几点内容: 大程序的设计风格。 按“自顶向下,逐步细化,模块化”的方法进行程序设计。 编写函数,并进行测试与调试。 当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。 数据结构--C++所要求我们掌握的是组织数据、存储数据和处理 数据的基本方法,并加强在实际应用中选择合适的 数据结构和算法进行训练。 定义函数时,应选好参数的个数和数据类型。 4.2心得 在本次实训中,我遇到的问题是二叉树排序用到了递归的思想,这一块让我感到有点难。 自己把课本有关这一块的内容仔细的看了一遍,终于领悟了递归调运的方式和算法。 也知道了我的程序纸牌存储在数组里,二叉排序树存储在链表中。 排序是需要调运后来我又看了一遍,明白了它是初始化的意思。 在编译程序错误,改了很多次依然显示错误,而且修改时自己能力不足不能一次性修改完,对很多地方的程序不是很熟悉,很多资料都是网上学习然后修改,也有寻求他人帮助的。 希望以后能更加努力并做到更好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 纸牌 游戏 数据结构 报告