程序设计课程设计五子棋实验报告附代码.docx

上传人:b****8 文档编号:13060147 上传时间:2023-06-10 格式:DOCX 页数:38 大小:8.13MB
下载 相关 举报
程序设计课程设计五子棋实验报告附代码.docx_第1页
第1页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第2页
第2页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第3页
第3页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第4页
第4页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第5页
第5页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第6页
第6页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第7页
第7页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第8页
第8页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第9页
第9页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第10页
第10页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第11页
第11页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第12页
第12页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第13页
第13页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第14页
第14页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第15页
第15页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第16页
第16页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第17页
第17页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第18页
第18页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第19页
第19页 / 共38页
程序设计课程设计五子棋实验报告附代码.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

程序设计课程设计五子棋实验报告附代码.docx

《程序设计课程设计五子棋实验报告附代码.docx》由会员分享,可在线阅读,更多相关《程序设计课程设计五子棋实验报告附代码.docx(38页珍藏版)》请在冰点文库上搜索。

程序设计课程设计五子棋实验报告附代码.docx

程序设计课程设计五子棋实验报告附代码

文档编号:

项目名称–版本

 

程序设计课程设计

五子棋游戏程序

报告书

制订人:

张三

学号:

************

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);//释放

}

///////////////////////////////////////////////////////////////////

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2