面向对象的程序设计
题目: 五子棋游戏
一.引言
1.编写目的:
通过本课程设计,使学生巩固面向对象程序设计的基本概念、原理和技术,学会使用Visual C++开发工具进行简单面向对象程序的开发,将理论与实际相结合,完成一个小型面向对象程序的设计与实现,并在此基础上强化学生的实践意识,提高其实际动手能力和创新能力。
2.定义: 类:类(Class)实际上是对某种类型的对象定义变量和方法的原型。类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。
构造函数:C++语言为类提供的构造函数可自动完成对象的初始化
任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用.然而给出一个外部对象的引用性声明时,并不调用相应的构造函数 3.参考资料:
(1).孙鑫 《VC++深入详解》 ISBN:7121025302 电子工业出版社,2006 (2).侯俊杰 《深入浅出MFC》ISBN:9787900614933 华中理工大学出版社 2001
(3).王艳平 张峥 《WINDOWS程序设计》ISBN:9787115172327 人民邮电出版社2008
二.任务的描述
1.目标:
(1)进行五子棋游戏的系统结构设计和类结构设计; (2)设计并实现五子棋游戏。
2.功能描述:能实现简单的五子棋游戏,但不能实现人机互动。进行五子棋游戏时,需输入坐标(数字 字母)。能判断落子的错误,并提示重新输入。可在每局结束时,选择再玩一局或者退出。
3.性能描述
(1)数据精确度:数据输入从1-15,a-o。 (2)时间特性:反应时间较慢。 4.运行环境:
硬件:装有Windows操作系统的计算机
软件:Microsoft Visual Studio 6.0、Microsoft Visual Studio 2005
5.条件与限制:
(1)因程序较简单,无法进行可视化的操作,在进行五子棋游戏时必须逐个输入坐标。
(2)程序不能实现人机对战,只能进行人与人的五子棋游戏。 (3)程序不能进行悔棋的操作。
(4)程序没有考虑死棋的情况,不能出现平局。
三.任务设计
1.类的划分:
(1)类1:程序中只用到一个类,五子棋类:class Gobang。
公有成员包括无参数构造函数Gobang()和void pain(); int setChessboard(int t1); int ifWin(); int whoWin(int sum); void reset()。
私有成员包括int W[15][15]; int count;
2.类的接口设计:
(1)类1: 外部结构包括:
无参数构造函数Gobang() void pain();
int setChessboard(int t1); int ifWin(); int whoWin(int sum); void reset()。
……………………………… 3.类之间的关系:
程序仅定义了一个类。
四.编写代码
1.问题1
(1)问题描述:
编写计算获胜的算法时,将获胜情况分横竖斜3种,但在编写斜着胜的时候没有充分考虑到,斜着情况有两种。应该分斜向上和斜向下两种情况。导致编写代码时一直出现错误。
(2)解决办法:
查找资料后将斜着获胜的算法分为了两部分,分别用3个嵌套的for循环实现。改为如下所示 for(i=11;i>=0;i--)
for(j=0;j<11;j++) {
sum = 0;
for(k=0;k<5;k++) {
if(0 == W[i+k][j+k]) break; sum+=W[i+k][j+k];
if(whoWin(sum)) return 1; } }
for(i=0;i<11;i++)
for(j=4;j<15;j++) {
sum = 0;
for(k=0;k<5;k++) {
if(0 ==W[i+k][j-k]) break; sum+=W[i+k][j-k]; if(whoWin(sum)) return 1; }
},问题得以解决。
2.问题2
(1)问题描述:
编写程序时将横纵坐标都用char定义,后面对纵坐标进行减96转化为字母操作,对横坐标进行减0操作。结果发现在将棋子写入棋盘时,出现错误。Char cc, cl;
intc,l; do{
cout<<"请输入您要落子的坐标(数字字母):"; cin>>cc; c =cc-0;
cin>>cl; l =cl-96;
if(W[c-1][l-1]!=0||c<0||c>15||l<0||l>15) cout<<"输入有误,请重新输入^_^: ";
}
(2)解决办法:
仔细检查后发现自己将数字用char定了,然后像纵坐标减96转化为字母一样,对横坐标进行了减0的操作。只要将cc用int定义,且不需要减0即可。改成下面的情况就可解决问题。 char cl; int cc,c,l; do{
cout<<"请输入您要落子的坐标(数字字母):"; cin>>cc; c =cc;
cin>>cl;
l =cl-96;
if(W[c-1][l-1]!=0||c<0||c>15||l<0||l>15) cout<<"输入有误,请重新输入^_^: "; }
……………………………………