C++三字连珠报告.docx
《C++三字连珠报告.docx》由会员分享,可在线阅读,更多相关《C++三字连珠报告.docx(19页珍藏版)》请在冰豆网上搜索。
![C++三字连珠报告.docx](https://file1.bdocx.com/fileroot1/2023-4/24/2801cb9a-e716-46e9-8438-d56e3a5de981/2801cb9a-e716-46e9-8438-d56e3a5de9811.gif)
C++三字连珠报告
C++课程设计报告
(2010--2011年度第二学期)
三子连珠游戏的设计与实现
专业
计算机
学生姓名
班级
BM计算机092
学号
指导教师
王榕
完成日期
2011年7月7日
三子连珠游戏的设计与实现
1概述
课程设计目的
1、巩固并加深学生对C++语言程序设计知识的理解;
2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;
3、进一步掌握和应用VC++集成开发环境;
4、提高运用C++语言解决实际问题的能力;
5、初步掌握开发小型实用软件的基本方法,能独立设计、实现具有实际功能的小系统;
6、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。
课程设计内容
课题名称:
三子连珠游戏
说明:
模仿五子棋的形式,有一方三子连成一线即获胜。
要求:
1)玩家可以设置棋盘的大小。
2)加入悔棋的功能,要求任一方可以在对方下棋后悔改一步,即将对方当前步和本方上一步删除,本方重新下棋。
2系统需求分析
系统目标
该程序模仿五子棋的形式,有一方三子连成一线即获胜。
主体功能
两方下棋,系统设置为3*3格式,具有判断越界,判断合理性和判断平局能力,在输赢确定后输出总结信息。
开发环境
MicrosoftVisualC++
3系统概要设计
系统的功能模块划分
(1)初始化棋盘模块(InitialBoard):
此模块功能是按照代码所规定的变量n,使棋盘成为n*n的大小,并把棋盘的主界面输出给操作者看。
(2)下棋模块(PlayTurn):
这部分是对越界和合理性规则进行判断。
越界是下棋超越规定的边界,合理性是下棋是否下到已存在棋子的位子。
(3)判断输赢模块(JudgePlay):
此模块是对棋子是否连成一线规则进行判断。
连成一线则赢棋。
(4)判断平局模块(GetFull):
这部分是对棋盘是否布满棋子进行检查
(5)判断退出模块:
这是一个不可缺少的重要模块,这个部分根据用户自己的意愿进行重新开始和不再开始的选择。
三子连珠游戏系统
初始化棋盘模块
下棋模块
判断输赢模块
判断平局模块
退出模块
判断越界
判断合理
图3-1系统主要功能模块
系统流程图
输出总结信息
结束
图3-2系统流程图
4系统详细设计
初始化棋盘模块设计
此模块功能是按照我所编写的代码中规定的变量nSize的值n,使棋盘成为n*n的大小,并把棋盘的主界面输出给操作者看。
我首先定义了静态全局变量achBoard[3][3],以及静态函数PrintBoard(void),
其次我定义了两个全局整型nSize=3和nDraw=0,
再次用嵌套FOR循环完成在achBoard[3][3]所有位子填入“”。
④在输出棋盘上就非常容易了,在函数PrintBoard(void)用输出流cout逐条逐句输出。
图4-1初始化棋盘
下棋模块设计
①首先定义静态函数PlayTurn(void)
②其次定义两个整型nRow和nCol
③用输出流cout输出提示:
“请输入棋盘坐标(X,Y):
”
④用输入流cin输入:
nRownCol
⑤
(1)当输入的nRow>nSize或者nCol>nSize时,判断为超出边界,直接重新输入(调用while
(1),它作用为重新开始下棋)。
(2)若不满足以上条件,则判断achBoard[nRow-1][nCol-1]是不是“”,若不是“”,则重新输入(调用while
(1)),否则在坐标处放上棋子。
开始
nSize=3
输入nRow,nCol
nRow>nSize或者nCol>nSize
achBoard[nRow-1][nCol-1]!
=''
在座标处放上棋子
结束
Y
N
Y
N
图4-2下棋流程图
判断输赢模块
根据以下情况判断
表4-1
achBoard[0][0]==chSort&&achBoard[1][1]==chSort&&achBoard[2][2]==chSort
赢棋
①赢的一方nWin+1
②输的一方
nLose+1
achBoard[2][0]==chSort&&achBoard[1][1]==chSort&&achBoard[0][2]==chSort
achBoard[0][0]==chSort&&achBoard[1][0]==chSort&&achBoard[2][0]==chSort
achBoard[0][1]==chSort&&achBoard[1][1]==chSort&&achBoard[2][1]==chSort
achBoard[0][2]==chSort&&achBoard[1][2]==chSort&&achBoard[2][2]==chSort
achBoard[0][0]==chSort&&achBoard[0][1]==chSort&&achBoard[0][2]==chSort
achBoard[1][0]==chSort&&achBoard[1][1]==chSort&&achBoard[1][2]==chSort
achBoard[2][0]==chSort&&achBoard[2][1]==chSort&&achBoard[2][2]==chSort
不满足以上情况
进入判断平局模块
表4-3判断输赢情况
判断平局模块
首先定义静态函数GetFull(void),
再次根据整型nSize为限用嵌套FOR循环来判断是否有“”。
i=0
i<3
J=0,j<3,1=j+1
achBoard[0][0]不是“”
成立则往下,否则需要再次放棋子
J=1,j<3,2=j+1
achBoard[0][1]不是“”
J=2,j<3,3=j+1
achBoard[0][2]不是“”
J=3,j=3
1=i+1
I=1
I<3
J=0,j<3,1=j+1
achBoard[1][0]不是“”
成立则往下,否则需要再次放棋子
J=1,j<3,2=j+1
achBoard[1][1不是“”
J=2,j<3,2=j+1
achBoard[1][2]不是“”
J=3,j=3
2=i+1
I=2
I<3
J=0,j<3,2=j+1
achBoard[2][0]不是“”
成立则往下,否则需要再次放棋子
J=1,j<3,2=j+1
achBoard[2][1]不是“”
J=2,j<3,2=j+1
achBoard[2][2]不是“”
成立则棋盘放满,平局,nDraw+1。
.
不成立则需要再次放入棋子
J=3,j=3
3=i+1
I=3
I=3
进入判断退出模块
表4-3判断平局步骤
IN
Y
JachBoard[i][j]!
=""
J++
Y
N
Y
N
平局
另一方下棋模块和判断输赢模块
图4-4判断平局流程图
退出模块
首先定义字符串strChoice,其次用输出流cout输出:
“是否继续”
最后当用输入流输入的strChoice是“Y”或者“y”的时候,重新开始一局棋,否则输出总结信息。
是否继续
strChoice=“Y”或者“y”
重新开始棋局
不符合以上
输出X赢nWin输nLose平nDraw
输出O赢nWin输nLose平nDraw
表4-5判断退出情况
图4-5判断退出N情况
5测试
测试方案
输入各种正确或错误在数据,观察各种数据时程序反映在结果。
测试结果
1.初始化棋盘:
x方下棋,请输入
图5-2初始化棋盘
2.输入棋子位子(正确的):
23
图5-3输入23棋盘
3.输入xy位子(错误――越界):
34
图5-4输入34棋盘
4.输入xy位子(错误――重复,不合理,此处已有棋子):
23
(当棋盘满了后,情景与这里一样)
图5-5输入23棋盘
方输入位子(正确):
32
图5-6输入32棋盘
6.X方输入位子(正确):
22
图5-7输入22棋盘
7.O方输入位子(正确):
33
图5-8输入33棋盘
8.X方输入位子(正确):
21
此时,系统判断出x方有三子连成一线,x方胜利!
并询问是否继续(Y/N)
图5-9输入21棋盘
9.输入Y则重新开始
图5-10输入Y棋盘
6小结
首先感谢王蓉老师对我们的教导,她对我完成这个实验提供了很多意见和建议,让我受益匪浅。
本次试验名为三子棋,其实验代码在类的定义和函数模块化方面非常值得学习,程序的功能分成几个模块,用各种定义参数传递,简显易懂。
程序的模块和注释都很明确,方便以后修改,利于其他人的阅读理解。
参考文献
[1]谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社,2005.
[2]谭浩强.C程序设计题解与上机指导(第三版)[M].北京:
清华大学出版社,2005.
附录
附录1源程序清单
#include
#include
usingnamespacestd;
classCGobang1步输入要下棋的格子的x,y坐标,按Enter键\n";
cout<<"\t2.有1方首先3个棋子连成一线即判获胜\n";
cout<<"\t3.当棋子布满棋盘但仍无获胜方即为平局\n";
cout<<"\方先行\n";
cout<<"\n\n\t\t请按任意键开始下棋!
\n\n";
}
intJudgePlay(CGobang&SideX,CGobang&SideO)//每下1步要进行输赢的判断,有结果则返回1
{
if())//X方获胜
{
();
();
return1;
}
elseif())//O方获胜
{
();
();
return1;
}
else
return0;
}
voidPlay(CGobang&SideX,CGobang&SideO)//开始一局游戏
{
while
(1)
{
CGobang:
:
PrintBoard();//输出棋盘
();//X方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break;
if(CGobang:
:
GetFull())//判断是否平局
{
CGobang:
:
Draw();
break;
}
CGobang:
:
PrintBoard();//输出棋盘
();//O方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break;
if(CGobang:
:
GetFull())//判断是否平局
{
CGobang:
:
Draw();
break;
}
}
}
intmain(void)
{
CGobangSideX('X'),SideO('O');//定义两个棋子类对象,分别代表X方与O方
PrintRule();
();
stringstrChoice;
do
{
CGobang:
:
InitialBoard();//初始化棋盘
Play(SideX,SideO);//开始下一局
cout<<"是否继续(Y/N)";
cin>>strChoice;
}while(strChoice=="Y"||strChoice=="y");
();
();
cout<<"\n\n\t欢迎再次使用三子连珠游戏!
"<return0;
}