




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计课程设计报告书 文档编号:项目名称 版本 程序设计课程设计五子棋游戏程序报告书制订人:张三学 号:1 2010年7月6日 文档变更历史记录序号变更日期变更人员变更内容详情描述版本12010/6/24张三创建框架1.022010/6/28张三加入OnDraw、OnLButtenDown、OnWzqNewgame、OnWzqGoback函数,实现黑白对弈、重开局、悔棋等基本功能1.132010/6/30张三加入Forbid函数,实现禁手功能1.242010/7/2张三完善Forbid函数,添加更多禁手规则1.352010/7/4张三加入Serialize函数,实现文件的保存与读取1.462010/7/5张三加入背景,丰富画面效果1.5目录目录31、引言41.1 编写目的41.2 读者对象41.3 软件项目概述41.4 文档概述41.5 定义41.6 参考资料42、任务概述52.1目标52.2软件的开发和运行环境52.3 用户特征52.4 假设与约束52.5 进度要求52.6验收要求63、功能需求描述73.1 基本功能73.2 增加功能74、界面要求75、测试方案76、功能设计86.1类的关系描述86.2类的设计87、使用指南88、维护接口89、总结81、引言1.1 编写目的 学会MFC的一些基本操作,会使用其中的部分函数,编写一个五子连珠的小游戏,游戏由两人对弈,用鼠标操作,执黑子者先下。1.2 读者对象 计算机专业的学生或对编程感兴趣的学生1.3 软件项目概述l 项目名称:五子棋游戏l 简称:五子棋l 项目代号:无l 软件项目的大致功能和性能要求可实现两人对弈,用鼠标操作,黑子先下。要求:1. 设计一个五子连珠类;2. 记录游戏双方的落子过程,允许悔棋;3. 实现保存棋谱和根据棋谱复盘的功能;4. 判断双方输赢,先走出五子连珠的一方赢;5. 响应用户鼠标信息,并显示棋盘信息;6. 判断先下者落子禁手情况。1.4 文档概述 将五子棋程序以文字的形式表达,包括设计思路、具体方法、具体实现、框架结构,使别人能够理解。1.5 定义1.6 参考资料 深入浅出MFC Visual C+6.0 类参考详解 刘金龙 高兆法 巩玉国 编 程序设计课程设计 计算机学院 编2、任务概述2.1目标 可实现两人对弈,用鼠标操作,黑子先下。2.2软件的开发和运行环境系统:Windows XP or Windows7 软件:VC 6.02.3 用户特征双人对弈,熟悉游戏规则的任何用户2.4 假设与约束 游戏中可能含有比较多的禁手规则使得先下的一方比较难以取得胜利2.5 进度要求 按期完成用户需求2.6验收要求 各项功能如:新局、保存棋局、打开棋局、悔棋、禁手、判断胜利等功能都能实现3、功能需求描述可实现两人对弈,用鼠标操作,黑子先下。要求:1. 设计一个五子连珠类;2. 记录游戏双方的落子过程,允许悔棋;3. 实现保存棋谱和根据棋谱复盘的功能;4. 判断双方输赢,先走出五子连珠的一方赢;5. 响应用户鼠标信息,并显示棋盘信息;6. 判断先下者落子禁手情况。4、界面要求人机界面要容易操作,有比较舒适的背景,遇到禁手、悔棋、保存、胜利等可弹出对话框。人机交互和谐。5、测试方案1. 检验判断胜利:若胜利,则弹出对话框,并显示是何种胜利2. 检验禁手以上仅列出六种禁手,当然还有跟多情况3. 检验保存当按下“保存”图标菜单时,会弹出对话框,可给棋局取个文件名,如“1”然后单击“保存(S)”4. 检验打开重现打开游戏,按下“打开”图标菜单,现在打开“1”会显示对话框,选择要打开的文件“1”单击“打开”,则会复盘,显示上次未完成的游戏,继续对弈5. 悔棋(有个撤销按钮,不便验收展示)6. 综上,基本实现新局、保存棋局、打开棋局、悔棋、禁手、判断胜利6、功能设计成员函数nSetdstep、nSetdtag、nGetdstep、nGetdtag用来实现文件保存与打开。可由以上四个函数保存和获得棋谱(位置、标志)在Forbid()函数里规定禁手的条件,设置返回值NUM,若为0,非禁手,为1禁手文件类(CWzqDoc)在Serialize函数用来实现文件保存与打开设置受保护的成员变量dstep、dtag1919来存储CWzqView里的棋谱信息,便于文件的保存和读写视图类(CWzqView)可控制视图上所有的信息定义三个受保护的成员变量step、tag1919、wintag.分别记录:所下棋子的步数、标志位(即将step存入,取余后为0白棋、为1黑棋)、胜利与否(1胜0没有胜利)在OnLButtenDown函数里添加判断信息:看是否该点有棋、是否禁手、是否获胜,并利用MessageBox输出相应消息在winner()函数里判断输赢条件,分横竖撇那四个方向,设置胜利标志wintag,若无胜利,wintag为0;若一方获胜,wintag为1,游戏结束五子棋类(Wzq Classes)在OnWzqGoback函数里实现悔棋功能。即每悔一步,step-,然后调用函数Ondraw将棋盘重画一次。在Ondraw函数里添加重画棋盘的代码,新添加了棋盘背景,先画棋盘、再画落在上面的棋子,step为基数黑棋下,反之白棋。注意:每下一个棋子,棋盘重画一次!在Transfer函数里将CWzaView里的step、tag赋给CWzqDoc里的dstep、dtag。实现数据在两个类间的共享。便于文件操作的保存与打开。在OnWzqNewgame函数里实现重新开始的功能。具体为将变量step、tag1919初始化。再调用函数Ondraw将棋盘清空。Transfer函数将CWzqDoc与CWzaView联系起来,使step、tag可以共享、传递6.1类的关系描述6.2类的设计成员变量:int step: 在CWzqView中,存储步数 int dstep: 在CWzqDoc中,存储步数int tag1919: 在CWzqView中存储落子的信息,即每个棋子的stepint dtag1919: 在CWzqDoc中存储落子的信息,即每个棋子的dstep受保护一般成员函数: Getstep:在CWzqView中获取步数stepGetdstep:在CWzqDoc中获取步数dstepGettag(int,int): 在CWzqView中获取tagGetdtag(int,int): 在CWzqDoc中获取dtagGetpiecepos(int): 在CWzqView中,可根据int(即step)来获得棋子的坐标,返回一个CPoint类型重要操作函数: Ondraw():重画棋盘 OnLButtenDown():落子 Forbid():禁手判断 Winner():输赢判断 OnWzqGoback():悔棋操作OnWzqNewgame():重新开局Transfer():在CWzqView与CWzqDoc之间实现信息共享,以便系统保存和复盘Serialize():实现棋盘的保存和复盘7、使用指南 双人对弈8、维护接口程序中定义了好多可改变的量,可根据需要改变:#define static int Getarray1919 0#define XPOS_TopLeft125#define YPOS_TopLeft50#define WIDTH_BoardGrid32/小方格宽度#define WIDTH_Point6 /四个标志点的宽度#define WIDTH_Piece15/棋子宽度#define COLOR_BrushRGB(158,90,65)/棋盘底色#define COLOR_PieceBlackRGB(0,0,0)#define COLOR_PieceWhiteRGB(255,255,255)#define COLOR_PenRGB(255,0,0)#define WIDTH_Pen1.59、总结 我个人通过对五子棋小游戏的编写,增加了对编写程序的兴趣,尤其是利用C+,MFC,不禁惊叹于微软编程人员为我们提供了那么多可以直接使用的类资源。期间,我通过查资料,与同学交流,学到了许多课堂上所没有的新知识,增强了我的自主学习能力。有时,添加一个功能可能会改变好多东西,可能会报好多error,但只要自己坚持不懈,认真查找,或问同学,或请教老师,总会把问题解决。 编写此程序还需要我们有良好的程序素养,即书写习惯,添加注释,方便日后查看理解甚至修改。期间,需要设置好多变量如tag、step等,分别存储棋子的标志(即该棋子是第几步,若基数步则为黑棋,若偶数步则为白棋)和当前步数。有一个GetpiecePos(int)函数,可根据int(实际是改点的step)来确定改点的坐标,返回一个point,即相当于知道该点(point.x,point.y),便于操作。在存取时,需要在CWzqDoc里调用一个函数,但CWzqView与CWzqDoc继承的不是同一个父类,因此,需用一个函数Transfer()来将CWzqView的参数信息如tag、step传递到CWzqDoc中去。 要十分完善的编写这个程序的确有点困难,这要求我必须多花心思与精力,多与别人交流探讨,多查处自己程序的bug,最最重要的是自己一定要有耐心,努力去完成。主要程序段:wzqView.cpp/ wzqView.cpp : implementation of the CWzqView class/#include stdafx.h#include wzq.h#include wzqDoc.h#include wzqView.h#include#include#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#define static int Getarray1919 0#define XPOS_TopLeft125#define YPOS_TopLeft50#define WIDTH_BoardGrid32/小方格宽度#define WIDTH_Point6 /四个标志点的宽度#define WIDTH_Piece15/棋子宽度#define COLOR_BrushRGB(158,90,65)/棋盘底色#define COLOR_PieceBlackRGB(0,0,0)#define COLOR_PieceWhiteRGB(255,255,255)#define COLOR_PenRGB(255,0,0)#define WIDTH_Pen1.5/ CWzqViewIMPLEMENT_DYNCREATE(CWzqView, CView)BEGIN_MESSAGE_MAP(CWzqView, CView)/AFX_MSG_MAP(CWzqView)ON_WM_LBUTTONDOWN()ON_WM_CANCELMODE()ON_COMMAND(ID_WZQ_GOBACK, OnWzqGoback)ON_COMMAND(ID_WZQ_NEWGAME, OnWzqNewgame)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CWzqView construction/destructionCWzqView:CWzqView()/ TODO: add construction code herestep=0;wintag=0;/初始化获胜标志位for(int i=0;i19;i+)for(int j=0;j19;j+)tagij=0;/将标志位初始化,0表示(i,j)点无棋子CWzqView:CWzqView()BOOL CWzqView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);int CWzqView:Getstep()return step;/获取步数/DEL void CWzqView:vSetstep(int n)/DEL /DEL step=step+n;/DEL int CWzqView:Gettag(int m,int n)return tagmn;/获取标志符void CWzqView:vSettag(CPoint piecePos,int t)tagpiecePos.xpiecePos.y=t;/设置该点的标识符CPoint CWzqView:GetPiecePos(int num)CPoint point;if(num!=0)for(int i=0;i19;i+)for(int j=0;jFillRgn(&rgnPiece, &brush);rgnPiece.DeleteObject();/ CWzqView:vDrawPiece/ CWzqView drawingvoid CWzqView:OnDraw(CDC* pDC)CWzqDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/插入位图背景/CBitmap Bitmap;Bitmap.LoadBitmap(IDB_BITMAP1);CDC dc;dc.CreateCompatibleDC(pDC);CBitmap* OldBitmap=dc.SelectObject(&Bitmap);BITMAP bm;Bitmap.GetBitmap(&bm);pDC-BitBlt(-20,-76,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY);pDC-SelectObject(OldBitmap);/插入背景结束/ draw the lines of boardstep=pDoc-nGetdstep();/step需从文件中获取/for(int i=0;i19;i+)for(int j=0;jnGetdtag(i,j);int nBoardRowNum = pDoc-nGetBoardRowNum();/ get the row number from doc/*CBrush brush1;/定义棋盘画刷/brush1.CreateSolidBrush(COLOR_Brush);/创建棋盘画刷/CRect RectBoard(XPOS_TopLeft-20,YPOS_TopLeft-20,XPOS_TopLeft+(nBoardRowNum-1)* WIDTH_BoardGrid+20,YPOS_TopLeft+(nBoardRowNum -1)* WIDTH_BoardGrid+20);/pDC-FillRect(&RectBoard,&brush1);用画刷填充RectBoard矩形的范围/RectBoard.DeleteObject();*/ draw the row lines横线CPen pen;/定义画笔pen.CreatePen(PS_DOT, 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_BoardGrid, YPOS_TopLeft + nRow * WIDTH_BoardGrid);/终止点pDC-TextOut(10,10,Hello!welcome to five chess world!);/在左上角写话/ draw the column lines竖线for(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);/ Graw 4 PointsCPoint pt;/定义四个标志点CBrush brush;/定义四点的画刷brush.CreateSolidBrush(COLOR_Pen);/创建画刷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);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(15, 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(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();for(int s=0;s= 0) & (pt.y = 0) )vDrawPiece(pt,s%2, pDC);ReleaseDC(pDC);/释放/ CWzqView printingBOOL CWzqView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CWzqView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CWzqView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CWzqView diagnostics#ifdef _DEBUGvoid CWzqView:AssertValid() constCView:AssertValid();void CWzqView:Dump(CDumpContext& dc) constCView:Dump(dc);CWzqDoc* CWzqView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CWzqDoc);return (CWzqDoc*)m_pDocument;#endif /_DEBUG/视坐标、棋盘坐标的转换/ CWzqView message handlers/ convert view point into board pointCPoint CWzqView:ptConvertVP2BP(CPoint pointView) constCPoint ptBoard;ptBoard.x = (int)(float)(pointView.x - XPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);ptBoard.y = (int)(float)(pointView.y - YPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);return ptBoard;/ CWzqView:ptConvertVP2BP/ convert view point into board pointCPoint CWzqView:ptConvertVP2BP(int x, int y) constCPoint ptBoard;ptBoard.x = (int)(float)(x - XPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);ptBoard.y = (int)(float)(y - YPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);return ptBoard;/ CWzqView:ptConvertVP2BP/ convert board point into view point 棋坐标与视坐标的转换CPoint CWzqView:ptConvertBP2VP(int x, int y) constCPoint ptView;ptView.x = XPOS_TopLeft + x * WIDTH_BoardGrid;ptView.y = YPOS_TopLeft + y * WIDTH_BoardGrid;return ptView;/ CWzqView:ptConvertBP2VP/ convert board point into view point CPoint CWzqView:ptConvertBP2VP(CPoint pointBoard) constCPoint ptView;ptView.x = XPOS_TopLeft + pointBoard.x * WIDTH_BoardGrid;ptView.y = YPOS_TopLeft + pointBoard.y * WIDTH_BoardGrid;return ptView;/ CWzqView:ptConvertBP2VP/ check if the view point is in board BOOL CWzqView:bPointInBoard(CPoint pointView, int nBoardRowNum) constreturn ( (pointView.x = XPOS_TopLeft - WIDTH_BoardGrid * 0.5) & (pointView.x = YPOS_TopLeft - WIDTH_BoardGrid * 0.5) & (pointView.y nGetBoardRowNum();/ get the row number from docif ( bPointInBoard(point, nBoardRowNum) )CPoint ptBoard = ptConvertVP2BP(point); /先视坐标转换棋盘坐标 pDoc-vSetPiecePos(ptBoard);/将棋盘棋子信息重新设置pDoc-SetModifiedFlag();if(Gettag(ptBoard.x,ptBoard.y)=0)/若该点标志位为0,即无棋子,则画棋step+;/步数加一vSettag(ptBoard,Getstep();/将tag设置成步数信息step pDoc-vSetdstep(Getstep();/将doc里面的棋子步数存入for(int i=0;i19;i+)for(int j=0;jvSetdtag(i,j,Gettag(i,j); CClientDC pcDC(this);/管理窗口用户区对应的显示上下文 句柄信息OnDraw(&pcDC);/每次走一步 重画棋盘所有信息if(Forbid()/判断禁手与否 若Forbid()为0,则悔棋OnWzqGoback();/悔棋一步 if(wintag=1)/若已获胜OnWzqGoback();MessageBox(一方已获胜,悔棋OR重新开始!);winner();/若不禁手,则判断是否获胜else/若该店标志位非零,则有棋子 if(wintag=0)MessageBox(该点已有棋子!);elseMessageBox(一方已获胜,请不要在原来的棋子上下!);CView:OnLButtonDown(nFlags, point);/获胜判断/void CWzqView:winner()wintag=0;/预先设定没有胜利int nType;/0、1判断标志位 0黑棋 1白棋 for(int n=0;n19;n+)for(int m=0;m15;m+)/逐个棋子扫描int count=0;/相同棋子计数器nType=tagmn%2;/确定该子标志位for(int i=0;i5;i+)if(tagm+in!=0&tagm+in%2=nType)/横向连珠/count+;/若有横向有一子与原棋子tag一致且非零 计数器加1elsebreak;if(count=5)/横向五子连珠/wintag=1;if(nType=0)MessageBox(白棋获胜!横向连珠);elseMessageBox(黑棋获胜!横向连珠);for(int m=0;m19;m+)for(int n=0;n15;n+)int count=0;nType=tagmn%2;for(int i=0;i5;i+)if(tagmn+i!=0&tagmn+i%2=nType)/竖向连珠/count+;elsebreak;if(count=5) wintag=1;if(nType=0)MessageBox(白棋获胜!竖向连珠);elseMessageBox(黑棋获胜!竖向连珠);for(n=0;n15;n+)for(int m=0;m15;m+)int count=0;nType=tagmn%2;for(int i=0;i5;i+)if(tagm+in+i!=0&tagm+in+i%2=nType)/右下斜连珠/count+;elsebreak;if(count=5) wintag=1;if(nType=0)MessageBox(白棋获胜!右下斜连珠);elseMessageBox(黑棋获胜!右下斜连珠);for(n=0;n15;n+)for(int m=4;m19;m+)int count=0;nType=tagmn%2;for(int i=0;i=100&wintag=0)MessageBox(和棋!);/禁手判断/int CWzqView:Forbid()CPoint piecepos=GetPiecePos(Getstep();int sum8=0;/八个方向int NUM=0;/不是禁手条件 int x=piecepos.x;int y=piecepos.y;for(int i=0;i5;i+)if(tagx+iy%2=1&tagx+1+iy%2=1)/右横向sum0+;if(tagx+iy%2=0&tagx+iy!=0)/sum0-;for(i=0;i5;i+)if(tagx-iy%2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全检查工考试卷及答案
- 甲醇制烯烃操作工特殊工艺考核试卷及答案
- 农发行本溪市桓仁满族自治县2025秋招半结构化面试题库及参考答案
- 火工品检测工培训考核试卷及答案
- 2025年医院装备科考试题及答案
- 有色挤压工成本控制考核试卷及答案
- 隧道工三级安全教育(车间级)考核试卷及答案
- 水土保持员岗前考核试卷及答案
- 2025年广东广州医师资格考试(实践技能)复习题库及答案
- 公路工程试验检测师资格考试(公共基础)综合能力测试题及答案(四川省达州市2025年)
- 智能化设计资源管理-洞察及研究
- AI时代网络安全产业人才发展报告(2025年)-安恒信息
- 2025股权融资合同书
- 2025员工试用期合同协议书模板
- 供电服务技巧培训
- 2025浙江大学医学院附属儿童医院膳食部劳务派遣后勤工人招聘(莫干山院区)备考模拟试题及答案解析
- 2025湖南衡阳工会招聘11名工会社会工作者备考考试题库附答案解析
- 2024-2025学年广东省广州市花都区黄广中学八年级上学期10月考数学试卷(含答案)
- 铁路现场安全知识培训课件
- 体育器材技术服务和售后服务的内容和具体措施
- 2025-2026人教版(2024)七年级上册英语教学计划 (三篇)
评论
0/150
提交评论