程序设计课程设计五子棋实验报告附代码.docx
- 文档编号:11529363
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:38
- 大小:8.13MB
程序设计课程设计五子棋实验报告附代码.docx
《程序设计课程设计五子棋实验报告附代码.docx》由会员分享,可在线阅读,更多相关《程序设计课程设计五子棋实验报告附代码.docx(38页珍藏版)》请在冰点文库上搜索。
程序设计课程设计五子棋实验报告附代码
文档编号:
项目名称–版本
程序设计课程设计
五子棋游戏程序
报告书
制订人:
张三
学号:
201000000001
2010年7月6日
文档变更历史记录
序号
变更日期
变更人员
变更内容详情描述
版本
1
2010/6/24
张三
创建框架
1.0
2
2010/6/28
张三
加入OnDraw、OnLButtenDown、OnWzqNewgame、OnWzqGoback函数,实现黑白对弈、重开局、悔棋等基本功能
1.1
3
2010/6/30
张三
加入Forbid函数,实现禁手功能
1.2
4
2010/7/2
张三
完善Forbid函数,添加更多禁手规则
1.3
5
2010/7/4
张三
加入Serialize函数,实现文件的保存与读取
1.4
6
2010/7/5
张三
加入背景,丰富画面效果
1.5
1、引言
1.1编写目的
学会MFC的一些基本操作,会使用其中的部分函数,编写一个五子连珠的小游戏,游戏由两人对弈,用鼠标操作,执黑子者先下。
1.2读者对象
计算机专业的学生或对编程感兴趣的学生
1.3软件项目概述
●项目名称:
五子棋游戏
●简称:
五子棋
●项目代号:
无
●软件项目的大致功能和性能要求
可实现两人对弈,用鼠标操作,黑子先下。
要求:
1.设计一个五子连珠类;
2.记录游戏双方的落子过程,允许悔棋;
3.实现保存棋谱和根据棋谱复盘的功能;
4.判断双方输赢,先走出五子连珠的一方赢;
5.响应用户鼠标信息,并显示棋盘信息;
6.判断先下者落子禁手情况。
1.4文档概述
将五子棋程序以文字的形式表达,包括设计思路、具体方法、具体实现、框架结构,使别人能够理解。
1.5定义
1.6参考资料
《深入浅出MFC》
《VisualC++6.0类参考详解》刘金龙高兆法巩玉国编
《程序设计课程设计》计算机学院编
2、任务概述
2.1目标
可实现两人对弈,用鼠标操作,黑子先下。
2.2软件的开发和运行环境
系统:
WindowsXPorWindows7
软件:
VC6.0
2.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、功能设计
6.1类的关系描述
6.2类的设计
成员变量:
intstep:
在CWzqView中,存储步数
intdstep:
在CWzqDoc中,存储步数
inttag[19][19]:
在CWzqView中存储落子的信息,即每个棋子的step
intdtag[19][19]:
在CWzqDoc中存储落子的信息,即每个棋子的dstep
受保护一般成员函数:
Getstep:
在CWzqView中获取步数step
Getdstep:
在CWzqDoc中获取步数dstep
Gettag(int,int):
在CWzqView中获取tag
Getdtag(int,int):
在CWzqDoc中获取dtag
Getpiecepos(int):
在CWzqView中,可根据int(即step)来获得棋子的坐标,返回一个CPoint类型
重要操作函数:
Ondraw():
重画棋盘
OnLButtenDown():
落子
Forbid():
禁手判断
Winner():
输赢判断
OnWzqGoback():
悔棋操作
OnWzqNewgame():
重新开局
Transfer():
在CWzqView与CWzqDoc之间实现信息共享,以便系统保存和复盘
Serialize():
实现棋盘的保存和复盘
7、使用指南
双人对弈
8、维护接口
程序中定义了好多可改变的量,可根据需要改变:
#definestaticintGetarray[19][19]{0}
#defineXPOS_TopLeft125
#defineYPOS_TopLeft50
#defineWIDTH_BoardGrid32//小方格宽度
#defineWIDTH_Point6//四个标志点的宽度
#defineWIDTH_Piece15//棋子宽度
#defineCOLOR_BrushRGB(158,90,65)//棋盘底色
#defineCOLOR_PieceBlackRGB(0,0,0)
#defineCOLOR_PieceWhiteRGB(255,255,255)
#defineCOLOR_PenRGB(255,0,0)
#defineWIDTH_Pen1.5
9、总结
我个人通过对五子棋小游戏的编写,增加了对编写程序的兴趣,尤其是利用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:
implementationoftheCWzqViewclass
//
#include"stdafx.h"
#include"wzq.h"
#include"wzqDoc.h"
#include"wzqView.h"
#include
#include
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
#definestaticintGetarray[19][19]{0}
#defineXPOS_TopLeft125
#defineYPOS_TopLeft50
#defineWIDTH_BoardGrid32//小方格宽度
#defineWIDTH_Point6//四个标志点的宽度
#defineWIDTH_Piece15//棋子宽度
#defineCOLOR_BrushRGB(158,90,65)//棋盘底色
#defineCOLOR_PieceBlackRGB(0,0,0)
#defineCOLOR_PieceWhiteRGB(255,255,255)
#defineCOLOR_PenRGB(255,0,0)
#defineWIDTH_Pen1.5
/////////////////////////////////////////////////////////////////////////////
//CWzqView
IMPLEMENT_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
//Standardprintingcommands
ON_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()
/////////////////////////////////////////////////////////////////////////////
//CWzqViewconstruction/destruction
CWzqView:
:
CWzqView()
{
//TODO:
addconstructioncodehere
step=0;
wintag=0;//初始化获胜标志位
for(inti=0;i<19;i++)
for(intj=0;j<19;j++)
tag[i][j]=0;//将标志位初始化,0表示(i,j)点无棋子
}
CWzqView:
:
~CWzqView()
{
}
BOOLCWzqView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
:
PreCreateWindow(cs);
}
intCWzqView:
:
Getstep()
{
returnstep;//获取步数
}
//DELvoidCWzqView:
:
vSetstep(intn)
//DEL{
//DELstep=step+n;
//DEL}
intCWzqView:
:
Gettag(intm,intn)
{
returntag[m][n];//获取标志符
}
voidCWzqView:
:
vSettag(CPointpiecePos,intt)
{
tag[piecePos.x][piecePos.y]=t;//设置该点的标识符
}
CPointCWzqView:
:
GetPiecePos(intnum)
{
CPointpoint;
if(num!
=0)
{
for(inti=0;i<19;i++)
for(intj=0;j<19;j++)
if((tag[i][j])==num)
{
point.x=i;
point.y=j;
}//假如tag位为num,找到tag位符合的点
}
returnpoint;
}
//**********************************************************************
//
//CWzqView:
:
vDrawPiece
//
//Purpose:
//
//drawapieceaccordingtoboardpoint//
//Parameters:
//
//pointBoard----theboardcoordinateofpiecetobedrawn.
//nType----drawtypeofthepiece:
COLOR_PieceBlackCOLOR_PieceWhite.
//pDC----devicecontext.
//
//ReturnValue:
//
//None
//
//Comments:
//
//**********************************************************************
voidCWzqView:
:
vDrawPiece(CPointpointBoard,intnType,CDC*pDC)
{
CRgnrgnPiece;
CPointpointView=ptConvertBP2VP(pointBoard);
rgnPiece.CreateEllipticRgn(pointView.x-WIDTH_Piece,
pointView.y-WIDTH_Piece,
pointView.x+WIDTH_Piece,
pointView.y+WIDTH_Piece);
CBrushbrush;
if(!
nType)//如果nType等于0
brush.CreateSolidBrush(COLOR_PieceWhite);
else
brush.CreateSolidBrush(COLOR_PieceBlack);
pDC->FillRgn(&rgnPiece,&brush);
rgnPiece.DeleteObject();
}//CWzqView:
:
vDrawPiece
///////////////////////////////////////////////////
//////////////////////////
//CWzqViewdrawing
voidCWzqView:
:
OnDraw(CDC*pDC)
{
CWzqDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
/////////////////////////////////插入位图背景/////////////////////////////
CBitmapBitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDCdc;
dc.CreateCompatibleDC(pDC);
CBitmap*OldBitmap=dc.SelectObject(&Bitmap);
BITMAPbm;
Bitmap.GetBitmap(&bm);
pDC->BitBlt(-20,-76,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY);
pDC->SelectObject(OldBitmap);
//////////////////////////////////插入背景结束///////////////////////////
////drawthelinesofboard
step=pDoc->nGetdstep();/////////////////////////step需从文件中获取/////////////////////////
for(inti=0;i<19;i++)
for(intj=0;j<19;j++)
tag[i][j]=pDoc->nGetdtag(i,j);
intnBoardRowNum=pDoc->nGetBoardRowNum();//gettherownumberfromdoc
/*CBrushbrush1;//定义棋盘画刷
//brush1.CreateSolidBrush(COLOR_Brush);//创建棋盘画刷
//CRectRectBoard(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();*/
//drawtherowlines横线
CPenpen;//定义画笔
pen.CreatePen(PS_DOT,WIDTH_Pen,(int)COLOR_Pen);//创建画笔(类型--虚线、笔宽、颜色)
for(intnRow=0;nRow { pDC->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! welcometofivechessworld! ! ! ");//在左上角写话 //drawthecolumnlines竖线 for(intnColumn=0;nColumn { pDC->MoveTo(XPOS_TopLeft+nColumn*WIDTH_BoardGrid,YPOS_TopLeft); pDC->SelectObject(&pen); pDC->LineTo(XPOS_TopLeft+nColumn*WIDTH_BoardGrid, YPOS_TopLeft+(nBoardRowNum-1)*WIDTH_BoardGrid); } ////Graw4Points CPointpt;//定义四个标志点 CBrushbrush;//定义四点的画刷 brush.CreateSolidBrush(COLOR_Pen);//创建画刷 CRgnrgnPoint;//定义某区域 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(ints=0;s<=Getstep();s++) { pt=GetPiecePos(s); if((pt.x>=0)&&(pt.y>=0)) vDrawPiece(pt,s%2,pDC); } ReleaseDC(pDC);//释放 } //////////////////////////////////////////////////////////////////
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 课程设计 五子棋 实验 报告 代码