C 课程设计说明书

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

江苏大学
编程及软件应用实践课程设计说明书
五子棋游戏
学生姓名:黄小宝
学号: 3070302019
年级专业:2007级测控技术与仪器
班级:测控 0701 班
指导老师:张世庆
学院:机械工程学院
江苏·镇江
提交日期:2009年7月
五子棋游戏
黄小宝
(江苏大学,中国,镇江212013)
摘要:该游戏软件在Windows系统为玩家提供传统五子棋游戏的基本功能,在这简单的五子棋中,玩家通过鼠标进行两个人的游戏。

游戏中包含姓名输入、开始/重新开始、悔棋、是否同意和回放等功能,游戏的主战场为15行15列的棋盘。

游戏结束,如果有输赢,则输出谁胜,否则,输出平局的信息框。

关键词:五子棋;视窗操作系统;游戏;MFC
The Game of Gobang
Xiaobao Huang
(Jiangsu University, China, Zhenjiang 212013)
Abstract:To provide a traditional Gobang game, this game software in the Windows system, is for players with the basic functions in this simple Gobang, the audiences through a mouse for a two-person game.You can enter your names included in the game, it has a start / restart, Hui Qi, agree or not and playback functions, the main battlefield of the game for 15 to 15 of the chessboard. The end of the game, if a win or lose, who wins and output, or output tie the information box.
Keywords: Gobang; Windows System; Game;MFC
目录
课程设计任务书 (1)
一、课程设计题目:五子棋游戏 (1)
二、目的与要求: (1)
1、目的: (1)
2、基本要求: (1)
3、创新要求: (1)
4、写出设计说明书 (1)
三、设计方法和基本原理: (1)
四、设计中涉及到的重要内容: (1)
五、程序设计和调试: (2)
六、答辩与评分标准: (2)
1 前言 (3)
2 需求分析 (3)
2.1系统概述 (3)
2.1.1概述 (3)
2.2系统运行环境 (3)
2.2.1运行环境 (3)
2.3功能需求描述 (3)
2.3.1功能需求 (3)
3 总体设计 (4)
3.1开发与设计的总体思想 (4)
3.1.1屏幕的组成 (4)
3.1.2形状的组成 (4)
3.1.3形状的统一 (4)
4 概要设计 (5)
4.1系统流程图 (5)
4.2 系统功能模块 (5)
5 详细设计 (6)
5.1.界面的设计 (6)
5.2游戏中棋盘的形成 (6)
5.3游戏下子功能代码 (8)
5.4判断功能代码 (9)
5.5设置项目中的功能代码 (11)
5.6悔棋功能代码 (12)
5.7回放功能代码 (13)
6 测试分析 (15)
7 心得体会 (15)
参考文献 (15)
致谢 (16)
课程设计任务书
一、课程设计题目:五子棋游戏
二、目的与要求:
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和C++调试技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

(4)培养学生综合利用C++语言进行程序设计的能力,主要是培养学生利用系统提供的标准图形函数进行创新设计。

2、基本要求:
(1)在开始编写程序以前,要完成对系统的分析,画出程序的流程框图。

(2)要求用C++类的思想来完成程序的设计。

(3)要求的程序中至少要定义两个类(例如:坐标position类,棋子chess类等),类中要有多个属性和方法。

(4)完成的程序界面要美观,能够完成五子棋的基本游戏功能(两人对战)。

3、创新要求:
在基本要求达到后,进行创新设计,完善与增加游戏的功能,例如悔棋功能。

4、写出设计说明书
按照设计过程写出设计说明书。

三、设计方法和基本原理:
1、创建棋盘大小(可任意),并且要保存棋盘上各个点的位置;
2、创建棋子类及其属性和方法;
3、从盘键分别获取两个用户的输入,根据用户的身份及输入的位置,调用棋子类的相应方法,完成棋子的走动;
4、输赢的判断;
5、游戏结束。

四、设计中涉及到的重要内容:
1、对话框应用程序的编写方法及其相关函数;
2、绘图工具的使用方法;
五、程序设计和调试:
六、答辩与评分标准:
1、完成基本功能:40分;
2、设计报告及使用说明书:30分;
3、设置错误或者按照要求改变结果:15分;
4、回答问题:15分。

1 前言
随着社会发展,人类的生产生活越来越离不开信息。

谁拥有了更多更有效的信息,谁就将在竞争中处于有利地位。

信息产业正在成为一个国家的支柱。

只有拥有了先进的数据库技术,才能有效地管理好浩如烟海的数据,并从中提取出对自己有用的信息来加以利用。

作为计算机应用的一部分,使用计算机对信息进行管理,具有手工管理所无法比拟的优点。

例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。

这些优点能够极大地提高管理的效率,也是正规化管理与世界接轨的重要条件。

在下面的各章中我们将以开发一个五子棋游戏为例,谈谈其开发过程和所涉及到的问题及解决方法。

2 需求分析
2.1系统概述
2.1.1概述
该游戏软件在Windows系统为玩家提供五子棋游戏两人对战的基本功能,玩家可以通过鼠标在棋盘的相应位置下子,一方为白色,另一方为黑色,先下的为黑子(主场)。

游戏过程中,只要有一人先连成五个棋子,不论横、竖或斜,就会在屏幕上显示是谁赢了比赛,也可以是平局收场,从而可以进行下一场比赛。

在比赛过程中,如果一方需要悔棋,先得通过对手的同意才可以。

在右下方,有黑子和白子,且还有“0”和“1”,“1”表示轮到此色子下了。

2.2系统运行环境
2.2.1运行环境
(1)硬件环境。

本系统适用于那种Inter386以上计算机,内存容量为128M,应配备键盘、鼠标、显示器等外部设备。

(2)软件环境。

本系统的设计采用Visual C++6.0编写。

在Windows XP SP2环境下测试通过。

(3)本游戏软件在Windows平台下都可以运行。

2.3功能需求描述
2.3.1功能需求
这是一次新的尝试,也是一次比较成功的设计,其算法与程序结构足以让人满意。

这个游戏,
不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求,回放效果更是让玩家欣赏自己是如何赢得或输的。

3 总体设计
3.1开发与设计的总体思想
3.1.1屏幕的组成
一个游戏一定要有一个界面供游戏者对游戏控制。

这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,白方要下子时,必须要先看一看所有黑子的排列情况,决定是防守还是进攻,这关系着玩家要如何放置自己的棋子,让整体有个更加的布局,有利于游戏的进行。

屏幕由15行15列的网格组成;其中行的眉头上标有字母A、B、C…O;列的方向标有数字1、2、3……15。

菜单栏中的组成部分:
3.1.2形状的组成
每一种形状都是由五个棋子组成,比如●●●●●或○○○○○由五个棋子排列而成。

3.1.3形状的统一
妻子的排列,如:●●●●●等共有8种形状(黑白的形状归为不同的形状)。

如图形状:
黑棋的四种情况:
●●●●●●○○○○●○○○○○○○○●
○○○○○●○○○○○●○○○○○○●○
○○○○○●○○○○○○●○○○○●○○
○○○○○●○○○○○○○●○○●○○○
○○○○○●○○○○○○○○●●○○○○
图3.1
白棋的四种情况:
○○○○○○●●●●○●●●●●●●●○
●●●●●○●●●●●○●●●●●●○●
●●●●●○●●●●●●○●●●●○●●
●●●●●○●●●●●●●○●●○●●●
●●●●●○●●●●●●●●○○●●●●
图3.2
4 概要设计
4.1系统流程图
系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:
图4.1 系统流程图
4.2 系统功能模块
系统功能模块是对系统的大致功能进行描述,本游戏的系统功能模块如下:
图4.2 系统功能模块
5 详细设计
根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:5.1.界面的设计
程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。

使程序界面更加友好,在使用上给用户一种清新怡然的感觉。

5.2游戏中棋盘的形成
实现此功能相关代码如下:
void CCk19View::OnDraw(CDC* pDC)
{
CCk19Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap bitmap;//背景棋盘
bitmap.LoadBitmap(IDB_BITMAP1);
CDC mem,mem1,mem2,qzh,qzb;
mem.CreateCompatibleDC(pDC);
mem.SelectObject(&bitmap);
pDC->BitBlt(0,0,600,400,&mem,0,0,SRCCOPY);
CBitmap bitmap5;//死骑
bitmap5.LoadBitmap(IDB_BITMAP5);
mem2.CreateCompatibleDC(pDC);
mem2.SelectObject(&bitmap5);
pDC->BitBlt(350,0,600,352,&mem2,0,0,SRCCOPY);
CBitmap bitmap4;//五子棋
bitmap4.LoadBitmap(IDB_BITMAP4);
mem1.CreateCompatibleDC(pDC);
mem1.SelectObject(&bitmap4);
pDC->BitBlt(420,285,600,400,&mem1,0,0,SRCCOPY);
CBitmap bitmap2;//黑子
bitmap2.LoadBitmap(IDB_BITMAP2);
qzh.CreateCompatibleDC(pDC);
qzh.SelectObject(&bitmap2);
CBitmap bitmap3;//白子
bitmap3.LoadBitmap(IDB_BITMAP3);
qzb.CreateCompatibleDC(pDC);
qzb.SelectObject(&bitmap3);
//以下是显示棋子的代码
CRect rect; //矩形区域
GetClientRect(&rect); //获得窗口矩形区域
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&qp,0,0,SRCCOPY);
//绘图
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
{
if(qz[i][j]==1)
{
pDC->BitBlt(18+i*24,18+j*24,20,20,&qzh,0,0,SRCCOPY);
}
else if(qz[i][j]==2)
{
pDC->BitBlt(18+i*24,18+j*24,20,20,&qzb,0,0,SRCCOPY);
}
}
}
5.3游戏下子功能代码
int qz[15][15];//棋子的二维数组
实现此功能相关代码如下:
void CCk19View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i=(point.x-10)/24;int j=(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());
Position p(i,j,qz[i][j]);//Position类记录各棋子的位置和值 //int hs,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);
}
5.4判断功能代码
此代码用来判断当某一方下完子后是否有练成五个子的可能性。

自己创建一个类并判断
class Position //坐标position类
{
public:
Position(int m,int n,int k)
{x=m;y=n;f=k;}
int GetHorizontal();//获得水平连续棋子的个数
int GetVertical();//获得垂直连续棋子的个数
int GetRightSlanting();//获得右斜连续棋子的个数
int GetLeftSlanting();//获得左斜连续棋子的个数
private:
int f;//记录棋子的颜色,1为黑子,2为白子
int x;//行数
int y;//列数
int hsy;//水平向右
int hsz;//水平向左
int sss;//竖直向上
int ssx;//竖直向下
int ys;//右上
int zx;//左下
int yx;//右下
int zs;//左上
};
实现此功能相关代码如下:
int Position::GetHorizontal()//水平方向{
hsy=hsz=0;
for(int i=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);
}
int Position::GetLeftSlanting()//左斜方向{
ys=zx=0;
for(int i=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);
}
int Position::GetRightSlanting()//右斜方向
{
yx=zs=0;
for(int i=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);
}
int Position::GetVertical()//垂直方向
{
sss=ssx=0;
for(int i=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.5设置项目中的功能代码
此功能用来在游戏结束后,用来“开始/重新开始”。

并且一次性消去棋盘上所有的棋子。

实现此功能相关代码如下:
void CCk19View::OnStart()
{
// TODO: Add your command handler code here
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
qz[i][j]=0;
OnDraw(GetDC());
}
5.6悔棋功能代码
此功能是体现一种人性化,当某一方玩家觉得此步走错了,向对方提出悔棋请求。

当对方同意后,棋盘上会自动消除玩家刚下的一步棋。

程序的具体实现部分如程序清单如下所示。

void CCk19View::OnBlackAgree() //黑方同意
{
// TODO: Add your command handler code here
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(jl[i][j]==count)
qz[i][j]=0;
count--;
OnDraw(GetDC());
}
void CCk19View::OnBlackNoAgree() //黑方不同意
{
// TODO: Add your command handler code here
MessageBox(" SOORY\n我不同意!");
}
void CCk19View::OnBlackStone() //黑方提出悔棋请求
{
// TODO: Add your command handler code here
MessageBox("黑棋提出悔棋请求!\n 白棋同意吗?");
}
void CCk19View::OnWhiteAgree() //白方同意
{
// TODO: Add your command handler code here
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(jl[i][j]==count)
qz[i][j]=0;
count--;
OnDraw(GetDC());
}
void CCk19View::OnWhiteNoAgree() //白方不同意
{
// TODO: Add your command handler code here
MessageBox("不好意思啦!\n 不同意!");
}
void CCk19View::OnWhiteStone() //白方提出悔棋请求
{
// TODO: Add your command handler code here
MessageBox("白棋提出悔棋请求!\n 黑气同意吗?");
}
5.7回放功能代码
为了进一步观察自己的得失和对手的技术,这一功能是一个比较好的平台,具体代码如下:
class Chess//棋子chess类
{
public:
Chess(){i=0;j=0;k=1;}
void Remember();//记住棋子的位置及次序private:
int i,j,k;
};
void Chess::Remember()
{
for(k=1;k<=count;k++)
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(jl[i][j]==k)
{
cp[k].x=i;
cp[k].y=j;
cp[k].n=qz[i][j];
}
for(i=0;i<15;i++)
for(j=0;j<15;j++)
qz[i][j]=0;
}
下面是实现回放的具体函数:
void CCk19View::OnReplay()
{
// TODO: Add your command handler code here Chess ch;
ch.Remember();
SetTimer(1,1000,NULL);
}
int i=1;
void CCk19View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
qz[cp[i].x][cp[i].y]=cp[i].n; i++;
OnDraw(GetDC());
if(i>count) KillTimer(1);
CView::OnTimer(nIDEvent);
}
6 测试分析
经过无数次的测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏,能够显示谁赢谁输,还是平局。

如利用鼠标进行下棋,悔棋,回放,用键盘输入姓名,在不需要此游戏界面在屏幕上显示时。

当结束游戏时,会自动弹出一个对话框。

7 心得体会
经过一个多星期的设计和开发,系统基本开发完毕。

在本次课程设计中困难遇到不少,比如重新开始,弹出自己创建的对话框,回放等。

由于设计时间较短,所以该系统还有许多不尽如人意的地方,如输入姓名的对话框不够美观、回放不能重复两次等多方面问题。

在这次系统开发的过程中,我深深体会到了做一个系统,首先进行需求分析的重要性,了解了一个系统的制作,从功能分析到功能模块分析、与其他系统的关系,这些都有待以后进一步改进。

通过实践对于我以后的学习是一笔不小的财富!参考文献
1.Robert Thompason. MFC开发人员参考手册,机械工业出版社,1998
2.孔鹏. Visual C++6.0 完全自学手册,机械工业出版社,2007
3.温秀梅丁学钧. Visual C++ 面向对象程序设计. 清华大学出版社,2006
致谢
本论文和游戏软件是在指导老师悉心指导下完成的。

这次课程设计能够顺利的完成,要感谢同学的帮助。

首先要感谢是指导老师,在技术上给了我很大的帮助和启发,在我出现不明白的地方,不知如何去解决时,老师很有耐心的为我讲解;感谢我的指导老师,他循循善诱的教导和不拘一格的思路给予了我很多的编程思想。

感谢班上同学对我的帮助和指点。

没有他们的帮助,对于我一个对编程知识不是很精通的人来说,要想在短短的的时间里完成一个系统的软件设计是一件很困难的事情。

在此表示最诚挚的感谢!
作者
2009年7月3日星期五
于计算机中心。

相关文档
最新文档