五子棋游戏软件说明书1.docx
《五子棋游戏软件说明书1.docx》由会员分享,可在线阅读,更多相关《五子棋游戏软件说明书1.docx(13页珍藏版)》请在冰点文库上搜索。
五子棋游戏软件说明书1
XX大学
软件大型实验周
说明书
学院:
专业:
题目:
学生姓名:
学号:
成绩
指导教师:
职称:
年月日
1.设计目的
(1)要求学生达到熟练掌握C++语言的基本知识和C++调试技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
(4)培养学生综合利用C++语言进行程序设计的能力,主要是培养学生利用系统提供的标准图形函数进行创新设计。
2.设计内容
1、创建棋盘大小(可任意),并且要保存棋盘上各个点的位置;
2、创建棋子类及其属性和方法;
3、从盘键分别获取两个用户的输入,根据用户的身份及输入的位置,调用棋子类的相应方法,完成棋子的走动;
4、输赢的判断;
5、游戏结束。
3.开发和运行环境介绍
该课程设计在设计与实验过程中需要在windowsXP系统/windows2000以上系统中进行,程序设计要求在visualC++6.0平台中进行,完成代码的编写、编译、调试、测试等工作。
本游戏对计算机硬件和操作系统要求极低,所以在这里只是把自己的电脑硬件参数和系统参数列下:
操作系统:
windowsxp
软件环境:
安装VC++6.0
4.需求分析(以下项目根据实际情况自定)
4.1功能需求
游戏说明:
游戏开始时,由黑子开局,将一枚棋子落在棋盘一坐标上,然后由白棋落子,如此轮流下子,直到某一方首先在棋盘的竖、横或斜三方向上的五子连成线,则该方该局获胜;然后继续下一局,每胜一局得10分,输一局或平局得0分,先赢两局的一方为最终获胜者;在下棋途中可以悔棋。
1、功能列表如下:
a)输出棋盘;
b)显示用户行程,提示用户下子;
c)查看用户的输入是否出界;
d)悔棋,下错位置可以悔棋;
e)记录并显示每局游戏结束时的步数;
f)判断每局游戏输赢,显示每局游戏的获胜者及分数。
g)判断是否进行下一局。
h)判最终赢家(三局两胜)。
i)退出游戏。
2、功能描述
(1)棋盘是15*15的方格棋盘,下棋区为a[0][0]到a[14][14]。
(2)黑子先下,白子后下,两者交替下子,下子坐标范围为(1,1)到(15,15)。
(3)当一方棋子下错位置时,输入(-1,-1)悔棋,屏幕提示悔棋方请输入下子位置。
(4)当下子的坐标处有子时,提示有子请重下。
(5)每赢一局积累10分,输一局或平局得0分,先得够20分的一方为最终赢家。
4.2性能需求
1、技术可行性
运用Windows2000/XP以上的操作系统,SQLSERVER2000的数据库技术,开发以WindowsXP为用户的操作平台,界面友善、功能齐全的《五子棋双人对战小游戏》。
2、经济可行性
一方面,新系统中棋盘界面和更强劲的功能支持,再加三局两胜制的规则,不仅增加了游戏的趣味性,而且使游戏者更尽兴;另一方面系统开发成本低,现有PC机即可提供该系统开发工作需要的所有硬件设备环境。
3、操作可行性
操作上是键盘的使用,主要凭借输入坐标确定棋子落子位置,方便简单。
使用前只要看明白游戏规则及其方法即可。
4.3数据流图
黑子下棋
白棋下子
输出棋盘
下棋位置正确
悔棋
下棋位置正确
悔棋
开始游戏
结束游戏
N
Y
Y
Y
Y
Y
N
N
N
N
N
本局胜负
本局胜负
Y
Y
Y
等于20分
等于20分
N
N
4.4数据字典
变量及说明
数据编码:
数据名(标识符)
库名:
三局两胜制双人对战五子棋游戏
信息:
变量类型说明
x1int黑子下棋行数
y1int黑子下棋列数
x2int白子下棋行数
y2int白子下棋列数
nint下棋步数
score1int黑子分数
score2int白子分数
iint棋盘行数
jint棋盘列数
pint黑棋赢的盘数
qint白棋赢的盘数
mint下棋的局数
heimint单局黑子赢后,将要下的局数
baimint单局白子赢后,将要下的局数
5.系统设计与实现(主要说明自己所负责的模块的情况)
5.1模块功能描述
1.界面的设计
程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。
使程序界面更加友好,在使用上给用户一种清新怡然的感觉。
2.游戏中棋盘的形成
实现此功能相关代码如下:
voidCCk19View:
:
OnDraw(CDC*pDC)
{
CCk19Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CBitmapbitmap;//背景棋盘
bitmap.LoadBitmap(IDB_BITMAP1);
CDCmem,mem1,mem2,qzh,qzb;
mem.CreateCompatibleDC(pDC);
mem.SelectObject(&bitmap);
pDC->BitBlt(0,0,600,400,&mem,0,0,SRCCOPY);
CBitmapbitmap5;//死骑
bitmap5.LoadBitmap(IDB_BITMAP5);
mem2.CreateCompatibleDC(pDC);
mem2.SelectObject(&bitmap5);
pDC->BitBlt(350,0,600,352,&mem2,0,0,SRCCOPY);
CBitmapbitmap4;//五子棋
bitmap4.LoadBitmap(IDB_BITMAP4);
mem1.CreateCompatibleDC(pDC);
mem1.SelectObject(&bitmap4);
pDC->BitBlt(420,285,600,400,&mem1,0,0,SRCCOPY);
CBitmapbitmap2;//黑子
bitmap2.LoadBitmap(IDB_BITMAP2);
qzh.CreateCompatibleDC(pDC);
qzh.SelectObject(&bitmap2);
CBitmapbitmap3;//白子
bitmap3.LoadBitmap(IDB_BITMAP3);
qzb.CreateCompatibleDC(pDC);
qzb.SelectObject(&bitmap3);
//以下是显示棋子的代码
CRectrect;//矩形区域
GetClientRect(&rect);//获得窗口矩形区域
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&qp,0,0,SRCCOPY);//绘图
for(inti=0;i<15;i++)
for(intj=0;j<15;j++)
{
if(qz[i][j]==1)
{
pDC->BitBlt(18+i*24,18+j*24,20,20,&qzh,0,0,SRCCOPY);
}
elseif(qz[i][j]==2)
{
pDC->BitBlt(18+i*24,18+j*24,20,20,&qzb,0,0,SRCCOPY);
}
}
}
3.游戏下子功能代码
intqz[15][15];//棋子的二维数组
实现此功能相关代码如下:
voidCCk19View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
inti=(point.x-10)/24;intj=(point.y-10)/24;
if(i<15&&j<15)
if(qz[i][j]==0)
{
qz[i][j]=count%2+1;
count++;
jl[i][j]=count;
OnDraw(this->GetDC());
Positionp(i,j,qz[i][j]);//Position类记录各棋子的位置和值
//inths,ss,ps,ns;是判断点(i,j)的横、竖、撇和捺有无五个子
hs=p.GetHorizontal();
ss=p.GetVertical();
ps=p.GetRightSlanting();
ns=p.GetLeftSlanting();
if(hs==5||ss==5||ps==5||ns==5)
{
if(qz[i][j]==1)
MessageBox("你真是太牛了!
\n恭喜你,黑子赢了!
\n游戏结束,请重新开始。
");
if(qz[i][j]==2)
MessageBox("你真是太牛了!
\n恭喜你,白子赢了!
\n游戏结束,请重新开始。
");
}
if((count==225)&&(hs!
=5)&&(ss!
=5)&&(ps!
=5)&&(ns!
=5))
MessageBox("你俩都很棒!
\n平手!
","请握手言和",MB_OK);
}
CView:
:
OnLButtonDown(nFlags,point);
}
4.判断功能代码
此代码用来判断当某一方下完子后是否有练成五个子的可能性。
自己创建一个类并判断
classPosition//坐标position类
{
public:
Position(intm,intn,intk)
{x=m;y=n;f=k;}
intGetHorizontal();//获得水平连续棋子的个数
intGetVertical();//获得垂直连续棋子的个数
intGetRightSlanting();//获得右斜连续棋子的个数
intGetLeftSlanting();//获得左斜连续棋子的个数
private:
intf;//记录棋子的颜色,1为黑子,2为白子
intx;//行数
inty;//列数
inthsy;//水平向右
inthsz;//水平向左
intsss;//竖直向上
intssx;//竖直向下
intys;//右上
intzx;//左下
intyx;//右下
intzs;//左上
};
实现此功能相关代码如下:
intPosition:
:
GetHorizontal()//水平方向
{
hsy=hsz=0;
for(inti=1;y-i>=0;i++)
if(qz[x][y-i]!
=f)break;
hsz=i-1;
for(i=1;y+i<=14;i++)
if(qz[x][y+i]!
=f)break;
hsy=i-1;
return(hsy+hsz+1);
}
intPosition:
:
GetLeftSlanting()//左斜方向
{
ys=zx=0;
for(inti=1;(x-i>=0)&&(y+i<=14);i++)
if(qz[x-i][y+i]!
=f)break;
ys=i-1;
for(i=1;(x+i<=14)&&(y-i>=0);i++)
if(qz[x+i][y-i]!
=f)break;
zx=i-1;
return(ys+zx+1);
}
intPosition:
:
GetRightSlanting()//右斜方向
{
yx=zs=0;
for(inti=1;(x-i>=0)&&(y-i>=0);i++)
if(qz[x-i][y-i]!
=f)break;
zs=i-1;
for(i=1;(x+i<=14)&&(y+i<=14);i++)
if(qz[x+i][y+i]!
=f)break;
yx=i-1;
return(yx+zs+1);
}
intPosition:
:
GetVertical()//垂直方向
{
sss=ssx=0;
for(inti=1;x-i>=0;i++)
if(qz[x-i][y]!
=f)break;
sss=i-1;
for(i=1;y+i<=14;i++)
if(qz[x+i][y]!
=f)break;
ssx=i-1;
return(sss+ssx+1);
}
5.设置项目中的功能代码
此功能用来在游戏结束后,用来“开始/重新开始”。
并且一次性消去棋盘上所有的棋子。
实现此功能相关代码如下:
voidCCk19View:
:
OnStart()
{
//TODO:
Addyourcommandhandlercodehere
for(inti=0;i<19;i++)
for(intj=0;j<19;j++)
wqz[i][j]=0;
OnDraw(GetDC());
}
5.2软件实现
。
。
。
。
。
。
。
。
。
6.软件测试
经过无数次的测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏,能够显示谁赢谁输,还是平局。