C++五子棋游戏程序设计
一、课设内容
1. 掌握C++基本编程风格。
2. 编写程序代码,实现各个模块的功能。
3. 完成小型游戏应用系统的设计开发.
4. 关键语句写注释。
5. 测试程序,写出测试报告。
6. 在实验报告写出综合设计心得。
二、实验内容
在此次大作业中,我学习设计一个五子棋游戏的程序,源代码及分析如下:
#include<iostream.h>
#include<iomanip.h>
void shuchu(char a[15][15])
{
int x,y,i;
cout<<" ";
for(i=0;i<15;i++)
cout<<setw(3)<<i;
cout<<endl;
for(x=0;x<15;x++)
{
cout<<setw(2)<<x;
for(y=0;y<15;y++)
cout<<setw(3)<<a[x][y];
cout<<endl;
}
}
bool osheng(char a[15][15])
{
int x,y;
for(x=0;x<15;x++)
for(y=0;y<11;y++)
if(a[x][y]=='o'&&a[x][y+1]=='o'&&a[x][y+2]=='o'&&a[x][y+3]=='o'&&a[x][y+4]=='o')
return 1;
for(x=0;x<11;x++)
for(y=0;y<15;y++)
if(a[x][y]=='o'&&a[x+1][y]=='o'&&a[x+2][y]=='o'&&a[x+3][y]=='o'&&a[x+4][y]=='o')
return 1;
for(x=0;x<11;x++)
for(y=0;y<11;y++)
if(a[x][y]=='o'&&a[x+1][y+1]=='o'&&a[x+2][y+2]=='o'&&a[x+3][y+3]=='o'&&a[x+4][y+4]=='o')
return 1;
for(x=15;x>4;x--)
return 0;
}
bool xsheng(char a[15][15])
{
int x,y;
for(x=0;x<15;x++)
for(y=0;y<11;y++)
if(a[x][y]=='x'&&a[x][y+1]=='x'&&a[x][y+2]=='x'&&a[x][y+3]=='x'&&a[x][y+4]=='x')
return 1;
for(x=0;x<11;x++)
for(y=0;y<15;y++)
if(a[x][y]=='x'&&a[x+1][y]=='x'&&a[x+2][y]=='x'&&a[x+3][y]=='x'&&a[x+4][y]=='x')
return 1;
for(x=0;x<11;x++)
for(y=0;y<11;y++)
if(a[x][y]=='x'&&a[x+1][y+1]=='x'&&a[x+2][y+2]=='x'&&a[x+3][y+3]=='x'&&a[x+4][y+4]=='x')
return 1;
for(x=15;x>4;x--)
for(y=15;y>4;y--)
if(a[x][y]=='x'&&a[x+1][y-1]=='x'&&a[x+2][y-2]=='x'&&a[x+3][y-3]=='x'&&a[x-4][y+4]=='x')
return 1;
return 0;
}
bool he(char a[15][15])
{
int x,y;
for(x=0;x<15;x++)
for(y=0;y<15;y++)
if(a[x][y]=='-')
return 0;
return 1;
}
void main()
{
int x,y,s,q;
char a[15][15];
for(x=0;x<15;x++)
for(y=0;y<15;y++)
cin>>q;
if(q==1)
goto two;
/* else
goto one; */
two:
cout<<"请选择是否进入悔棋模式:1.是;2.否\n";
cin>>q;
if(q==2)
goto three;
shuchu(a);
while(1)
{
s: while(1)
{
cout<<"请玩家1输入下子的坐标"<<endl;
cin>>x>>y;
if(a[x][y]=='o'||a[x][y]=='x')
cout<<"此处已经有字,请重下"<<endl;
else
{
a[x][y]='o';
break;
}
}
shuchu(a);
cout<<"是否需要悔棋?是 请输入:1;否 请输入:0"<<endl;
cin>>s;
switch(s)
{
case 1:
a[x][y]='-';
goto s;
break;
case 0:
goto s1;
break;
}
s1: if(osheng(a))
{
cout<<"玩家1胜";
break;
}
s2: while(1)
{
cout<<"请玩家2输入下子的坐标"<<endl;
cin>>x>>y;
if(a[x][y]=='o'||a[x][y]=='x')
cout<<"此处已经有字,请重下"<<endl;
else
{
a[x][y]='x';
break;
}
}
shuchu(a);
cout<<"是否需要悔棋?是 请输入:1;否 请输入:0"<<endl;
cin>>s;
switch(s)
{
case 1:
a[x][y]='-';
goto s2;
break;
case 0:
goto s3;
break;
}
s3: if(xsheng(a))
{
cout<<"玩家2胜";
if(he(a))
{
cout<<"平局";
break;
}
}
three: shuchu(a);
while(1)
{
while(1)
{
cout<<"请玩家1输入下子的坐标"<<endl;
cin>>x>>y;
if(a[x][y]=='o'||a[x][y]=='x')
cout<<"此处已经有字,请重下"<<endl;
else
{
a[x][y]='o';
break;
}
}
shuchu(a);
if(osheng(a))
{
cout<<"玩家1胜";
break;
}
}
shuchu(a);
if(xsheng(a))
{
cout<<"玩家2胜";
break;
}
if(he(a))
{
cout<<"平局";
break;
}
}
}
三、感想体会
本实验是用C++来设计完成了五子棋游戏。在起初学习C++语言时我认为它就是在C语言基础上的延伸,一直用C语言的编程思想和设计理念来学习C++,这种错误的思想也让我在学习C++时走了不少的弯路,转变思想后我更认真的学习了C++语言的语法、程序结构、各类语句、函数格式和调用方式、作用域及存储类等内容。
在仅一遍学习的基础上来学习设计游戏程序让我遇到了第一个难题,就是对知识点的掌握不够扎实,在用C++语言所支持的面向对象程序设计方法的内容时让我很被动,尤其是类和对象的复制和运算、集成性和派生类、多态性和虚函数等内容。在这次做大作业时让我系统的复习了所学的知识,让我认识到利用类和对象可以将程序中很复杂和重复的内容省掉,同时可以将用以前所学语言设计的程序变的更简单。
当然在程序学习过程中遇到的一些复杂程序仅靠书本上的知识是不够解决的,因此通过在网上查找资料,跟同学交流心得过程中也学到了很多。在这次做大作业学习编写五子棋游戏的过程中让我领略到了C++语言的魅力和精髓,在以后的编程过程中会更熟练的运用C++语言,吸取了这次的经验后,在下次运用C++时会更全面的考虑问题,使用更正确的方法来解决问题,这次学习C++让我受益匪浅,最后感谢老师的悉心教导,老师辛苦了!
第二篇:基于C语言的五子棋游戏程序设计
·
月201210年4月
第164卷第2期
·
宁波职业技术学院学报
JournalofNingboPolytechnic
Apr,201210Vol.164No.No.22
基于C语言的五子棋游戏程序设计
陈慧杰,郭占祥
(内蒙古民族大学计算机科学与技术学院,内蒙古通辽
摘
028043)
要:为了设计人人对弈模式的五子棋游戏系统,采用了C语言函数模块化程序设计方法,利用Visual
C++6.0编译器运行游戏,实现一方执白棋,一方执黑棋,通过屏幕上的文字提示,轮流走棋,最先使五子相连
一方获胜的人人对弈功能。同时,也对其他游戏系统的开发设计具有一定的借鉴作用。
关键词:五子棋;C语言;人人对弈中图分类号:TP312
文献标识码:A
文章编号:1671-2153(2012)02-0041-04
0引言
VisualC++6.0是一个集面向过程与面向对
开始
象为一体的开发工具,本游戏以VisualC++6.0为工具,以#include<stdio.h>为头文件展开游戏的设计,以函数模块化的思想进行设计,思路清晰,可操作性强。另外,该游戏在WindowsXP及
欢迎界面信息
显示棋盘10*10
Player1先下
Windows7等操作系统环境下均可运行,兼容性强。
本设计重点从函数模块化方面进行研究。
显示棋子位置,Player1为空心子○,
Player2为实心子●
1设计流程图
五子棋设计主要由“欢迎界面模块”、“初始化
换玩家下棋
模块”、“下棋操作模块”、“判断胜负模块”和“游戏结束模块”共5个模块组成。“欢迎界面模块”实现在游戏开始时出现一个欢迎界面,同时介绍游戏规则的功能;“初始化模块”实现画出棋盘大小,并可输入棋子功能;“下棋操作模块”主要实现判断键盘输入哪个键并执行操作,包括玩家Player1先落棋,玩家Player2后落棋及玩家轮流下棋的功能;“判断胜负模块”实现判断五子连棋为赢家的功能;“游戏结束模块”实现退出游戏功能。具体流程如图1所示。
五子连成一线?
NY
下满棋盘?
N
结束游戏
Y和棋
图1五子棋游戏流程
收稿日期:2011-11-29
作者简介:陈慧杰(1964-),女,内蒙古通辽人,副教授,硕士,从事计算机应用研究。
20xx年第2期
宁波职业技术学院学报E-mail:nbtpxb@163.com
2主要功能模块设计
本游戏设计主要利用函数模块化设计思想,
通过主函数调用各个自定义函数完成游戏的运行。以下为主函数和各自定义函数功能的设计及其运行结果。
2.1欢迎界面voidwelcome()函数设计欢迎界面函数的设计以格式化输出函数为核
心,介绍了游戏规则,同时也展现了友好的游戏界面,其主要代码为
/*********欢迎界面*******/
voidwelcome(){printf("**********\n");printf("制作人:10计汉(1)班:郭占祥。\n");printf("Welcome!!!\n");printf("输入你所下棋
子的行数和列数,并分别通过enter键来确定
图3
棋盘初始化输出显示
列数实现下棋操作,其核心代码为[1]:
\n");printf("通过backspace键来悔棋\n");printf
("**********\n");}
其运行结果如图2所示。
/*********显示棋子********/voidchess(intp)
{inti,j,k,m;inta[N*N],b[N*N];for(i=1;i<=N*N;i++)
a[i]=weizhi[i].x[i];b[i]=weizhi[i].y[i];}
for(m=1;m<p;m++)
{while(weizhi[p].x[p]==a[m]&&weizhi[p].y[p]==b[m])
{printf("error!\n");weizhi[p].x[p]=zouqihang();weizhi[p].y[p]=zouqilie();m=1;}}
下面通过调用循环语句实现再一次初始化棋盘:
图2欢迎界面输出显示
2.2初始化棋盘voidinitialization()函数设计初始化棋盘函数设置坐标为10×10,也可以根
for(i=0;i<N;i++){printf("%2d",i);printf
("");}printf("\n");
据需求适当修改棋盘大小方便下棋,以“.”代替直线画出棋盘,通过循环语句实现棋盘显示功能,并且分别赋予其横纵坐标,为走棋奠定基础,其主要代码有:
for(i=1;i<N;i++){for(j=1;j<N;j++)
{if(j==1)printf("%2d",i);for(k=1;k<=p;k++){if(i==weizhi[k].x[k]&&j==weizhi[k].y[k])
{if(k%2==1){printf("○");break;}elseif(k%2==0){printf("●");break;}}}
if(k>p)printf("·");elsecontinue;}printf("\n");}}
实现横坐标输入核心代码:
/**********初始化棋盘********/voidinitialization()
{inti,j;for(i=0;i<N;i++)
{printf("%2d",i);printf("");}printf("\n");for(i=1;i<N;i++){for(j=0;j<N;j++)
{if(j==0)printf("%2d",i);elseprintf("·");}printf("\n");}}
其运行结果如图3所示。
2.3下棋操作voidchess(intp)函数设计
通过以上初始化棋盘函数的设计,可以确定输入棋子的位置和状态,再利用循环语句重新调用初始化棋盘,实现下棋操作,然后输入相应的行
intzouqihang()
{intx;printf("请输入要走棋子所在行数!\n");printf("x=");
scanf("%d",&x);while(x>N-1||x<1)
{printf("error!\n");printf("请输入要走棋子所在行数!\n");
printf("x=");scanf("%d",&x);}returnx;}
··
20xx年第2期
·
陈慧杰等:基于C语言的五子棋游戏程序设计
·
同理,可以自定义相应的纵坐标输入函数(int
elseif(i%2==1){for(j=1;j<=p;j=j+1){if((a[i]==a[j]-1)&&(b[i]==b[j]-1)){k[4]++;continue;}elseif((a[i]==a[j]-2)&&(b[i]==b[j]-2)){k[4]++;continue;}elseif((a[i]==a[j]-3)&&(b[i]==b[j]-3))
{k[4]++;continue;}elseif((a[i]==a[j]-4)&&(b[i]==b[j]-4)){k[4]++;continue;}
elseif(k[4]==5)\n");}
而左上右下方向只需设定其横坐标分别增加
zouqilie()),实现纵坐标的输入。
以输入第4行第5列为例,其运行结果如图4
所示。
{printf("Player1wins!!!
1,2,3,4的同时纵坐标分别减少1,2,3,4;数组元素
的值同时逐个自增1,直至增到5,即可实现五子相连,则该方棋子胜出。运行结果如图5所示。
图4下棋操作显示
2.4判断是否胜出voidjudge(intp)函数设计
Voidjudge(intp)函数的设计,灵活运用了数
组元素来存储四种不同方向连成五子的数据,根据每次落子的位置,分别从行、列、右上左下、左上右下四个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:
Player1wins!!!),否则继续落子[2]。
下面就以判断行五子相连为例,说明程序的执行过程:先把数组的值初始化为“1”,即k[8]=
图5
判断胜负显示
{1,1,1,1,1,1,1,1,},再设定棋子的横坐标相等,纵坐标相差的值可以为1,2,3,4;数组元素的值也
逐个自增1,直至增加到5,则该方棋子胜出,其核心代码为:
2.5“和棋”结束游戏函数设计
如果在双方交替下满整个棋盘时,游戏还未
决出胜负,则游戏自动以和棋来结束整个游戏,直接输出printf("drawinchess!!!\n"),否则输出
{if((a[i]==a[j]-1)&&(b[i]==b[j]))k[0]++;elseif
((a[i]==a[j]-2)&&(b[i]==b[j]))k[0]++;
printf("gameover!!!\n")即可实现。
此外,在设计时还运用了一些背景功能函数,如,system("color1f")等函数,使背景颜色呈现为蓝色,也可根据喜好改变1f参数来改变不同背景颜色。例如2f呈现绿色,4f呈现红色等背景颜色;使用标题函数system("title开心五子棋!"),来显示标题,只需在头文件中加入#include<iostream>即可实现这些功能[4]。
elseif((a[i]==a[j]-3)&&(b[i]==b[j]))k[0]++;elseif((a[i]==a[j]-4)&&(b[i]==b[j]))k[0]++;elseif
(k[0]==5){printf("Player1wins!!!\n");break;}
同理,判断列五子相连,需要先设定其纵坐标相等,横坐标相差的值为1,2,3,4;数组元素的值同时逐个自增1,直至增到5,则该方棋子胜出。
而判断右上左下方向五子相连,即胜出,可以设定其横纵坐标同时分别相差1,2,3,4;数组元素的值也逐个自增1,直到增加为5,则显示该方棋子胜出,具体代码如下:
[3]
3结束语
五子棋游戏的设计主要应用C语言中函数模
块化设计思想,灵活运用自定义函数的调用,简洁大方,可玩性强,对其他游戏的开发与设计有一定借鉴作用。
for(i=1;i<=p;i++){if(k[0]==5||k[1]==5||k[2]==5||k[3]==5)break;
20xx年第2期
宁波职业技术学院学报E-mail:nbtpxb@163.com
2010:20-27.
[3]董红安.计算机五子棋博奕系统的研究与实现[D].山
东师范大学,2005:11-15.参考文献:[1]谭浩强.C程序设计[M].北京:清华大学出版社,2000:
122-128.
[2]姜勇.五子棋人机对战系统设计[D].电子科技大学,[4]朱全民,陈松乔.五子棋算法的研究与思考[J].计算技
术与自动化,2006(2):71-74.
DesignofGobanggamebyusingCprogramminglanguage
CHENHui-jie,GUOZhan-xiang
(CollegeofComputerScienceandTechnology,InnerMongoliaUniversityforNationalities,
Tongliao028043,China)
Abstract:Inordertodesignaplayers`gobangsystem,theauthorappliesClanguagefunctionmodularprogrammingmethodflexibly.Atthesametime,theVisualC++6.0compilerisusedforthepurposeofrunningthegame.Inthegame,oneexecuteswhitepiecewhileanotherblackpiece.Moreoverbothsidestrytowin,whichmeansonesidemakesfivepieceslinktogetherbeforethegameover.Simultaneouslybothsidescanplaythegameinturnthroughtextremindinginthescreen.Furthermorethedesignofgobanggameisofreferencevaluetoexploitothergames.
Keywords:Gobanggame;Cprogramminglanguage;playersgame
(上接第37页)
[8]肖智,胡蓓.软集合在商业银行客户价值评价中的应
用[J].金融论坛,2010(10):36-42.数约简[J].系统工程学报,2009,24(4):457-461.[10]丁淑妍,齐淑华.软件质量评价中指标权重的确定方
法[J].大连民族学院学报,2007,36(1):82-84.[9]邹艳,肖智,龚科.基于最优选择对象不变的软集合参
Softwarequalityevaluationbasedonthesoftset
LINJian-hua
(ZhejiangXinchangRuralCoopBank,Shaoxing312500,China)
Abstract:Softwarequalityisinfluencedbymanyfactors.Therefore,itisratherdifficulttoevaluatesoftwarequalityaccurately.Inthispaper,anewqualityevaluationmethodofsoftwarebasedonthesoftsettheoryisproposed,whichenablespeopletoevaluatemoreobjectively,scientificlyandreasonably.Theexampleprovestheobjectivityandtheusabilityofthisnewmodel.
Keywords:softset;Softwarequality;evaluation
··20xx年第2期