五子棋C++实验报告.docx
《五子棋C++实验报告.docx》由会员分享,可在线阅读,更多相关《五子棋C++实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
![五子棋C++实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/27/2a4a38cc-67b1-491b-a350-2df93c3589f5/2a4a38cc-67b1-491b-a350-2df93c3589f51.gif)
五子棋C++实验报告
(此文档为word格式,下载后您可任意编辑修改!
)
一、需求分析
1.1开发背景
电脑游戏行业经过二十年的发展,已经成为与影视、音乐等并驾齐驱的全球最重要的娱乐产业之一,其年销售额超过好莱坞的全年收入。
互联网的出现为电脑游戏行业发展注入了新的活力,凭借信息双向交流、速度快、不受空间限制等优势,让真人参与游戏,提高了游戏的互动性、仿真性和竞技性,使玩家在虚拟世界里可以发挥现实世界无法展现的潜能,改变了单机版游戏固定、呆板、与机器对话的状况。
网络游戏的这些优势不仅使其在电脑游戏行业中异军突起并在某种程度上取代了单机版游戏,而且成为网络业三大(网上金融、网上教育和网络游戏)赢利且利润优厚的领域之一。
网络作为一种新兴的传播方式,主要包括三大内容:
娱乐、资讯、通讯。
提到网络娱乐,过去主要指的是单机版游戏,没有引入网络的概念但随着科技的发展,游戏娱乐产业也在成长目前,国内的游戏娱乐产业正处于起步阶段,特点表现为:
第一,它是一种文化的传播。
娱乐产业可以潜移默化地改变人的观念,当前,很多多媒体的播放已被电脑网络所取代。
第二,网络游戏加强了人与人的沟通。
第三,网络游戏具有一定的教育意义。
网络游戏所具有的角色扮演的功能,使得玩家能通过互助更好地完成游戏中的各项任务。
网络无国界,游戏在网络文化产业世界的发展中地位会越来越高。
目前在国外,休闲游戏如棋类等,玩家的年龄跨度非常大,这和我国目前网游市场以青少年为主要消费人群的状况截然不同。
其实,网络可以解决空间的问题,网络和生活越来越息息相关,因此,开辟适合各个年龄层的游戏产品迫在眉睫。
同时,这也涉及到一个企业开发的能力。
娱乐产业发展到一定程度,通过不断锻炼和经验的积累,完全可以通过融入娱乐的成分把教条的东西深入浅出地展现给消费者。
就国内的发展来看,最近這两三年内国内的游戏公司如雨后春笋般的成立,所开发或代理的网络游戏更是不胜枚举。
以全球游戏业界的发展来看,這几年韩国的表现最为突出,特別是在网络游戏的技术研发兴游戏制作,其所发行的网络游戏更成为全球游戏产业重要的指标之一。
去年在美国洛杉矶所举行的E3(ElectronicEntertainmentExposition)展中,已经有几家的韩国厂商挤入世界第一线的游戏开发厂商之列。
近几年来,由于3D硬体绘图技术的突破,使得即时描绘的书面越来越精致,而且3D遊戏性更多元化更逼近真实世界,因此在遊戏产业中,3D游戏已经逐渐取代2D游戏为游戏市场的主流,即使是网络游戏,也慢慢趋向3D化。
然而游戏3D化将会带来的游戏开发上的困难等问题,这些问题以后都需要逐步解决。
人们面对电脑的时间越来越多,面对身边的人的时间越来越少,所以我们游戏所要达到的目的就是加大人们之间的沟通,让大家随时随地都可以体验到玩游戏的乐趣。
而三子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。
同样的,通过这个游戏,既能在休闲时刻娱乐一下,也能在压力面临的时候放松一刻。
1.2项目目标
开发一个三子棋游戏。
该游戏基于DOS实现,其功能可概括为:
一:
玩家可以设定游戏的玩法,即在游戏开始时输入变量,决定选用三子棋或者四子棋;
二:
玩家可以设置期盼的大小,即在游戏开始时输入一变量n(n=3~9),使棋盘的大小为n*n。
;
三:
加入可以悔棋功能,要求任意方可以在对方下去后修改一步,即将对方当前步和本方上一步删除,本方重新下棋。
;
四:
下棋方法使用输入棋盘坐标,棋盘在每次下棋后刷新屏幕。
1.3运行环境
软件:
运行在Windows软件环境下;
硬件:
具有网络连接设备的PC机或笔记本电脑;最低配置:
要求内存大于128M,硬盘大于1G。
本系统的设计是在Windows7RTM7600.16385(X86)中文旗舰版操作系统环境下,使用MicrosoftVisualC++6.0中文版开发成功的。
由于VisualC++6.0在不牺牲灵活性、性能和控制力度的同时,给C++带来更高水平的生产效率。
除了IntelliSenseTechnology(智能感应技术)和EditandContinue(即编即调)等显著缩短开发时间的新特性外,VisualC++6.0还为Web开发和企业开发提供更良好的支持。
面向对象的程序设计
MicrosoftVisualC++6.0支持面向对象的程序设计,但它与一般的面向对象的程序设计语言(C++)不完全相同。
在一般的面向对象程序设计语言中,对象由程序代码和数据组成,是抽象的概念;而MicrosoftVisualC++6.0则是应用面向对象的程序设计方法,把程序和数据封装起来作为一个对象,并为每个对象赋予应有的属性,使对象成为实在的东西。
在设计对象时,不必编写建立和描述每个对象的程序代码,而是用工具画在界面上,MicrosoftVisualC++6.0自动生成对象的程序代码并封装起来。
每个对象以图形方式显示在界面上,都是可视的。
二、程序分析
2.1函数分析
主函数:
voidmain()连珠游戏主界面,显示两个选项:
A:
三子棋、B:
四子棋;采用
do(){
}while()语句实现;
类:
在public中包含一个构造函数,两个输出棋盘函数分别为print1()、print2(),一个三子棋游戏的函数(Three()),一个四子棋游戏的函数(Four()),同时还有游戏四个判断胜利的函数、悔棋函数,和获取游戏结果的函数;
头文件:
将类定义在名为Game一个头文件中,同时对类中的各个函数定义、初始化。
2.2程序流程图
三、技术路线
3.1总体方案
3.1.1采用的软件及开发平台
在Windows7的环境下,采用的是Microsoft公司的VisualC++作为开发平台。
利用面向对象的思想实现一个连珠游戏系统,具体使用了:
体现OOP的抽象、封装、多态3种关键技术,构造了基于Game的游戏系统,从而实现游戏的各种功能。
3.1.2总体方案
先设计一个基本构架,然后往函数中逐步添加相应的子函数,一步步完善功能;
3.2详细设计
1.设置一个类Game();
2.我们可以在此基础之上为类添加相应功能函数,如judge1()、regret()等函数;
3.Three()或者Four()函数调用相应的功能函数,来实现游戏的对局;
4.主函数中启用输入选项,若是选择三子棋,则调用Game类中Three()函数;如果选择四子棋,则调用Game类中Four()函数;
5.进入相应的游戏玩法,可以查看对应的游戏帮助;
6.游戏中途,可以选择悔棋,悔棋时,只要输入玩家想要悔棋的坐标即可;
7.游戏结束后,统计游戏结果,并输出。
类说明:
classGame{
public:
Game(intM);
voidprint1();输出棋盘
(1)
voidprint2();输出棋盘
(2)
voidThree();三子棋双人对战
voidFour();四子棋双人对战
intjudge1(int,int);判断三子棋中玩家1胜利
intjudge2(int,int);判断三子棋中玩家2胜利
intjudge3(int,int);判断四子棋中玩家1胜利
intjudge4(int,int);判断四子棋中玩家2胜利
voidregret(int,int);悔棋
staticintGetX(){获取X的值
returnX;
}
staticintGetY(){获取Y的值
returnY;
}
private:
intN;
staticintX;记录玩家一赢的次数
staticintY;记录玩家二赢的次数
chargame[10][10];
};
intGame:
:
X=0;
intGame:
:
Y=0;
其中,“Game”类直接定义在“Game.StroustrupC++程序设计语言,高等教育出版社
李春葆等数据结构教程(第三版),清华大学出版社
万常选舒蔚等C语言与程序设计方法,科学出版社
张军等VisualC++实例精通,机械工业出版社
王艳萍Windows程序设计,人民邮电出版社
附录
源程序代码
类的定义:
classGame{
public:
Game(intM);
voidprint1();输出棋盘
(1)
voidprint2();输出棋盘
(2)
voidThree();三子棋双人对战
voidFour();四子棋双人对战
intGetFull(int,int);判断棋盘是否布满棋子
intjudge1(int,int);判断三子棋中玩家1胜利
intjudge2(int,int);判断三子棋中玩家2胜利
intjudge3(int,int);判断四子棋中玩家1胜利
intjudge4(int,int);判断四子棋中玩家2胜利
voidregret(int,int);悔棋
staticintGetX(){
returnX;
}
staticintGetY(){
returnY;
}
private:
intN;
staticintX;记录玩家一赢的次数
staticintY;记录玩家二赢的次数
chargame[10][10];
};
静态变量的初始化:
intGame:
:
X=0;
intGame:
:
Y=0;
“Game.X;
}
staticintGetY(){
returnY;
}
private:
intN;
staticintX;记录玩家一赢的次数
staticintY;记录玩家二赢的次数
chargame[10][10];
};
intGame:
:
X=0;
intGame:
:
Y=0;
voidGame:
:
print1(){输出棋盘
(1)
inti,j;
cout<<"";
for(i=1;icout<<""<
cout<for(i=0;ifor(j=0;j<=N;j++){
if(j==0)
cout<
else
cout<<".";
}
cout<}
}
voidGame:
:
print2(){输出棋盘
(2)
inti,j;
cout<<"";
for(i=1;icout<<""<
cout<for(i=1;ifor(j=0;j<=N;j++){
if(j==0)
cout<
elseif(game[i][j]=='O')
cout<<"O";
elseif(game[i][j]=='X')
cout<<"X";
else
cout<<".";
}
cout<}
}
voidGame:
:
regret(inta,intb){悔棋
game[a][b]='0';
}
intGame:
:
judge1(inta,intb){三子棋中判断玩家1胜利
if((game[a][b-1]=='O'&&game[a][b+1]=='O')||(game[a][b-1]=='O'&&game[a][b-2]=='O')||(game[a][b+1]=='O'&&game[a][b+2]=='O'))
return1;判断该行是否满足条件
elseif((game[a+1][b]=='O'&&game[a-1][b]=='O')||(game[a+1][b]=='O'&&game[a+2][b]=='O')||(game[a-1][b]=='O'&&game[a-2][b]=='O'))
return1;判断某该列是否满足条件
elseif((game[a+1][b+1]=='O'&&game[a-1][b-1]=='O')||(game[a+1][b+1]=='O'&&game[a+2][b+2]=='O')||(game[a-2][b-2]=='O'&&game[a-1][b-1]=='O'))
return1;判断该正斜列是否满足条件
elseif((game[a+1][b-1]=='O'&&game[a-1][b+1]=='O')||(game[a+1][b-1]=='O'&&game[a+2][b-2]=='O')||(game[a-2][b+2]=='O'&&game[a-1][b+1]=='O'))
return1;判断该反斜列是否满足条件
else
return0;
}
intGame:
:
judge2(inta,intb){三子棋中判断玩家2胜利
if((game[a][b-1]=='X'&&game[a][b+1]=='X')||(game[a][b-1]=='X'&&game[a][b-2]=='X')||(game[a][b+1]=='X'&&game[a][b+2]=='X'))
return1;
elseif((game[a+1][b]=='X'&&game[a-1][b]=='X')||(game[a+1][b]=='X'&&game[a+2][b]=='X')||(game[a-1][b]=='X'&&game[a-2][b]=='X'))
return1;
elseif((game[a+1][b+1]=='X'&&game[a-1][b-1]=='X')||(game[a+1][b+1]=='X'&&game[a+2][b+2]=='X')||(game[a-2][b-2]=='X'&&game[a-1][b-1]=='X'))
return1;
elseif((game[a+1][b-1]=='X'&&game[a-1][b+1]=='X')||(game[a+1][b-1]=='X'&&game[a+2][b-2]=='X')||(game[a-2][b+2]=='X'&&game[a-1][b+1]=='X'))
return1;
else
return0;
}
voidGame:
:
Three(){三子棋
intf=0;判断玩家
intp1,p2;下棋坐标
print1();
for(;;){
if(f==0){
cout<<"请玩家一输入下棋坐标(玩家二要悔棋请输入两个0)"<cin>>p1>>p2;
if(p1==0&&p2==0){
cout<<"请输入要悔棋的坐标"<cin>>p1>>p2;
if(game[p1][p2]!
='X'){
cout<<"输入有误"<continue;
}
regret(p1,p2);
}
elseif(game[p1][p2]!
='0'){
cout<<"输入有误"<continue;
}
elseif(p1>=1&&p1<=9&&p2>=1&&p2<=9){
game[p1][p2]='O';
system("cls");
}
else{
cout<<"输入坐标有误,请重输入"<continue;
}
if(judge1(p1,p2)==1){
system("cls");
print2();
cout<<"玩家一胜利!
"<X++;
break;
}
print2();
f=1;
}
elseif(f==1){
cout<<"请玩家二输入下棋坐标(玩家一要悔棋请输入两个0)"<cin>>p1>>p2;
if(p1==0&&p2==0){
cout<<"请输入要悔棋的坐标"<cin>>p1>>p2;
if(game[p1][p2]!
='O'){
cout<<"输入有误"<continue;
}
regret(p1,p2);
}
elseif(game[p1][p2]!
='0'){
cout<<"输入有误"<continue;
}
elseif(p1>=1&&p1<=9&&p2>=1&&p2<=9){
game[p1][p2]='X';
system("cls");
}
else{
cout<<"输入坐标有误,请重输"<continue;
}
if(judge2(p1,p2)==1){
system("cls");
print2();
cout<<"玩家二胜利!
"<Y++;
break;
}
print2();
f=0;
}
else
cout<<"输入有误,请重输"<}
}
intGame:
:
judge3(inta,intb){四子棋中玩家一胜利判断条件
if(((game[a][b-3]=='O')&&(game[a][b-2]=='O')&&(game[a][b-1]=='O'))||((game[a][b-1]=='O')&&(game[a][b+1]=='O')&&(game[a][b+2]=='O'))||
((game[a][b+3]=='O')&&(game[a][b+2]=='O')&&(game[a][b+1]=='O'))||((game[a][b-2]=='O')&&(game[a][b-1]=='O')&&(game[a][b+1]=='O')))
return1;判断某一行存在4子练成一条线
elseif(((game[a-3][b]=='O')&&(game[a-2][b]=='O')&&(game[a-1][b]=='O'))||((game[a-1][b]=='O')&&(game[a+1][b]=='O')&&(game[a+2][b]=='O'))||
((game[a-1][b-1]=='O')&&(game[a+1][b+1]=='O')&&(game[a+2][b+2]=='O'))||((game[a+1][b+1]=='O')&&(game[a+2][b+2]=='O')&&(game[a+3][b+3]=='O')))
return1;判断某一列存在4子练成一条线
elseif(((game[a-3][b-3]=='O')&&(game[a-2][b-2]=='O')&&(game[a-1][b-1]=='O'))||((game[a+1][b+1]=='O')&&(game[a-1][b-1]=='O')&&(game[a-2][b-2]=='O'))||
((game[a][b+3]=='O')&&(game[a][b+2]=='O')&&(game[a][b+1]=='O'))||((game[a][b-2]=='O')&&(game[a][b-1]=='O')&&(game[a][b+1]=='O')))
return1;判断正斜列存在4子练成一条线
elseif(((game[a-1][b+1]=='O')&&(game[a-2][b+2]=='O')&&(game[a-3][b+3]=='O'))||((game[a+1][b-1]=='O')&&(game[a-1][b+1]=='O')&&(game[a-2][b+2]=='O'))||
((game[a+2][b-2]=='O')&&(game[a+1][b-1]=='O')&&(game[a-1][b+1]=='O'))||((game[a+3][b-3]=='O')&&(game[a+2][b-2]=='O')&&(game[a+1][b-1]=='O')))
return1;判断反斜列存在4子练成一条线
else
return0;
}
intGame:
:
judge4(inta,intb){四子棋中玩家二胜利判断条件
if(((game[a][b-3]=='X')&&(game[a][b-2]=='X')&&(game[a][b-1]=='X'))||((game[a][b-1]=='X')&&(game[a][b+1]=='X')&&(game[a][b+2]=='X'))||
((game[a][b+3]=='X')&&(game[a][b+2]=='X')&&(game[a][b+1]=='X'))||((game[a][b-2]=='X')&&(game[a][b-1]=='X')&&(game[a][b+1]=='X')))
return1;判断某一行存在4子练成一条线
elseif(((game[a-3][b]=='X')&&(game[a-2][b]=='X')&&(game[a-1][b]=='X'))||((game[a-1][b]=='X')&&(game[a+1][b]=='X')&&(game[a+2][b]=='X'))||
((game[a-1][b-1]=='X')&&(game[a+1][b+1]=='X')&&(game[a+2][b+2]=='X'))||((game[a+1][b+1]=='X')&&(game[a+2][b+2]=='X')&&(game[a+3][b+3]=='X')))
return1;判断某一列存在4子练成一条线
elseif(((game[a-3][b-3]=='X')&&(game[a-2][b-2]=='X')&&(game[a-1][b-1]=='X'))||((game[a+1][b+1]=='X')&&(game[a-1][b-1]=='X')&&(game[a-2][b-2]=='X'))||
((game[a][b+3]=='X')&&(game[a][b+2]=='X')&&(game[a][b+1]=='X'))||((game[a][b-2]=='X')&&(game[a][b-1]=='X')&&(game[a][b+1]=='X