五子棋c++课程设计.docx

上传人:b****8 文档编号:30168517 上传时间:2023-08-05 格式:DOCX 页数:28 大小:250.79KB
下载 相关 举报
五子棋c++课程设计.docx_第1页
第1页 / 共28页
五子棋c++课程设计.docx_第2页
第2页 / 共28页
五子棋c++课程设计.docx_第3页
第3页 / 共28页
五子棋c++课程设计.docx_第4页
第4页 / 共28页
五子棋c++课程设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

五子棋c++课程设计.docx

《五子棋c++课程设计.docx》由会员分享,可在线阅读,更多相关《五子棋c++课程设计.docx(28页珍藏版)》请在冰豆网上搜索。

五子棋c++课程设计.docx

五子棋c++课程设计

第一章:

课程设计目的和要求·······················2

1.1数据结构课程设计的目的··························2

1.2数据结构课程设计实现的要求······················2

第二章:

课程设计任务内容·························3

2.1五子棋对弈系统···································3

第三章:

详细设计说明·····························4

3.1功能设计········································4

3.2五子棋对弈系统流程图······························4

3.3软件中实现各项功能的函数与程序代码········5

第四章:

程序运行环境说明··························10

4.1程序运行环境说明及出现的问题·····················10

4.2运行结果·········································10

第五章:

课程设计心得与体会····················14

附录········································15

源程序:

·····································16

 

 

五子棋

第一章 课程设计目的和要求

1.1数据结构课程设计的目的

进一步培养结构化程序设计的思想,加深对高级系统语言基本语言要素和控制结构的理解,针对数据结构中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。

要求熟悉运用一些编程软件,对我们所学的理论知识进一步的深化。

1.2数据结构课程设计实现的要求

使用C++语言编写一个基于控制台的简单程序,使学生掌握简单的程序设计技巧。

同时设计一个简单的五子棋对弈系统,可以实现五子棋的基本功能,是一款娱乐用的小型程序。

 

第二章 课程设计任务内容

2.1五子棋对弈系统

设计一个五子棋系统程序,实现对五子棋进行运行。

基本要求:

五子棋是有两个人在一盘棋上进行对抗的竞技活动。

在对局开始时,先由用户选择哪方开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围交叉点上落子,如此轮流落子,知道某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方程就算获胜。

此时算法结束,当有任何一方退时出,都可在算法中实现。

 

第三章详细设计说明

3.1功能设计

(1)由两个玩家分别下棋,当某一玩家五子相连,则赢。

(2)界面要求:

初始状态——显示棋盘,并显示两个玩家的操作键及初始玩家名称;游戏进行状态——动态显示棋盘,不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家名称。

3.2五子棋对弈系统流程图

 

 

图3-1程序总体图

 

 

图3-2算法流程图

3.3软件中实现各项功能的函数与程序代码

主要函数、结构体和链表

Inta;//纪录坐标位置

Intb;//纪录坐标位置

CharachBoard[i][j],//用于在【a】【b】处落子

chSort;;//棋子的类别

IntnWin////赢棋的次数

类的使用:

classCGobang

{private:

charchSort;//棋子的类别

intnWin;//赢棋的次数

intnLose;//输棋的次数

staticintnDraw;//平局次数

public:

staticcharachBoard[19][19];//棋盘

staticintnSize;//棋盘的尺寸nSize*nSize

CGobang(charchsort)//构造函数,决定一方棋子的类别

{

chSort=chsort;

nWin=nLose=nDraw=0;

}

friendvoidhuiqi();//悔棋

staticvoidsavefile();//将棋盘保存至文件

staticvoidreadBoard();//从文件中读入棋盘

voidcontinute();//接着上次的游戏玩

voidPlayTurn(void);//走一步棋

intJudge();//判断是否连成五子,是则返回1

voidWin(void);//赢棋

voidLose(void);//输棋

staticvoidDraw(void);//平局

voidPrintInfo(void);//打印总体情况

staticvoidPrintBoard(void);//输出棋盘

staticintGetFull(void);//判断棋盘是否一满

staticvoidInitialBoard(void);//初始化棋盘

};}

本次程序设计主要设计了五个模块

1.绘制棋盘模块

当游戏初始化时,和每当落子消息触发时,都需要对棋盘进行重绘。

这里用特殊符号“o”“@”分别来描绘白子、黑子。

这个函数主要完成了以下工作:

●装载棋盘二位数组并进行绘制。

●根据棋盘数据绘制棋子。

●绘制最后落子指示规矩。

 

图3-3

2.键盘操作控制模块

此模块主要用于处理与用户的交互过程。

即完成落子判断过程。

此模块主要完成以下工作:

●判断是否在棋盘内按落子键,和移动是否超出棋盘范围。

●判断落子点是否已有棋子。

3.判断胜负模块

这是游戏中一个极其重要的算法,用来判断当前棋盘的形势是哪一方获胜。

五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图:

图3-5判断胜负方向

这个算法是本系统里的nWin成员函数。

需要它接受一个棋子颜色的参数,然后返回一个布尔值,这个值指示是否胜利。

1).横向判断流程图“——”

 

图3-6

2).竖向判断流程图“|”

 

3).从左到右斜方向“\”

 

 

图3-8

4).从右到左斜方向“/”

图3-9

 

图3-9

4.重置棋盘模块

在每局游戏开始的时候都需要调用这个函数InitialBoard(void)将棋盘初始化,也就是棋盘的初始化工作。

在这个函数中,主要发生了这么几件事情:

●将achBoard[N][N]中每一个落子位都置为无子状态(0)。

●默认的先手顺序是黑子先手,置player=1。

5.游戏结束模块

这一模块主要用于释放内存,用输出流语句输出结束信息,并控制循环退出程序。

 

第四章程序运行环境说明

4.1程序运行环境说明及出现的问题

该程序可以实现对学生信息的录入和显示,可以采用Dev-c或者VisualC++

运行,可以实现简单的界面化,使程序方便使用和修改。

4.2运行结果

软件使用结果

1.进入游戏→主界面

图4-1

2.点击1→开始游戏

图4-2

3.继续点击1或2→游戏过程中

图4-3

4.判断胜负

图4-4

5.在主界面中点击0→退出游戏

图4-6

 

第五章课程设计心得与体会

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。

通过几周的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做这么长的程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。

我做的是五子棋设计,虽然是很简单的一个小的程序,但对我来说却是一个很大的困难。

更加是第一次做课程设计,所以做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。

可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。

开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。

又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。

无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C++语言的一次实践作业,自己进步的证明。

在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。

因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!

附录1:

参考文献

1、谭浩强著.C++程序设计教程.清华大学出版社

2、陈维兴林小茶编著.C++面向对象程序设计.中国铁道出版社

3、田淑清,C语言程序设计,北京:

高等教育出版社,2006年1月

4、DavidJ.Kruglinski,ScotWingo,GeorgeShepherd,VisualC++6.0技术内幕(第五版),希望图书室译,北京:

北京希望电子出版社,2001年1月

源程序:

#include

#include

#include

#include

inta[90],b[90];//定义全局数组

intk=0;

usingnamespacestd;

classCGobang//棋子类

{

private:

charchSort;//棋子的类别

intnWin;//赢棋的次数

intnLose;//输棋的次数

staticintnDraw;//平局次数

public:

staticcharachBoard[19][19];//棋盘

staticintnSize;//棋盘的尺寸nSize*nSize

CGobang(charchsort)//构造函数,决定一方棋子的类别

{

chSort=chsort;

nWin=nLose=nDraw=0;

}

friendvoidhuiqi();//悔棋

staticvoidsavefile();//将棋盘保存至文件

staticvoidreadBoard();//从文件中读入棋盘

voidcontinute();//接着上次的游戏玩

voidPlayTurn(void);//走一步棋

intJudge();//判断是否连成五子,是则返回1

voidWin(void);//赢棋

voidLose(void);//输棋

staticvoidDraw(void);//平局

voidPrintInfo(void);//打印总体情况

staticvoidPrintBoard(void);//输出棋盘

staticintGetFull(void);//判断棋盘是否一满

staticvoidInitialBoard(void);//初始化棋盘

};

charCGobang:

:

achBoard[19][19];

intCGobang:

:

nSize=0;

intCGobang:

:

nDraw=0;

voidCGobang:

:

Draw()

{

cout<<"\n\n\t\t平局!

\n\n";

nDraw++;

}

voidCGobang:

:

InitialBoard()//初始化棋盘

{

for(inti=0;i

for(intj=0;j

achBoard[i][j]='';

}

voidCGobang:

:

PrintBoard()//输出棋盘

{

inti,j;

cout<

cout<

for(i=1;i<=nSize;i++)

{

cout<

}

cout<

for(i=0;i

{

cout<

cout<

for(j=0;j

cout<

cout<

}

}

intCGobang:

:

GetFull()//判断棋盘是否一满,若是返回1

{

for(inti=0;i

for(intj=0;j

if(achBoard[i][j]=='')

return0;

return1;

}

voidCGobang:

:

Win()//赢棋

{

cout<<"\n\n\t\t"<

\n\n";

nWin++;

}

voidCGobang:

:

savefile()//将棋盘保存至文件

{

ofstreamoutfile("C++.txt",ios:

:

out);

if(!

outfile)

{cerr<<"openfileerror!

"<

exit

(1);

}

for(inti=0;i

for(intj=0;j

outfile.write((char*)&achBoard[i][j],sizeof(achBoard[i][j]));

outfile.close();

}

voidCGobang:

:

Lose()//输棋

{

nLose++;

}

voidCGobang:

:

PlayTurn(void)//走一步棋

{

intnRow,nCol;

charchoice1,choice2;

do

{

cout<<"\t现在该"<

";

cin>>nRow>>nCol;

if(nRow>nSize||nCol>nSize)

cout<<"\t输入的坐标越界,x与y的范围应小于等于"<

else

if(nRow>0&&nCol>0&&achBoard[nRow-1][nCol-1]!

='')

cout<<"\t棋盘("<

elseif(nRow==-1)

huiqi();

elseif(nRow==0&&nCol==0)

{

cout<<"\t确认你想结束游戏吗(y,n)?

";

cin.get();

cin>>choice1;

if(choice1=='y'||choice1=='Y')

{

cout<<"\t是否保存(y,n)?

:

";

cin.get();

cin>>choice2;

if(choice2=='y'||choice2=='Y')

{

CGobang:

:

savefile();

cout<<"\t保存成功,欢迎下次再玩!

\n";

exit

(1);

}

else

{

cout<<"\t游戏结束,欢迎再次使用五子棋游戏!

";

cout<

exit(0);

}

}

}

else{

achBoard[nRow-1][nCol-1]=chSort;

a[k]=nRow-1;

b[k]=nCol-1;

k++;

break;

}

}while

(1);

}

intCGobang:

:

Judge()//判断是否连成五子,是则返回1

{

inti,j;

for(i=0;i

for(j=0;j

{

if(achBoard[i][j]==chSort)

{

if(j+4

{

if(achBoard[i][j+1]==chSort&&achBoard[i][j+2]==chSort&&achBoard[i][j+3]==chSort&&achBoard[i][j+4]==chSort)

return1;

}

if(i+4

{

if(achBoard[i+1][j]==chSort&&achBoard[i+2][j]==chSort&&achBoard[i+3][j]==chSort&&achBoard[i+4][j]==chSort)

return1;

}

if(i+4

{

if(achBoard[i+1][j+1]==chSort&&achBoard[i+2][j+2]==chSort&&achBoard[i+3][j+3]==chSort&&achBoard[i+4][j+4]==chSort)

return1;

}

if(i-4>0&&j+4

{

if(achBoard[i-1][j+1]==chSort&&achBoard[i-2][j+2]==chSort&&achBoard[i-3][j+3]==chSort&&achBoard[i-4][j+4]==chSort)

return1;

}

}

}

return0;

}

voidCGobang:

:

PrintInfo(void)//打印总体情况

{

cout<<"Size"<

"<

}

voidCGobang:

:

readBoard()//以二进制形式从文件中读出棋盘

{

ifstreaminfile("C++.txt",ios:

:

in);

if(!

infile)

{

cerr<<"openfileeror!

"<

exit

(1);

}

else

{

for(inti=0;i

for(intj=0;j

infile.read((char*)&achBoard[i][j],sizeof(achBoard[i][j]));

infile.close();

}

}

voidhuiqi()//悔棋

{

k--;

CGobang:

:

achBoard[a[k]][b[k]]='';

k--;

CGobang:

:

achBoard[a[k]][b[k]]='';

CGobang:

:

PrintBoard();

}

voidPrintRule(void)//打印游戏规则

{

cout<<"\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n";

cout<<"\t\t欢迎使用五子连珠游戏!

"<

cout<<"\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n";

cout<<"\t游戏规则:

"<

cout<<"\t1.每1步输入要下棋子的格子的x,y坐标,按Enter键\n";

cout<<"\t2.有1方首先5个棋子连成一线即判获胜\n";

cout<<"\t3.当旗子布满棋盘但仍无获胜方即为平局\n";

cout<<"\t4.一局结束后,若想继续按Y键,若退出则按其他键\n";

cout<<"\t5.若想中途退出游戏,请输入(0,0),再按照提示保存游戏\n";

cout<<"\t6.悔棋请输入(-1,0)\n";

cout<<"\t6.X方先行\n";

cout<<"\n\n\t\t请按任意键开始下棋!

\n\n";

}

intJudgePlay(CGobang&SideX,CGobang&SideO)//每下一步要进行输赢的判断,有赢的则返回1

{

if(SideX.Judge())//X方获胜

{

SideX.Win();

SideO.Lose();

return1;

}

elseif(SideO.Judge())//O方获胜

{

SideO.Win();

SideX.Lose();

return1;

}

else

return0;

}

voidPlay(CGobang&SideX,CGobang&SideO)//开始一局游戏

{

while

(1)

{

system("cls");

cout<<"\t*************************************************\n";

cout<<"\t\t※.悔棋请输入(-1,0)\n";

cout<<"\t\t※.中途退出请输出(0,0),并根据提示保存\n";

cout<<"\t*************************************************\n";

CGobang:

:

PrintBoard();//输出棋盘

SideX.PlayTurn();//X方下棋

if(JudgePlay(SideX,SideO))//判断输赢

break;

if(CGobang:

:

GetFull())//判断是否平局

{

CGobang:

:

Draw();

break;

}

system("cls");//清屏

cout<<"\t*************************************************\n";

cout<<"\t\t※.悔棋请输入(-1,0)\n";

cout<<"\t\t※.中途退出请输出(0,0),并根据提示保存\n";

cout<<"\t*************************************************\n";

CGobang:

:

PrintBoard();//输出棋盘

SideO.PlayTurn();//O方下棋

if(JudgePl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1