五子棋程序设计课程设计报告书_第1页
五子棋程序设计课程设计报告书_第2页
五子棋程序设计课程设计报告书_第3页
五子棋程序设计课程设计报告书_第4页
五子棋程序设计课程设计报告书_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、文档编号:项目名称 版本 五子棋程序设计课程设计报告书制订人:王贤学 号:3 2010年7月6日 文档变更历史记录序号变更日期变更人员变更内容详情描述版本12010/6/13王贤创建MFC框架1.022010/6/18王贤创建基本的函数1.132010/6/21王贤实现基本函数的部分内容1.342010/6/28王贤将禁手等函数具体内容实现1.452010/7/05王贤调试所有的函数并运行正常1.5目录1、引言41.1 编写目的41.2 读者对象41.3 软件项目概述41.4 文档概述51.5 定义51.6 参考资料52、任务概述52.1目标52.2软件的开发和运行环境62.3 用户特征62.

2、4 假设与约束62.5 进度要求72.6验收要求73、功能需求描述与测试方案:84、界面要求215、功能设计225.1类的关系描述225.2类的设计226、使用指南247、总结248、附录251、引言1.1 编写目的本文档为用户和软件设计者提供一个交流的平台。在其中包含了用户所要求完成的功能,软件设计师实现的初步设想并最终实现的代码。同时,为用户提供了使用的约束条件、使用手册,方便用户更好的使用本软件。1.2 读者对象本文档的读者是最终验收者(教员和辅导员)。1.3 软件项目概述l 项目名称:五子棋游戏l 简称:五子棋l 项目代号:无l 软件项目的大致功能和性能要求为:1) 设计一个五子连珠类

3、;2) 记录游戏双方的游戏过程,允许悔棋;3) 实现保存棋谱和根据棋谱复盘的功能;4) 判断双方输赢,先走出五子连珠的一方胜;5) 响应用户的鼠标消息,并显示棋盘信息;6) 判断先下者落子时不允许走禁手。1.4 文档概述本文档向用户和验收人员提供了一个很好的了解效果。在文档中,有用户提出的需求(功能),有整个框架的具体描述,有每一个添加功能的具体实现代码以及测试结果。最终具体描述了软件使用的说明。1.5 定义五1.6 参考资料【1】程序设计课程设计国防科大印刷厂【2】面向对象程序设计与Visual C+ 6.0教程 清华大学出版社【3】Visual C+ 6.0 人民邮电大学出版社【4】Vis

4、ual C+ 实用教程电子工业出版社2、任务概述2.1目标用户提出需要设计出一个五子棋游戏,可以在任何的情况下都可以独立的运行。在这种要求下,我们设计了本游戏,包含了全部内容。不需要任何其他软件的支持。本软件的用户要注意读好使用说明和功能描述,不能任意的去修改或使用不允许的使用方法。本软件实现如下的功能:1) 设计一个五子连珠类;2) 记录游戏双方的落子过程,允许悔棋;3) 实现保存棋谱和根据棋谱复盘的功能;4) 判断双方输赢,先走出五子连珠的一方胜;5) 响应用户的鼠标消息,并显示棋盘信息;6) 判断先下者落子时不允许走禁手。2.2软件的开发和运行环境本软件可在Windows XP操作系统以

5、上运行,支持软件为Microsoft Visual C+ 6.0. 2.3 用户特征本软件适用于所有的了解五子棋并使用它的用户。2.4 假设与约束如果软件在使用时出现了问题,不要让其他的非软件设计师来更改我们的代码,这样我们的软件将很难维护,联系我们可以无偿的为用户提供维修服务。如果在长期的使用过程中,有很多的功能需要添加时,可以再联系我们来为用户的软件升级,并不需要很多的经费。使用过程中,建议为我们提供用户的使用情况,以便我们更好的改进软件功能,解决软件中隐藏的一些错误之处。同时可以方便我们的维护和升级使用。2.5 进度要求本软件的设计和实现完成时间为6月9号到7月7日: 6月9日6月15日

6、:做好需求分析,撰写需求文档;6月16日6月20日:搭建每个模块的函数,将所有功能描述完;6月20日6月25日:完成除禁手以外的所有功能的具体实现;6月25日6月27日:完成复杂的禁手函数的编写;6月27日6月30日:测试通过所用的函数功能;7月1日7月4日:进一步对照需求文档来完善软件设计;7月4日7月7日:撰写软件报告,向用户交付。2.6验收要求验收必须完成用户提出的基本需求完成以下的基本功能:1) 设计一个五子连珠类;2) 记录游戏双方的落子过程,允许悔棋;3) 实现保存棋谱和根据棋谱复盘的功能;4) 判断双方输赢,先走出五子连珠的一方胜;5) 响应用户的鼠标消息,并显示棋盘信息;6)

7、判断先下者落子时不允许走禁手。在完成用户的基本功能之后,我们还要上交需求分析,测试文档,以及用户使用手册。在交上文档的同时,设计者要为用户演示软件的功能,在文档中提到的功能和测试方案以及运行结果。在用户了解软件描述文档后,设计者即可向用户展示并交付软件。3、 功能需求描述与测试方案:此软件实现的功能有以下几种:记录双方的落子过程并允许悔棋;保存棋盘和恢复棋盘的功能;判断双方输赢;判断禁手等。下面就每个功能详细说明它们的具体实现和测试结果。(1)记录双方的落子过程并具有悔棋功能:这个悔棋功能是:双方一人一个得悔棋,知道棋盘中再也没有棋子,这时游戏会自动的弹出对话框,提示用户已经不能在悔棋了。悔棋

8、功能选项是加入在附加功能选项中。在这个悔棋的函数中出现了很多的调用关系:i控制下棋子的次序,如果为偶数则是红方下子,反之则黑方下;pp悔棋后,如果将对话框最小化,就会调用OnDraw函数,重新画出悔的第一个点,在这里将它置值为1,控制OnDraw中的画点函数不调用,见附录1;re3612用于存储下棋顺序的数组,悔棋时按照逆序即可悔棋;Qing(&pDC)此函数是将棋盘用底色矩形覆盖,见附录2;ChongHua(&pDC)这个函数的是将棋盘数组依据p1919重画所有点,见附录3;/悔棋调用的函数void CWzqView:OnHuiqi() / TODO: Add your command ha

9、ndler code here i-;pp=1;qq=1;/用于处理悔棋后让对话框变成最小又重新画当前点的问题CClientDC pDC(this);Qing(&pDC);/棋盘清除pprexprey=-1;/将刚刚画出的点去除ChongHua(&pDC);/依据新的数组重新画出棋盘OnDraw(&pDC);if(i-1)0)MessageBox(盘面上已经没有棋子!不能再悔棋了!);elseprex=rei-20;prey=rei-21;pp=0;测试结果:下图悔棋前的棋盘布局:下图为悔棋后的棋盘布局:(2)保存棋盘和恢复棋盘的功能:该部分实现的是保存和恢复棋盘的功能,这两个功能选项也是添加

10、在附加功能栏中,玩家可以自己选择。但是本功能只支持存盘一次,如果多次存盘,以最近的一次存盘为准。在每次的回复棋盘之后,游戏会提醒玩家现在轮到谁下子了。这里的保存和恢复功能是通过C+的文件流输入输出实现的。并没有利用MFC为我们提供的保存和打开函数。具体的代码如下:/当附加功能中的保存被按下时调用的保存函数void CWzqView:OnSavefile() / TODO: Add your command handler code hereFILE *fp;if(fp=fopen(wzq.txt,w)=NULL)MessageBox(棋盘保存失败!);return;for(m=0;m19;m+

11、)for(n=0;n19;n+)fprintf(fp,%d ,pmn);for(m=0;m361;m+)for(n=0;n2;n+)fprintf(fp,%d ,remn);fprintf(fp,%d %d %d %d ,i,pp,prex,prey);MessageBox(本次棋盘保存成功!可以继续操作!);fclose(fp);/当附加功能中的打开被按下时,调用的函数void CWzqView:OnOpenfile() / TODO: Add your command handler code hereCClientDC pDC(this);FILE*fp;if(fp=fopen(wzq.

12、txt,r)=NULL)MessageBox(棋盘载入失败!);return;for(m=0;m19;m+)for(n=0;n19;n+)fscanf(fp,%d ,&pmn);for(m=0;m361;m+)for(n=0;n2;n+)fscanf(fp,%d ,&remn);fscanf(fp,%d %d %d %d ,&i,&pp,&prex,&prey);fclose(fp);ChongHua(&pDC);/将棋盘重新画一遍if(i%2!=0)MessageBox(现在是黑子一方下棋!);elseMessageBox(现在是红子一方下棋!);测试结果:下图为保存棋盘操作:下图为打开棋盘

13、操作:(3)判断输赢:在判断输赢的过程中软件是通过求出当前下子点的四个方向上的点分布情况来和中间点进行比较来实现的。函数中用到很多的变量:xMin存放横坐标减5与0比较的最小值;xMax存放横坐标加5与18比较的最大致;yMin存放纵坐标减5与0比较的最小值;yMax存放纵坐标加5与18比较的最大值;s和j控制循环;sum1/2/3/4记录四个方向上棋子颜色与中间棋子相同的个数,当某一个方向上有五个时,即可判胜。具体代码如下:/判断输赢的函数体int CWzqView:IsWin(int x,int y)int xMin=max(0,x-4);int xMax=min(18,x+4);int

14、yMin=max(0,y-4);int yMax=min(18,y+4);int s,j,m,n,sum1,sum2,sum3,sum4;for(j=xMin;j=xMax;j+)for(s=j,sum1=0;sj+5;s+)if(psy=pxy) sum1+;if(sum1=5) return 1;for(s=yMin;s=yMax-4;s+)for(j=s,sum2=0;jxMin&jyMin;s-,j-);for(;s=xMax-4&j=yMax-4;s+,j+)for(sum3=0,m=s,n=j;mxMin&jyMax;s-,j+);for(;s=yMin-4;s+,j-)for(s

15、um4=0,m=s,n=j;mnGetBoardRowNum();/ get the row number from doc/ draw the row linesCPen pen;pen.CreatePen(PS_SOLID, WIDTH_Pen, (int)COLOR_Pen);for(int nRow = 0; nRow MoveTo(XPOS_TopLeft, YPOS_TopLeft + nRow * WIDTH_BoardGrid);pDC-SelectObject(&pen);pDC-LineTo(XPOS_TopLeft + (nBoardRowNum - 1) * WIDTH

16、_BoardGrid, YPOS_TopLeft + nRow * WIDTH_BoardGrid);/ draw the column linesfor(int nColumn = 0; nColumn MoveTo(XPOS_TopLeft + nColumn * WIDTH_BoardGrid, YPOS_TopLeft);pDC-SelectObject(&pen);pDC-LineTo(XPOS_TopLeft + nColumn * WIDTH_BoardGrid, YPOS_TopLeft + (nBoardRowNum - 1) * WIDTH_BoardGrid);/ Gra

17、w 4 PointsCPoint pt; CBrush brush;brush.CreateSolidBrush(COLOR_Brush);CRgn rgnPoint;pt = ptConvertBP2VP(3, 3);rgnPoint.CreateEllipticRgn( pt.x - WIDTH_Point,pt.y - WIDTH_Point,pt.x + WIDTH_Point,pt.y + WIDTH_Point);pDC-FillRgn(&rgnPoint, &brush);rgnPoint.DeleteObject();pt = ptConvertBP2VP(3, 15);rgn

18、Point.CreateEllipticRgn( pt.x - WIDTH_Point,pt.y - WIDTH_Point,pt.x + WIDTH_Point,pt.y + WIDTH_Point);pDC-FillRgn(&rgnPoint, &brush);rgnPoint.DeleteObject();pt = ptConvertBP2VP(15, 3);rgnPoint.CreateEllipticRgn( pt.x - WIDTH_Point,pt.y - WIDTH_Point,pt.x + WIDTH_Point,pt.y + WIDTH_Point);pDC-FillRgn

19、(&rgnPoint, &brush);rgnPoint.DeleteObject();pt = ptConvertBP2VP(15, 15);rgnPoint.CreateEllipticRgn( pt.x - WIDTH_Point,pt.y - WIDTH_Point,pt.x + WIDTH_Point,pt.y + WIDTH_Point);pDC-FillRgn(&rgnPoint, &brush);rgnPoint.DeleteObject();/ draw pieceif(pp=0&qq=0)/第二个添加部分pt = pDoc-ptGetPiecePos();if ( (pt.

20、x = 0) & (pt.y = 0) )vDrawPiece(pt, 0, pDC);ReleaseDC(pDC);(2)附录2本函数是将棋盘画上有底色矩形的具体实现。/将棋盘重新化函数void CWzqView:Qing(CDC* pDC)CBrush* BrushOld,BrushNew;BrushNew.CreateSolidBrush(RGB(100,100,200);BrushOld=pDC-SelectObject(&BrushNew);pDC-Rectangle(XPOS_TopLeft-WIDTH_BoardGrid,YPOS_TopLeft-WIDTH_BoardGrid,

21、XPOS_TopLeft+19*WIDTH_BoardGrid,YPOS_TopLeft+19*WIDTH_BoardGrid);pDC-SelectObject(BrushOld);BrushNew.DeleteObject();测试解果为:(2)附录2这个函数实现了在棋盘上画出原来的棋盘数组中有记录的棋子情况。/重新画出棋盘的棋子void CWzqView:ChongHua(CDC * pDC)for(m=0;m19;m+)for(n=0;nFillRgn(&rgnPiece, &brush);rgnPiece.DeleteObject();if(pmn=1)CRgn rgnPiece;C

22、Point pointView = ptConvertBP2VP(m,n);rgnPiece.CreateEllipticRgn(pointView.x - WIDTH_Piece,pointView.y - WIDTH_Piece,pointView.x + WIDTH_Piece,pointView.y + WIDTH_Piece);CBrush brush;brush.CreateSolidBrush(RGB(255,0,0);pDC-FillRgn(&rgnPiece, &brush);rgnPiece.DeleteObject();测试结果:(4)附录4在画点的函数中,响应用户鼠标输

23、入后,程序做了很多的事情,包括判赢、当前是否有点以及是否为禁手等。具体的实现在代码中有注释,读者可以从中获取所有信息。/画出盘面上点的函数void CWzqView:vDrawPiece(CPoint pointBoard, int nType, CDC* pDC)CRgn rgnPiece;CPoint pointView = ptConvertBP2VP(pointBoard);rgnPiece.CreateEllipticRgn( pointView.x - WIDTH_Piece,pointView.y - WIDTH_Piece,pointView.x + WIDTH_Piece,p

24、ointView.y + WIDTH_Piece);CBrush brush;int h=pointBoard.x,z=pointBoard.y;if(i%2)=1)/轮到黑子方if(phz!=-1)/此处有子存在if(prex=h&prey=z)return;elseMessageBox(这里已经有子!);return;elsephz=0;/0代表下的黑子rei-10=h;/存放悔棋次序的过程rei-11=z;if(Forbid(pointBoard)=1)MessageBox(三三禁手!请重新下子!);phz=-1;return;if(Forbid(pointBoard)=2)Messag

25、eBox(四四禁手!请重新下子!);phz=-1;return;if(Forbid(pointBoard)=3)MessageBox(四三三禁手!请重新下子!);phz=-1;return;if(Forbid(pointBoard)=4)MessageBox(长连禁手!请重新下子!);phz=-1;return;brush.CreateSolidBrush(COLOR_PieceBlack);pDC-FillRgn(&rgnPiece, &brush);prex=h;prey=z;if(IsWin(h,z)pp=1;MessageBox(执黑子一方获胜!);for(m=0;m19;m+)for

26、(n=0;nFillRgn(&rgnPiece, &brush);prex=h;prey=z;if(IsWin(h,z)pp=1;/为了使获胜后清盘时不再画出当前节点,用于控制的标号MessageBox(执红子一方获胜!);for(m=0;m19;m+)for(n=0;n19;n+)pmn=-1;/清空棋盘CClientDC pDC(this);Qing(&pDC);OnDraw(&pDC);i=1;pp=0;return ;rgnPiece.DeleteObject();i+;/ CWzqView:vDrawPiece(5)附录5这是判断是否为禁手的函数。输入是当前点的信息,输出为整型的数(

27、0/1/2/3/4),不同的输出代表不同的禁手图。在画点的函数中已经写出,这里不再赘述。/判断是否为禁手int CWzqView:Forbid(CPoint point)int qipan1919;for(n=0;n19;n+)for(m=0;m19;m+)qipannm=pnm+1;int qp2525;for(m=3;m22;m+)for(n=3;n22;n+)qpmn=qipanm-3n-3;for(n=0;n3;n+)qpmn=2;for(n=22;n25;n+)qpmn=2;for(m=0;m3;m+)for(n=0;n25;n+)qpmn=2;for(m=22;m25;m+)for

28、(n=0;n25;n+)qpmn=2;int flag=0;int g1,g2,g3,g4,w1,w2,w3,w4;int g=point.x+3;int w=point.y+3;int fg24=-1,0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1;int fw24=-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1,1,1,0;for( t=8;t16;t+)if(qpg+fgtw+fwt=1&qpg+2*fgtw+2*fwt=0&qpg+fgt+4w+fwt+4=1&qpg+2*fgt+4w+2*fwt+4=0&(qpg+3*fgtw+3*fwt=0|qpg+3*fgt+4w+3*fwt+4=0)flag+;flag=flag/2;for( t=8;t16;t+)if(qpg+fgtw+fwt=1&qpg+2*fgtw+2*fwt=1&qpg+fgt+4w+fwt+4=0&qpg+3*fgtw+3*fw

温馨提示

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

最新文档

评论

0/150

提交评论