数据结构课程设计实验报告.docx_第1页
数据结构课程设计实验报告.docx_第2页
数据结构课程设计实验报告.docx_第3页
数据结构课程设计实验报告.docx_第4页
数据结构课程设计实验报告.docx_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

仲 恺 农 业 工 程 学 院课 程 设 计 报 告课程名称: 数据结构 院(系): 计算机科学与工程专 业:计算机科学与技术班 级: 计算机102班 学 号: 201010214203 姓 名: 指导老师: 成筠 目 录题目(一) 需求和规格说明:问题描述,即题目要解决的问题是什么(二) 算法设计(包括程序流程图,如函数功能、入口及出口参数说明,函数调用关系描述等)(三) 详细设计(源程序清单,要包括足够的注释)(四) 调试分析(包括调试数据与调试结果)(五) 课程设计总结(包括程序中遇到的问题及解决方案,以及课程设计收获)题目 斗地主游戏(简单版)(一) 需求和规格说明:问题描述,即题目要解决的问题是什么系统基本要求:具备基本的界面形式及操作功能具备基本的AI能力解决问题:(1) 以MFC作为程序框架(2) 图片以位图的形式出现,并进行基本的界面操作(3) 以链表及广义表等形式(C+封装好的),进行数据的操作(4) 设计了简单的AI函数,用以对游戏的进行,判断等(二) 算法设计(包括程序流程图,如函数功能、入口及出口参数说明,函数调用关系描述等)整体框架CAboutDlg 类CMainFranme 类CApp 类CDoc 类CView 类 MFC单文档程序的基本框架 作为整个程序的框架结构 主要用到View类 Doc类也用到一些注:此处只出现自定义函数,且具体操作省略Doc类中在构造函数中对委位图信息进行了初次读取View类中 小功能函数Choose_Brand () 进行数据的删减,一般与continuation联用continuation () 得到制定牌型的开始号码 联用seek_max ()machine () 在对应的牌组里面找出该下的牌是否连续OnDraw()OnButton1Clicked()split () 拆分关联器,得到需要的部分用于order函数操作order () 判断处理后的牌是否连续judge_game () 判断点击输出的值是否正确,获得当前所下的牌型,用Brand_size存储 OnLButtonDown():响应鼠标左键点击的消息,传递坐标 传递坐标,用以判断JudgeRect ()判断出所点击的地方是否为卡牌位图 OnDraw():窗口重绘时调用,桌面表示都在这里实现 调 提供数据,在桌面上表示提供数据,在桌面上表示OnButton2Clicked ():响应第二个按钮点击的消息,表示不出,同时,对哪判断哪方出牌(即两个机器方),同时出牌OnButton1Clicked ():响应第一个按钮点击的消息,表示是否出牌,同时判断所出牌是否正确点击第二个按钮OnCreate():窗口创建时调用,在桌面上显示两个按钮点击第一个按钮 (三) 详细设计(源程序清单,要包括足够的注释)斗地主游戏(简单版)源程序(部分)如下:注:由于具体框架为程序自主产生,在这里不再出现,只列出View类函数,程序中绿色程序代码为实验中出错的部分或者验证部分/ 试验品View.cpp : C试验品View 类的实现/#include stdafx.h#include 试验品.h#include 试验品Doc.h#include 试验品View.h#includealgorithm#includeCtime#includevector#ifdef _DEBUG#define new DEBUG_NEW#endif/ C试验品ViewIMPLEMENT_DYNCREATE(C试验品View, CView)BEGIN_MESSAGE_MAP(C试验品View, CView)/ 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView:OnFilePrintPreview)ON_WM_LBUTTONDOWN()ON_WM_CREATE()ON_BN_CLICKED(IDB_BUTTON1,OnButton1Clicked)ON_BN_CLICKED(IDB_BUTTON2,OnButton2Clicked)END_MESSAGE_MAP()/ C试验品View 构造/析构C试验品View:C试验品View(): m_point(0), width(0), height(0), x_machine(0), current_player(0)/ TODO: 在此处添加构造代码 for(int j=0;j20;j+)m_keyj=j+1;for(int i=3;i16;i+)for(int j=0;jGetWindowRect(rcWksMng);height=rcWksMng.bottom-rcWksMng.top;/得到当前窗口大小,当时为什么位图大小无法改变width=rcWksMng.right-rcWksMng.left;CDC MemDC;MemDC.CreateCompatibleDC(NULL);MemDC.SelectObject(pDoc-m_Beijing);pDC-StretchBlt(0,0,width,height,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY);/按照第一二参数为原点坐标,第三四为变化后的宽高,第四为文件句柄指针,后面是原来的 /在OnDraw中可以直接用pDC,但是在其他呢?MemDC.SelectObject(pDoc-m_Bitmap);int width0=width/25;int height0=height/25;pDC-SetStretchBltMode(COLORONCOLOR);/防止失色for(int i=0;iStretchBlt(width0,height-7*height0-i*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY); for(int i=0;iStretchBlt(width-4*width0,height-7*height0-i*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY); int t=0,i=0,j=0,k=0;std:vector B_m;/CBitmap 数组为什么无法相互赋值,而list,vector类型的确需要指针呢for(std:vector:reverse_iterator riter=vec_game.rbegin();riter!=vec_game.rend();riter+)/游戏方牌组所对应的CBitmap值if(*riterm)+j);t=*riter;int p=JudgeRect(m_point);if(p!=-1)/点击桌面的牌牌时,促使弹起for(i=0;iStretchBlt(2*width0+i*width0,height-3*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY);elsepDC-StretchBlt(2*width0+i*width0,height-4*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY);elsefor(i=0;iStretchBlt(2*width0+i*width0,height-3*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY); if(i!=B_m.size()-1) CRectr(2*width0+i*width0,height-3*height0,2*width0+(i+1)*width0,height-3*height0+pDoc-m_nHeight); recti=r; else CRectr(2*width0+i*width0,height-3*height0,2*width0+i*width0+pDoc-m_nWidth,height-3*height0+pDoc-m_nHeight); recti=r; for(i=0;i20;i+)m_npi=0;/表示出所出的牌到桌面上t=0,i=0,j=0,k=0;std:vector BB_m;/CBitmap 数组为什么无法相互赋值,而list,vector类型的确需要指针呢for(std:vector:reverse_iterator riter=vec_chu.rbegin();riter!=vec_chu.rend();riter+)/游戏方所出得牌组所对应的CBitmap值if(*riterm)+j);t=*riter;for(i=0;iStretchBlt(5*width0+i*width0,height-7*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY);if(x_machine!=0)/之所以把current_player=1或者后的操作写在外面,是因为,当鼠标点击到飞按钮区域时图片依然存在std:multimap mp_machine,pm_machine,mmpp,ppmm;std:multimap:size_type st;std:multimap:iterator iter_machine;if(current_player=1)transition(mp_machine,pm_machine,vec1); vcc.clear();/需要消去原来的元素,避免元素叠加 machine(vec1,mp_machine,pm_machine);elsetransition(mp_machine,pm_machine,vec2); vcc.clear(); machine(vec2,mp_machine,pm_machine);transition(mmpp,ppmm,vcc);judge_game(mmpp,ppmm,vcc); x_machine=0; if(current_player=1)/当一比二先下时的情况,包含接下来得二所要下的形式 std:vector B_m1;/CBitmap 数组为什么无法相互赋值,而list,vector类型的确需要指针呢i=3; for(std:vector:reverse_iterator riter=vcc.rbegin();riter!=vcc.rend();riter+) /游戏方牌组所对应的CBitmap值if(*riterm)+j); t=*riter; for(i=0;iStretchBlt(5*width0+i*width0,height-11*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY); /以下是,机器一后,判断机器二是否有下,如果有则进行处理,可以加入更多的只能 std:map c; c=Brand_size.begin()-first; int x=c.begin()-first; int y=c.begin()-second; int z=Brand_size.begin()-second; int xx=0; std:multimap mmm,ppp; transition(mmm,ppp,vec2); xx=continuation(mmm,z,y,x);/表示机器二是否有牌 if(xx=0) current_player=1;/当二下次无法找到牌时,就在桌面上保持一的存在 else current_player=2; if(xx!=0) if(x=1&vec2.size()3)|(x=2&vec2.size()5)|(x=1&z2)|(x=2&z4) std:multimap mp_machine,pm_machine,mmpp,ppmm; std:multimap:size_type st; std:multimap:iterator iter_machine; transition(mp_machine,pm_machine,vec2); vcc.clear(); machine(vec2,mp_machine,pm_machine);/功能是除去vec2中的元素到vcc中作为图片载入的依据 transition(mmpp,ppmm,vcc); judge_game(mmpp,ppmm,vcc);/改变Brand_size的数值,保持与当时下牌方一致 if(current_player=2)/二下牌后的图片显示 std:vector B_m1;/CBitmap 数组为什么无法相互赋值,而list,vector类型的确需要指针呢i=3;/因为时间缘故,且不知道怎么判断花色,所以就直接的玩家下的牌就从前面顺序在m中找出CBitmap而两个机器就直接从后面算起,所以i=3; for(std:vector:reverse_iterator riter=vcc.rbegin();riter!=vcc.rend();riter+) /游戏方牌组所对应的CBitmap值if(*riterm)+j); t=*riter; for(i=0;iStretchBlt(5*width0+i*width0,height-15*height0,3*width0,3*height0,&MemDC,0,0,pDoc-m_nWidth,pDoc-m_nHeight,SRCCOPY); current_player=2;/使得机器二能够在桌面上保持显示,直到二没有牌下,也作为玩家不要时,下牌者的判断依据/ TODO: 在此处为本机数据添加绘制代码/ C试验品View 打印BOOL C试验品View:OnPreparePrinting(CPrintInfo* pInfo)/ 默认准备return DoPreparePrinting(pInfo);void C试验品View:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加额外的打印前进行的初始化过程void C试验品View:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加打印后进行的清除过程/ C试验品View 诊断#ifdef _DEBUGvoid C试验品View:AssertValid() constCView:AssertValid();void C试验品View:Dump(CDumpContext& dc) constCView:Dump(dc);C试验品Doc* C试验品View:GetDocument() const / 非调试版本是内联的ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(C试验品Doc);return (C试验品Doc*)m_pDocument;#endif /_DEBUG/ 判断点是否在矩形里面,返回对应矩形号int C试验品View:JudgeRect(CPoint point)if(point.xrect19.right|point.yrect0.bottom)for(int i=0;i20;i+)/需要这个否则点击随意后其他虽然弹入,但是当点其他时,还是会重新弹出,同时,不进行赋值的话,第一次点击不会弹出因为第一次时,下面的if语句会直接先赋值,即点击后还是按照原来的图片形式m_npi=0;return -1;for(int i=0;irecti.left&point.xrecti.top&point.yrecti.bottom)if(m_npi)m_npi=0;elsem_npi=1;return i;return -1;int C试验品View:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: 在此添加您专用的创建代码int w=width/25;int h=height/25;/m_Button1.Create(_T(出牌),WS_CHILD | BS_PUSHBUTTON | WS_BORDER,/vs2005本身问题,需要把char 转换为LPCTSTR类型m_Button1.Create(_T(出牌),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE|WS_BORDER,CRect(400,20,480,60),this,IDB_BUTTON1);m_Button2.Create(_T(不出),WS_CHILD | BS_PUSHBUTTON |WS_VISIBLE | WS_BORDER,CRect(500,20,580,60),this,IDB_BUTTON2);return 0;void C试验品View:OnButton1Clicked()int i,x1,y1,z1;int t=0;std:vector vec;/CString s;s.Formatstd:vector:reverse_iterator riter=vec_game.rbegin();std:map c1;if(current_player=1|current_player=2)c1=Brand_size.begin()-first; x1=c1.begin()-first; y1=c1.begin()-second; z1=Brand_size.begin()-second;std:multimap mp,pm;for(i=0;i20;i+)if(m_npi=1)vec.push_back(*(riter+i);t=1;if(t=0)MessageBox(_T(请选择输出的牌);elsestd:sort(vec.begin(),vec.end(); transition(mp,pm,vec); judge_game(mp,pm,vec);std:map c; c=Brand_size.begin()-first;int x=c.begin()-first;int y=c.begin()-second;int z=Brand_size.begin()-second;if(current_player=1|current_player=2)if(x1!=x)|(y1!=y)|(!(z1z)MessageBox(_T(请重新选择输出的牌);std:map t;t.insert(std:map:value_type(x1,y1);Brand_size.clear();Brand_size.insert(std:mapstd:map,int:value_type(t,z1);x=0;y=0;z=0;InvalidateRect(FALSE);if(x!=0&y!=0&z!=0)i=vec_game.size()-1;vec_chu.clear();for(std:vector:iterator iter=vec_game.begin();iter!=vec_game.end();i-)/减去游戏者所下的牌if(m_npi=1)vec_chu.push_back(*iter);iter=vec_game.erase(iter);elseiter+;std:multimap mmm,ppp,mmm1,ppp1; transition(mmm,ppp,vec1); x_machine=continuation(mmm,z,y,x);/表示机器一是否有牌if(x_machine=0)/如果一有下,则调用一下地情况transition(mmm1,ppp1,vec1); x_machine=continuation(mmm1,z,y,x);/表示机器二是否有牌if(x_machine=0)/否则,调用二下的情况,可以加入一些智能current_player=0;elsecurrent_player=2; elsecurrent_player=1;/表示机器出牌/x_machine=1;InvalidateRect(FALSE);/传递窗口重绘的消息该OnDraw()/CString str;/ str.Format(_T(%d,%d,%d,x,y,z);想用这个调式看结果但是谁让对了,但是输出不对,到底该怎么用呢/MessageBox(str);void C试验品View:OnButton2Clicked()std:vector:iterator ir;std:map t;int d,k;if(current_player=1)ir=vec1.begin();d=*ir;k=std:count(vec1.begin(),vec1.end(),d);if(k=1)vcc.clear();vcc.push_back(d);vec1.erase(ir);t.insert(std:map:value_type(k,1); Brand_size.clear(); Brand_size.insert(std:mapstd:map,int:value_type(t,d);if(k=2)vcc.clear();vcc.push_back(d);vcc.push_back(d);ir=vec1.erase(ir);vec1.erase(ir);t.insert(std:map:value_type(2,1); Brand_size.clear(); Brand_size.insert(std:mapstd:map,int:value_type(t,d);if(current_player=2)ir=vec2.begin();d=*ir;k=std:count(vec2.begin(),vec2.end(),d);if(k=1)vcc.clear();vcc.push_back(d);vec2.erase(ir,ir+1);t.insert(std:map:value_type(k,1); Brand_size.clear(); Brand_size.insert(std:mapstd:map,int:value_type(t,d);if(k=2)vcc.clear();vcc.push_back(d);vcc.push_back(d);ir=vec2.erase(ir,ir+2);/vec2.erase(ir);t.insert(std:map:value_type(2,1); Brand_size.clear(); Brand_size.insert(std:mapstd:map,int:value_type(t,d);/ 得到连续的牌号(与order的区别在于,order只是判断所给的数据是不是符合,而这个函数则是找遍关联器直到找到或者都找完为止)int C试验品View:continuation(std:multimap mmp, int d, int k, int wc)/得到连续的牌号(与order的区别在于,order只是判断所给的数据是不是符合,而这个函数则是找遍关联器直到找到或者都找完为止)int n=1,i;/n是用来记录iter运行到哪个数,用在判断剩下的数够不够再进行一次循环判断std:multimap:iterator iter=mmp.begin();std:multimap m;int j=0;int initial_number=0;for(i=0;ifirstd)break;n+;iter+;/当iter-firstd时,需要不断地加iter找到最小的大于数if(i=mmp.size()/找不到跳出return 0;while(1)if(mmp.size()-n+1/*加一是因为每次都是在上次不能连续点开始的,所以剩下的数必须加上原来的一个点*/)first;/作为开始点/if(initial_number10)/当开始点大于时会出现,但是(即对应的)是不能出现的/return 0;m.clear();/每次都要把存储判断数组清零for(j=iter-first;jfirst+k;j+)m.insert(std:multimap:value_type(j,j);/组建判断数组,iter无法加k,只能重载自加运算符 int cnt=0;std:multimap:iterator it=m.begin(); while(/*(+iter)!=m.end()&*/mmp.find(it-first)/*得到对应键*/!=mmp.end()/判断数据是否连续/*得到iter+,每次都指向下一个,必须在前面,因为it不符合时,必须跳过,但是iter必须是下一个*/iter+;/if(iter=m.end()/为什么无法这样呢,无法用m.end()与之相等/break;if(wcmmp.find(it-first)-second)/有这个判断,可以得到连续的双或者三iter+;/本意是指向下一个(因为原来有加,但是后来下面又减了,所以要加,n+;/指向下一个break;+cnt; +it;n+;/每次都指向下一个 if(cnt=k)/记录,是否连续的关键return initial_number;iter-;/加上这个是因为,当出现不符合。find()时,iter还是会加一,也就是在不连续点的下一个点,所以需要返回到不连续点处return 0;/ /删去下一次出牌方下的牌,与continuation()连用,分别是判断(上面只是判断连续的方面),取牌initial_number/*开始的牌号*/,continuation_number/*连续量*/,suit_patterns/*是双是单还是三,四的*/void C试验品View:Choose_Brand(std:vector & vc,std:vector & c,int initial_number/*开始的牌号*/,int continuation_number/*连续量*/,int suit_patterns/*是双是单还是三,四的*/)/删去下一次出牌方下的牌,与continuation()连用,分别是判断(上面只是判断连续的方面),取牌int d=initial_number,i;for(i=0;icontinuation_number;i+)std:vector:iterator iter=std:find(vc.begin(),vc.end(),initial_number+);for(int j=0;jsuit_patterns;j+)c.push_back(*iter);iter=vc.erase(iter);/ 拆分关联器,得到需要的部分用于操作,注意这里输入的要是以牌数为键值的pm因为只有以牌数为键值的在后面才是牌数最多的牌号std:multimap C试验品View:split(std:multimap pmm, int k)std:multimap:iterator iter=pmm.begin();for(int i=0;ik;i+)iter+;/iter=iter+1; multimap的迭代器不能使用加减号,只能自增自减/iter=iter+k-1;std:multimap m;dom.insert(std:multimap:value_type(iter-second,iter-first);/输出时是按照牌号为键值的,所以需要倒过来iter+;while(iter!=pmm.end();return m;/ /判断不重复后的牌组,是否连续int C试验品View:order(std:

温馨提示

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

评论

0/150

提交评论