C++课程设计--五子棋游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++课程设计--五子棋游戏
课程设计说明书
五子棋游戏
The Game of Gobang
学院名称:机械工程学院
专业班级:测控10xx 学生姓名:江x 指导教师姓名:张xx 指导教师职称:副教授
2012年6月
目录
第一章需求分析 (7)
1.1系统概述 (7)
1.1.1概述: (7)
1.2系统运行环境 (7)
1.2.1运行环境 (7)
1.3功能需求描述 (7)
1.3.1功能需求 (7)
第二章总体设计 (8)
2.1开发与设计的总体思想 (8)
2.1.1总体设计思路 (8)
2.1.2屏幕的组成 (9)
2.1.3形状的组成 (9)
2.1.4形状的统一 (10)
第三章概要设计 (10)
3.1系统流程图 (10)
3.2 软件功能模块 (12)
3.3 系统功能模块 (13)
第四章详细设计 (13)
4.1.界面的设计 (13)
4.1.1总体界面的设计 (13)
4.1.2界面棋子的设计 (13)
4.2.显示界面的准备 (15)
4.2.1在窗体类中添加存放黑白棋两维数
组和背景棋盘、黑棋、白棋位图对象 (15)
4.2.2 在窗体构造函数中初始化wb,装入
棋盘、黑棋、白棋位图 (15)
4.3. 显示棋盘和棋子代码 (15)
4.4. 轮流下子代码 (16)
4.5. 判断输赢 (19)
4.5.1判断是否白棋胜代码 (19)
4.5.2判断是否黑棋胜代码 (20)
4.5.3判断是否平局代码 (21)
4.6. 悔棋 (21)
4.7. 重新开始 (22)
4.8. 背景音乐 (23)
4.9. 保存读取游戏文件 (23)
4.9.1保存文件: (24)
4.9.2读取文件: (25)
第五章测试分析 (26)
结论和心得体会 (27)
致谢 (28)
参考文献: (29)
课程设计任务书
一、课程设计目的
课程设计是工科各专业的主要实践性教学环节之一,是围绕一门主要基础课或专业课,运用所学课程的知识,结合实际应用设计而进行的一次综合分析设计能力的训练。
课程设计旨在培养学生在本课程范围内,初步掌握解决实际应用问题时所应具有的查阅资料、综合运用所学知识的能力,为课程设计及今后从事专业工作打下基础。
二、课程设计的内容及要求
利用所学的面向对象及C++编程知识和技巧,通过布置具有一定难度的程序设计题目,并且要求学生独立完成所布置题目,在分析设计过程中,要求学生养成良好的编程习惯,学会分析简单的实际问题,并能利用所学的知识建立系统的逻辑结构,学会简单的调试技巧和方法。
根据系统的功能要求,要求学生逐步完成应用程序的设计,具体要求为:
1、按规定的时间及要求上机。
2、设计方案正确,正确划分所选课题的系统功能模块。
3、系统设计要尽量实用,数据与功能分析详细。
4、要求C++编码简洁、稳定、高效。
5、独立查阅资料,认真书写课程设计说明书。
三、进度安排
此次课程设计时间为两周,分五个阶段完成:
1、分析设计阶段:学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。
这一阶段前第1-3天完成。
2、编程调试阶段:根据设计分析方案编写C++代码,然后调试该代码,实现课题要求的功能。
这一阶段在第4-7天完成。
3、总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编程测试的步骤和内容。
这一阶段在第8-9天完成。
4、考核阶段。
这一阶段在第10天完成。
四、课程设计说明书要求
课程设计说明书包括课程设计的目的、意义和任务,软件开发工具介绍、任务分
析、总体设计、详细设计、编程、调试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
具体格式参看《江苏大学课程设计说明书写作规范》
五、课程设计题目:设计一个五子棋游戏
六、上机时间及地点
地点:计算中心NA1 NA2
上机时间:
19周星期四 1 2 3 4 节
星期五 1 2 3 4 5 6 7 8 节
20周星期一 5 6 7 8 节
星期二 1 2 3 4 5 6 7 8 节
星期三 1 2 3 4 节
星期四 1 2 3 4 5 6 7 8 节
星期五 1 2 3 4节
七、答辩时间
20周星期六
五子棋游戏
摘要此课程设计的目的是为了达到熟练掌握C++语言的基本知识和C++调试技能;基本掌握面向对象程序设计的基本思路和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题;培养综合利用C++语言进行程序设计的能力,主要是培养利用系统提供的标准图形函数进行创新设计。
该游戏软件在Windows系统为玩家提供传统五子棋游戏的基本功能,在这简单的五子棋中,玩家通过鼠标进行两个人的游戏。
游戏的主战场为15行15列的棋盘,初始状态棋盘上无落子,进入游戏后,默认黑棋先下,也可由玩家选择先下的棋子,然后轮流落子,一旦有一方的棋子在某一方向上构成连续的五个棋子,则该方胜利,游戏结束并重新开始,如果有输赢,则输出谁胜,否则,输出平局的信息框。
游戏还有悔棋和重新开始的的功能。
另外,在游戏中还有背景音乐,运行时自动播放,也可通过工具栏按钮关闭。
还可以保存和读取游戏文件功能。
关键词:五子棋;视窗操作系统;悔棋;双人游戏。
The Game of Gobang
Abstract This course is designed in order to master the basic knowledge of the c + + language testing skills; and c + + Basic grasp of object oriented programming basic train of thought and method; Can use of my knowledge of the basic knowledge and skills, solvesimple object-oriented program design problem; Using c + + language training comprehend sive program design ability, is
mainly use the system to provide the training of standard graphics functions of innovation design. This game software on Windows system for players with traditional renju game, the basic function of in this simple renju players through the mouse, two personal game. The main battlefield games for line 15 to 15 listed in the board. The game is over, if a loser, the output who wins, otherwise, the output of the draw information box. Keywords: Gobang; Windows System; Takeback;the game of Two people playing
引言
随着经济时代的发展,人们的精神压力越来越大,精神上得不到应有的放松,精神生活得不到极大的满足,随着计算机技术的飞速发展,计算机已逐渐成为人们办公不可或缺的工具,因此及时的开发一些应用于计算机上的小型游戏软件,以供人们在办公的闲暇时间得到充分的休闲娱乐。
而棋类因为其兼具动脑并且娱乐的双重功效,并且十分符合现代式生活,因此已经得到越来越多人的欢迎,为此我们开发一个简单的五子棋游戏,开发此五子棋游戏软件的目的,主要是供办公人员与同事一起休闲娱
乐,增进友谊、减轻疲劳,以提高工作效率,创造更多的社会财富,造福人类。
查阅有关程序设计的案例资料,进一步理解程序设计模块化的思想,并利用此思想,根据对程序设计课程的学习,编写一个简单的游戏软件系统。
通过本设计可以加深理解利用程序设计思想开发一个系统的整个流程,提高分析问题、解决问题和实际动手的能力。
在下面的各章中我们将以开发一个五子棋游戏为例,谈谈其开发过程和所涉及到的问题及解决方法。
第一章需求分析
1.1系统概述
1.1.1概述:
本程序是一款棋类益智游戏程序,名为五子棋游戏,是采用C语言编写的可在WINDOWS 系统下运行的娱乐游戏平台。
该程序面向广大棋类游戏的爱好者,能够提供方便,实现基本智能控制的游戏环境。
棋盘由若干网格构成,初始状态棋盘上无落子,玩家可以通过鼠标在棋盘的相应位置下子,一方为白色,另一方为黑色,先下的为黑子。
游戏过程中,一旦有一方的棋子在某一方向上先构成连续的五个棋子,不论横、竖或斜,就会在屏幕上显示是谁赢了比赛。
1.2系统运行环境
1.2.1运行环境
(1)硬件环境。
本系统适用于那种Inter386以上计算机,内存容量为128M,应配备键盘、鼠标、显示器等外部设备。
(2)软件环境。
本系统的设计采用Visual C++6.0编写。
在Windows XP SP2环境下测试通过。
(3) 只要计算机具有Visual C++6.0,本游戏软件在Windows平台下都可以运行。
1.3功能需求描述
1.3.1功能需求
五子棋是一种大众喜爱的游戏,其规则简单,变化多端,非常富有趣味性何消遣性,是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
近来随着计算机的快速发展,各种棋类游戏被纷纷请进了电脑,使得那些喜爱下棋,又常常苦于没有工具的棋迷们能随时过足棋瘾。
在这里我也设计了一个较简单的五子棋游戏,这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求,同时有悔棋和重新清盘开始的功能,更加方便了玩家的操作和游戏的有趣性。
同时,这个游戏还增加了背景音乐的功能,让玩家在玩游戏的同时还可以聆听音乐,使身心放松,如果不需要,也可以通过菜单栏或工具栏中的按钮将其关闭。
另外,也可以保存和读取游戏文件。
第二章总体设计
2.1开发与设计的总体思想
2.1.1总体设计思路
棋盘设计为15*15格,初始状态棋盘的为空,玩家黑子先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束并重新开始(连成五子的一方获胜,下满棋盘为和棋)。
当游戏一方胜利后显示胜利信息。
从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,用坐标表示位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表黑棋,2代表白棋。
这样程序的主要工作是接收棋手鼠标按键操作,棋手用鼠标控制光标移动,按键表示落子。
一旦接收到按键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。
落子成功后,马上判断该棋盘上是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。
按确认后,自动调用清盘函数,此时清盘重新开始,由另一家先走。
在游戏中,如果玩家悔棋,则按下悔棋按钮,调用悔棋函数,将刚下的棋去掉,重下一子。
按下重新开始菜单,可清盘使
游戏重新开始。
2.1.2屏幕的组成
一个游戏一定要有一个界面供游戏者对游戏控制。
这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,白方要下子时,必须要先看一看所有黑子的排列情况,决定是防守还是进攻,这关系着玩家要如何放置自己的棋子,让整体有个更加的布局,有利于游戏的进行。
此游戏的屏幕由15行15列的网格和菜单栏、工具栏组成,背景是一张棋盘图,棋盘图和棋子图如下图:
2.1.3形状的组成
每一种形状都是由五个棋子组成,比如●●●●●或○○○○○由五个棋子排
列而成。
2.1.4形状的统一
棋子的排列,如:●●●●●等共有8种形状(黑白的形状归为不同的形状)。
如图形状:
黑棋的四种情况:
●●●●●●○○○○●○○○○○○○○●
○○○○○●○○○○○●○○○○○○●○
○○○○○●○○○○○○●○○○○●○○
○○○○○●○○○○○○○●○○●○○○
○○○○○●○○○○○○○○●●○○○○
白棋的四种情况:
○○○○○○●●●●○●●●●●●●●○
●●●●●○●●●●●○●●●●●●○●
●●●●●○●●●●●●○●●●●○●●
●●●●●○●●●●●●●○●●○●●●
●●●●●○●●●●●●●●○○●●●●
第三章概要设计
3.1系统流程图
系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:
游戏选择先下
黑白子交判断是否连成
Y 游戏
悔
N
重新
3.2 软件功能模块
本游戏的软件功能模块如下:
3.3 系统功能模块
系统功能模块是对系统的大致功能进行描述,本游戏的系统功能模块如下:
第四章详细设计
根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:
4.1.界面的设计
4.1.1总体界面的设计
程序界面程序在启动运行时,系统会调用在资源视图中导入的围棋背景图片,使程序界面更加友好,在使用上给用户一种直观方便的感觉。
4.1.2界面棋子的设计
在资源视图中导入围棋的黑棋图片、白旗图片,使下子时调用此图片,使游戏更加直观有趣。
同时在窗口视图中添加显示透明色图片函数,是棋子图片更加逼真有趣。
显示透明色图片函数如下所示:
//显示透明色函数
void PutBitmap(CDC *pDC,int x,int y,CBitmap *pBitmap,COLORREF color)
{ COLORREF oldColor;
CBitmap bmAndBack,bmAndObject,bmAndMem,bmSave;
CDC memDC,backDC,objectDC,saveDC,pieceDC;
BITMAP bm;
pBitmap->GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
memDC.CreateCompatibleDC(pDC);
backDC.CreateCompatibleDC(pDC);
objectDC.CreateCompatibleDC(pDC);
saveDC.CreateCompatibleDC(pDC);
pieceDC.CreateCompatibleDC(pDC);
bmAndBack.CreateBitmap(nWidth,nHeight,1,1, NULL);
bmAndObject.CreateBitmap(nWidth,nHeight,1,1,NULL);
bmAndMem.CreateCompatibleBitmap(pDC,nWidth,nHeight);
bmSave.CreateCompatibleBitmap(pDC,nWidth,nHeight);
backDC.SelectObject(&bmAndBack);
objectDC.SelectObject(&bmAndObject);
memDC.SelectObject(&bmAndMem);
saveDC.SelectObject(&bmSave);
pieceDC.SelectObject(pBitmap);
saveDC.BitBlt(0,0,nWidth,nHeight,&pieceDC,0,0,SRCCOPY); oldColor=pieceDC.SetBkColor(color);
objectDC.BitBlt(0,0,nWidth,nHeight,&pieceDC,0,0,SRCCOPY); pieceDC.SetBkColor(oldColor);
backDC.BitBlt(0,0,nWidth,nHeight,&objectDC,0,0,NOTSRCCOPY);
memDC.BitBlt(0,0,nWidth,nHeight,pDC,x,y,SRCCOPY);
memDC.BitBlt(0,0,nWidth,nHeight,&objectDC,0,0,SRCAND);
pieceDC.BitBlt(0,0,nWidth,nHeight,&backDC,0,0,SRCAND);
memDC.BitBlt(0,0,nWidth,nHeight,&pieceDC,0,0,SRCPAINT);
pDC->BitBlt(x,y,nWidth,nHeight,&memDC,0,0,SRCCOPY);
pieceDC.BitBlt(0,0,nWidth,nHeight,&saveDC,0,0,SRCCOPY);
}
4.2.显示界面的准备
4.2.1在窗体类中添加存放黑白棋两维数组和背景棋盘、黑棋、白棋位图对象
int wb[15][15];
CBitmap Board,Black,White; //背景棋盘、黑棋、白棋位图对象
4.2.2 在窗体构造函数中初始化wb,装入棋盘、黑棋、白棋位图
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
wb[i][j]=0; //零表示空、1表示黑棋、2表示白棋Board.LoadBitmap(IDB_BITMAP1); //装入背景位图
Black.LoadBitmap(IDB_BITMAP2); //装入黑棋位图
White.LoadBitmap(IDB_BITMAP3); //装入白棋位图
4.3. 显示棋盘和棋子代码
在窗口OnDraw函数中添加显示棋盘和棋子代码
void CChessView::OnDraw(CDC* pDC)
{
CChessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC mem;
mem.CreateCompatibleDC(pDC);
mem.SelectObject(&Board);
pDC->BitBlt(0,0,535,536,&mem,0,0,SRCCOPY); //绘制棋盘
for(int i=0;i<15;i++) //绘制棋子
for(int j=0;j<15;j++)
if(wb[i][j]==1)
PutBitmap(pDC,5+i*35,7+j*35,&Black,RGB(255,255,255));
else if(wb[i][j]==2)
PutBitmap(pDC,5+i*35,7+j*35,&White,RGB(255,255,255));
// TODO: add draw code for native data here
}
4.4. 轮流下子代码
void CFivechessView::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default if(RightORLet==0) //如果鼠标状态为0,黑棋先下
{
int x=(point.x-5)/35,y=(point.y-7)/35; //计算坐标
if(x<15&&y<15) //点击鼠标的位置在棋盘内
if(wb[x][y]==0) //且该位置还没有棋子
{
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(jl[i][j]==count)
a[i][j]=0;
wb[x][y]=1; //设置成黑棋
a[x][y]=1;
count++;
jl[x][y]=count;
CDC *pDC;
pDC=this->GetDC();
PutBitmap(pDC,5+x*35,7+y*35,&Black,RGB(255,255,255));//显示该棋子PutBitmap(pDC,5+x*35,7+y*35,&Red,RGB(255,255,255));
CView::OnLButtonDown(nFlags, point);
if(heisheng(wb)==1)
{
this->MessageBox( "黑子胜","完成",MB_OK);
OnStart();
}
if(ping(wb)==1)
{
this->MessageBox("平局","完成",MB_OK);
OnStart();
}
RightORLet++; //鼠标状态变为1
}
}
else //如果鼠标状态为1,则下白棋
{
int x=(point.x-5)/35,y=(point.y-7)/35; //计算坐标
if(x<15&&y<15) //点击鼠标的位置在棋盘内
if(wb[x][y]==0) //且该位置还没有棋子
{
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(jl[i][j]==count)
a[i][j]=0;
wb[x][y]=2; //设置成白棋
a[x][y]=2;
count++;
jl[x][y]=count;
CDC *pDC;
pDC=this->GetDC();
PutBitmap(pDC,5+x*35,7+y*35,&White,RGB(255,255,255));//显示该棋子
PutBitmap(pDC,5+x*35,7+y*35,&Green,RGB(255,255,255));
CView::OnLButtonDown(nFlags, point);
if(baisheng(wb)==1)
{
this->MessageBox( "白子胜","完成",MB_OK);
OnStart();
}
if(ping(wb)==1)
{
this->MessageBox("平局","完成",MB_OK);
OnStart();
}
RightORLet--; //鼠标状态变为0
}
}
}
4.5. 判断输赢
此功能用来判断当某一方下完子后在八个方向上是否有连成五个子的可能性,若连成五子则执此棋子方获胜;或者棋盘下满为和局。
4.5.1判断是否白棋胜代码
int CFivechessView::heisheng(int a[15][15])
{
int i,j;//判断横着的5个是否都相等
for(i=0;i<15;i++)
for(j=0;j<11;j++)
{if(a[i][j]==1 && a[i][j+1]==1 && a[i][j+2]==1 && a[i][j+3]==1 && a[i][j+4]==1)
return 1;
}
for(j=0;j<15;j++)//判断竖着的5个是否都相等
for(i=0;i<11;i++)
{if(a[i][j]==1&&a[i+1][j]==1&&a[i+2][j]==1&&a[i+3][j]==1&&a[i+4][ j]==1)
return 1;
}
for(i=0;i<11;i++)//判断左斜5个
for(j=0;j<11;j++)
{if(a[i][j]==1&&a[i+1][j+1]==1&&a[i+2][j+2]==1&&a[i+3][j+3]==1&&a [i+4][j+4]==1)
return 1;
}
for(i=0;i<11;i++)//右斜5个
for(j=14;j>=4;j--)
{if(a[i][j]==1&&a[i+1][j-1]==1&&a[i+2][j-2]==1&&a[i+3][j-3]==1&&a [i+4][j-4]==1)
return 1;
}
return 0;
}
4.5.2判断是否黑棋胜代码
int CFivechessView::baisheng(int a[15][15])
{
int i,j;//判断横着的5个是否都相等
for(i=0;i<15;i++)
for(j=0;j<11;j++)
if(a[i][j]==2&&a[i][j+1]==2&&a[i][j+2]==2&&a[i][j+3]==2&&a[i][j+4 ]==2)
return 1;
for(j=0;j<15;j++)//判断竖着的5个是否都相等
for(i=0;i<11;i++)
if(a[i][j]==2&&a[i+1][j]==2&&a[i+2][j]==2&&a[i+3][j]==2&&a[i+4][j ]==2)
return 1;
for(i=0;i<11;i++)//判断左斜5个
for(j=0;j<11;j++)
if(a[i][j]==2&&a[i+1][j+1]==2&&a[i+2][j+2]==2&&a[i+3][j+3]==2&&a[ i+4][j+4]==2)
return 1;
for(i=0;i<11;i++)//右斜5个
for(j=14;j>=4;j--)
if(a[i][j]==2&&a[i+1][j-1]==2&&a[i+2][j-2]==2&&a[i+3][j-3]==2&&a[ i+4][j-4]==2)
return 1;
return 0;
}
4.5.3判断是否平局代码
int CFivechessView::ping(int a[15][15])
{
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
{
if(a[i][j]==0)//当棋盘全部子都不是0时才能return 1,即棋盘已下满
return 0;
}
return 1;
}
4.6. 悔棋
此功能是体现一种人性化,在菜单栏里添加悔棋按钮,当某一方玩家觉得此步走错了,按下悔棋按钮,调用悔棋函数,棋盘上就会自动消除玩家刚下的一步棋,实行悔棋功能。
悔棋代码如下:
void CFivechessView::OnFileHuiqi()
{
//TODO: Add your command handler code here
if(count!=0)
{
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(jl[i][j]==count)
{
wb[i][j]=0;
a[i][j]=0;
}
count--;
switch(RightORLet)
{
case 1:
RightORLet=0;
break;
case 0:
RightORLet=1;
break;
}
OnDraw(GetDC());
}
else
this->MessageBox("无法悔棋","完成",MB_OK);
}
4.7. 重新开始
在菜单栏里添加重新开始按钮,当按下重新开始按钮时,调用重新开始函数,对棋盘进行清盘处理,然后游戏重新开始。
重新开始代码如下:
void CFivechessView::OnFileRestart() //重新开始(用按钮)
{
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
{
wb[i][j]=0;
a[i][j]=0;
}
RightORLet=0;
count=0;
OnDraw(GetDC());
// TODO: Add your command handler code here
}
4.8. 背景音乐
首先将音乐转为wav类型,然后插入到资源,在fivechess.cpp中添加头文件
#include <mmsystem.h>
#pragma comment( lib, "Winmm.lib" )
在构造函数中添加如下代码:
{PlaySound((LPCTSTR)IDR_WAVE1,AfxGetInstanceHandle(),
SND_RESOURCE | SND_ASYNC);}
其中IDR_WAVE1为音乐文件的地址。
4.9. 保存读取游戏文件
理论上,这个游戏并无须保存,因为它确实太小了。
事实上,这个游戏有保存的功能,由于我们学习的需要。
这个游戏的保存,与其说是学习文件的保存,不如说是我们学习字符串的操作。
另外,这个附加的内容并不是为了当前的学习而添加的,而是为了后面的学习和应用而铺垫的。
4.9.1保存文件:
保存文件函数是一个菜单选项。
它的作用就是保存当前游戏的状态。
首先,我们应该为我们自己的文件定义一个后缀名:.wb;接着是打开保存文件的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照一定的顺序保存各个点的数组的值,最后保存当前是哪种颜色下棋。
void CFivechessView::OnFileSave()
{
// TODO: Add your command handler code here
//设置保存的文件,后缀名wb
CFileDialog
dlg(FALSE,"wb",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WB)|*.w b|All Files|*.*||",this);
//如果公共类对话框为确定
if(dlg.DoModal()==IDOK)//获取文件名
dlg.GetFileName();//否则,退出
else
return;//字符串变量
CString str;
int i,j;
CStdioFile file;//如果有问题,退出
if(file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeW rite|CFile::typeText)==0)
{
AfxMessageBox("save error!");
return;
} //循环把棋盘数组的值写进文件
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
if(wb[i][j]==1)
file.WriteString("1\n");
if(wb[i][j]==0)
file.WriteString("0\n");
if(wb[i][j]==2)
file.WriteString("2\n");
}
if(RightORLet==1) //保存当前下棋颜色
file.WriteString("2\n");
else
file.WriteString("1\n");
file.Close(); //关闭文件
}
4.9.2读取文件:
读文件就是把我们以前保存的文件打开,读取当前打开文件的内容,并给数组赋值使和文件内容相同,然后可以继续进行游戏。
void CFivechessView::OnFileOpen()
{
// TODO: Add your command handler code here
C FileDialog
dlg(TRUE,"wb",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WB)|*.wb |All Files|*.*||",this);
i f(dlg.DoModal()==IDOK)
dlg.GetFileName();
e lse
return;
C String str;
i nt i,j,m;
C StdioFile file;
i f(file.Open(dlg.GetFileName(),CFile::modeRead)==0) {
AfxMessageBox("save error!");
return;
}
C Archive ar(&file,CArchive::load);
f or(i=0;i<15;i++)
for(j=0;j<15;j++)
{
ar.ReadString(str);
sscanf(str,"%d",&m);
if(m==1)
wb[i][j]=1;
if(m==0)
wb[i][j]=0;
if(m==2)
wb[i][j]=2;
}
a r.ReadString(str);
s scanf(str,"%d",&m);
i f(m==1)
RightORLet=0;
e lse
RightORLet=1;
f ile.Close();
a r.Close();
I nvalidate(false);
}
第五章测试分析
经过无数次的测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏,能够显示谁赢谁输,还是平局,能够自动播放背景音乐并且可以手动关闭,能够完整保存和打开游戏文件。
该游戏利用鼠标进行下棋,在菜单栏中选择悔棋,和重新开始的功能。
当胜负已分,游戏结束时,会自动弹出一个显示输赢的对话框。
结论和心得体会
编辑游戏这在一前我都以为是要遥不可及,但现在通过这次五子棋的设计我明白了,并不是如此,只要团队合作也可以搞定,我多学了许多的以前课上没有的知识,比如怎么用c++程序画图,写出文本,编辑游戏功能等。
通过课程设计,我们对《C++》这门课程有了更深一步的了解。
它是计算机程序设计的重要理论技术基础,在我们测控专业的学习中占据着十分重要的地位。
同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。
因为我们学习知识就是为了实践。
而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。
同时对于此游戏还可以进一步研究开发,可以制成有人机对战和人人对战两种选择的游戏,还可以制成网上游戏形式,可以和网友一起游戏等等。
致谢
本说明书和游戏软件是在指导老师悉心指导下和同学的耐心帮助下完成的。
这次课程设计能够顺利的完成,要感谢老师同学的帮助。
首先要感谢是指导老师,在技术上给了我很大的帮助和启发,当我遇到困难的时候,不知如何去解决时,就会寻求老师的指导,指导老师会很有耐心的为我讲解;感谢我的指导老师,他循循善诱的教导和不拘一格的思路给予了我很多的启发和帮助。
感谢班上同学对我的帮助和指点。
没有他们的帮助,对于我一个对编程知识不是很精通的人来说,要想在短短的的时间里完成一个系统的软件设计是一件很困难的事情。
在一些小问题上,只要能够解答,同学都会尽力帮助我,让我不至于在设计时一直止步不前。
感谢同学的耐心帮助和指点。
在此表示最诚挚的感谢!
江苏大学测控专业编程及软件应用课程设计说明书
参考文献:
[1] 《Visual C++面向对象程序设计教程与实验》第二版温秀梅,丁学钧主编清华大学出版社 2009
[2] 《C程序设计》第三版谭浩强著清华大学出版社 2005
29。