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

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

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

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

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

c++课程设计五子棋游戏

五子棋游戏

1.设计目的

(1)加深对面向对象程序基本的理解和掌握。

(2)熟练掌握基本流程图的绘制。

(3)能够在调试程序中快速发现并排除程序中的错误。

(4)提高面向对象程序语言解决实际中的问题的能力。

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

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

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

2.功能描述

(1)输出棋盘界面

(2)玩家轮流下棋

(3)判断键盘输入的坐标位置

(4)判断是否在同一位置下棋

(5)判断赢家

(6)结束游戏

由两个玩家分别下棋,按任意键开始游戏,显示棋盘,用户通过输入横纵坐标的位置下棋,当某一个玩家五子相连,则赢。

界面要求:

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

 

3.总体设计

3.1系统流程图

五子棋对弈系统流程图如下:

 

 

图1程序总体图

 

 

 

图2算法流程图

3.2详细设计

3.2.1本系统的主要结构和类结构

(1)五子棋功能实现的主要结构函数

voidgetpointxy();//白棋出子函数

voidgetpointmn();//黑棋出子函数

voidshowqipan();//实现20行20列正方形界面输出

voidprint();//输出下一棋盘界面及计数

boolIsxyWin();//白棋获胜

boolIsmnWin();//黑棋获胜

voidmenu();//显示开始菜单界面

(2)五子棋类的结构

classfive

{

intx,y,m,n,num_xy,num_mn;

charqipan[20][20];//定义20行20列的数组

public:

five(intX=0,intY=0,intM=0,intN=0,intNum_xy=0,intNum_mn=0)//构造函数初始化

{

x=X;

y=Y;

m=M;

n=N;

num_xy=Num_xy;

num_mn=Num_mn;

for(inti=0;i<20;i++)//输出20行20列的棋盘界面

{

for(intj=0;j<20;j++)

qipan[i][j]='.';

}

}

3.2.2功能模块

(1)图形显示模块:

程序开始运行时,显示给出的一个界面任意键继续,包括对数据成员的赋值和成员函数的初始化还有通过for循环实现对20行20列坐标的定义。

源代码如下:

classfive

{

intx,y,m,n,num_xy,num_mn;

charqipan[20][20];//定义20行20列的数组

public:

five(intX=0,intY=0,intM=0,intN=0,intNum_xy=0,intNum_mn=0)//构造函数初始化

{x=X;

y=Y;

m=M;

n=N;

num_xy=Num_xy;

num_mn=Num_mn;

for(inti=0;i<20;i++)//输出20行20列的棋盘界面

{for(intj=0;j<20;j++)qipan[i][j]='.';}

}

voidgetpointxy();//白棋出子及计数

voidgetpointmn();//黑棋出子及计数

voidshowqipan();//实现20行20列正方形界面输出

voidprint();//输出下一棋盘界面

boolIsxyWin();//白棋获胜

boolIsmnWin();//黑棋获胜

voidmenu();//显示开始菜单界面

};

(2)白棋和黑棋落子情况的判断的实现:

游戏开始,玩家通过输入棋子的坐标确定下棋的位置,黑棋白棋轮流开始。

voidfive:

:

getpointxy()//判断白棋出子情况及对其计数

{std:

:

cout<<"请分别输入第"<

";

std:

:

cin>>y>>x;

if(!

(1<=x&&x<=20&&1<=y&&y<=20))

{std:

:

cout<<"输入错误,请重新输入:

"<

getpointxy();

}

elseif(qipan[y-1][x-1]!

='.')

{std:

:

cout<<"请所下的位置已经有棋子,请重新输入:

"<

getpointxy();

}

elseif(num_xy+num_mn>=400)

{std:

:

cout<<"棋盘已满,平局!

"<

exit(0);

}

else

{qipan[y-1][x-1]='O';

num_xy++;

}

}

voidfive:

:

getpointmn()//判断黑棋出子情况及对其计数

{std:

:

cout<<"请分别输入第"<

";

std:

:

cin>>n>>m;

if(!

(1<=m&&m<=20&&1<=n&&n<=20))

{std:

:

cout<<"输入错误,请重新输入:

"<

getpointmn();

}

elseif(qipan[n-1][m-1]!

='.')

{std:

:

cout<<"请所下的位置已经有棋子,请重新输入:

"<

getpointmn();

}

elseif(num_xy+num_mn>=400)

{std:

:

cout<<"棋盘已满,平局!

"<

exit(0);

}

else

{qipan[n-1][m-1]='*';

num_mn++;

}

}

(3)菜单界面模块:

voidfive:

:

menu()//进入菜单界面

{char*q=newchar[9];

cin>>q;

if(strcmp(q,"c"))

five:

:

showqipan();

}

(4)输出模块:

voidfive:

:

showqipan()//输出20行20列的坐标数值

{intp=0,q=0;

for(inti=0;i<=20;i++)

{if(p<10)

{std:

:

cout<

else

std:

:

cout<

p++;

}

cout<

for(i=0;i<20;i++)

{if(i>=0)

{q++;

if(q<10)std:

:

cout<

elsestd:

:

cout<

}

for(intj=0;j<20;j++)std:

:

cout<

std:

:

cout<

}

}

voidfive:

:

print()

{intp=0,q=0;

for(inti=0;i<=20;i++)

{if(p<10)

{std:

:

cout<

elsestd:

:

cout<

p++;

}

std:

:

cout<

for(i=0;i<20;i++)

{if(i>=0)

{q++;

if(q<10)std:

:

cout<

elsestd:

:

cout<

}

for(intj=0;j<20;j++)

{std:

:

cout<

std:

:

cout<

}

}

(5)黑白棋输赢的判断,判断当前棋盘的形势是哪一方获胜。

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

图3判断胜负方向

boolfive:

:

IsxyWin()//白棋获胜实现函数

{intnum1=1,num2=1,num3=1,num4=1;

for(inti=x;i

{if(qipan[y-1][i]!

='O')break;

if(qipan[y-1][i]=='O')num1++;

}

for(i=x-2;i>=0;i--)

{if(qipan[y-1][i]!

='O')break;

if(qipan[y-1][i]=='O')num1++;

}

for(i=y;i

{if(qipan[i][x-1]!

='O')break;

if(qipan[i][x-1]=='O')num2++;

}

for(i=y-2;i>=0;i--)

{if(qipan[i][x-1]!

='O')break;

if(qipan[i][x-1]=='O')num2++;

}

for(i=0;i<5&&x+i<20&&y+i<20;i++)

{if(qipan[y+i][x+i]!

='O')break;

if(qipan[y+i][x+i]=='O')num3++;

}

for(i=0;x-i-2>=0&&y-i-2>=0&&i<5;i++)

{if(qipan[y-i-2][x-i-2]!

='O')break;

if(qipan[y-i-2][x-i-2]=='O')num3++;

}

for(i=0;x+i<20&&y-i-2>=0&&i<5;i++)

{if(qipan[y-i-2][x+i]!

='O')break;

if(qipan[y-i-2][x+i]=='O')num4++;

}

for(i=0;y+i<20&&x-i-2>=0&&i<5;i++)

{if(qipan[y+i][x-i-2]!

='O')break;

if(qipan[y+i][x-i-2]=='O')num4++;

}

if(num1>=5||num2>=5||num3>=5||num4>=5)return1;

elsereturn0;

}

黑棋获胜情况与白棋类似

(6)主函数模块:

输出欢迎使用的界面,判断游戏是否结束,若结束输出胜出方并结束游戏。

voidmain()

{std:

:

cout<<"*************欢迎使用*******************"<

std:

:

cout<<"______________________________________________"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

●?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

○e╋?

╋?

╋?

╋?

╋?

○e╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

●?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

●?

╋?

╋?

╋?

╋?

╋?

●?

○e╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

○e○e╋?

○e╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

●?

╋?

╋?

╋?

╋?

●?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

╋?

|"<

std:

:

cout<<"|---------------------------------------------"<

std:

:

cout<<"进入按任意键";

fivea;//定义一个类的对象

inttemp;

a.menu();

std:

:

cout<<"这是本游戏的棋盘,请按坐标输入棋子"<

a.showqipan();//通过对象调用功能函数

std:

:

cout<<"确认请按1,退出请按其他键";

std:

:

cin>>temp;

if(temp!

=1)//游戏开始退出控制

exit

(1);

if(temp==1)

{std:

:

cout<<"游戏开始:

"<

for(inti=0;;i++)

{

a.getpointxy();

a.print();

if(a.IsxyWin())

{

std:

:

cout<<"白棋胜"<

std:

:

cout<<"游戏结束\n";

exit(0);

}

a.getpointmn();

a.print();

if(a.IsmnWin())

{

std:

:

cout<<"黑棋胜"<

std:

:

cout<<"游戏结束\n";

exit(0);}

}

}

}

 

4.运行结果与分析

(1)此界面为欢迎界面,按任意键进入游戏。

图4游戏界面

(2)此界面表示进入棋盘界面,确认按1开始玩游戏,其他键退出。

图5棋盘界面

(3)此界面表示游戏开始。

图6游戏开始界面

(4)此界面表示输入横纵坐标完成落子。

图7输入白棋坐标

(5)此界面表示在同一地方下棋的情况。

图8所下位置重复

(6)此界面为游戏结束界面,显示胜出方并显示游戏结束字样。

图9游戏结束界面

5.心得体会

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程。

随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。

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

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

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

 

6.参考文献

[1]朱晴婷,黄海鹰,陈莲君.VisualC++程序设计—基础与实例分析[M].北京:

清华大学出版社,2008.2:

101-244

[2]刘瑞新.VisualC++6.0开发技巧与实例教程.[M].北京:

机械工业出版社,2006.10:

214-299

[3]黄维通.VisualC++面向对象与可视化程序设计(第2版).[M].北京:

清华大学出版社,2007.8:

70-95

[4]郑阿奇.VisualC++教程[M].北京:

清华大学出版社,2005.4:

132-150

[5]夏崇镨,任海军,余建.VisualC++课程设计案例精编[M].北京:

清华大学出版社,2008.11:

112-130

 

附录:

#include

usingnamespacestd;

classfive

{

intx,y,m,n,num_xy,num_mn;

charqipan[20][20];//定义20行20列的数组

public:

five(intX=0,intY=0,intM=0,intN=0,intNum_xy=0,intNum_mn=0)//构造函数初始化

{x=X;

y=Y;

m=M;

n=N;

num_xy=Num_xy;

num_mn=Num_mn;

for(inti=0;i<20;i++)//输出20行20列的棋盘界面

{for(intj=0;j<20;j++)qipan[i][j]='.';}

}

voidgetpointxy();//白棋子计数

voidgetpointmn();//黑棋出子计数

voidshowqipan();//实现20行20列正方形界面输出

voidprint();//输出下棋盘界面

boolIsxyWin();//白棋获胜

boolIsmnWin();//黑棋获胜

voidmenu();//显示开始菜单界面

};

voidfive:

:

getpointxy()//判断白棋出子情况对其计数

{std:

:

cout<<"请分别输入"<

";

std:

:

cin>>y>>x;

if(!

(1<=x&&x<=20&&1<=y&&y<=20))

{std:

:

cout<<"输错误请重新输入:

"<

getpointxy();

}

elseif(qipan[y-1][x-1]!

='.')

{std:

:

cout<<"请下的位置已经有棋子请重新输入:

"<

getpointxy();

}

elseif(num_xy+num_mn>=400)

{std:

:

cout<<"棋盘已满,平局"<

exit(0);

}

else

{qipan[y-1][x-1]='O';

num_xy++;

}

}

voidfive:

:

getpointmn()//判断黑棋出子情况及对其计数

{std:

:

cout<<"请分别输入第"<

";

std:

:

cin>>n>>m;

if(!

(1<=m&&m<=20&&1<=n&&n<=20))

{std:

:

cout<<"输入错误,请重新输入:

"<

getpointmn();

}

elseif(qipan[n-1][m-1]!

='.')

{std:

:

cout<<"所下的位置已经有棋子,请重新输入"<

getpointmn();

}

elseif(num_xy+num_mn>=400)

{std:

:

cout<<"棋?

盘¨¬已°?

满¨²,ê?

平?

局?

!

"<

exit(0);

}

else

{qipan[n-1][m-1]='*';

num_mn++;

}

}

voidfive:

:

menu()//进入菜单Ì界面

{char*q=newchar[9];

cin>>q;

if(strcmp(q,"c"))

five:

:

showqipan();

}

voidfive:

:

showqipan()//输出20行20列的坐标数值

{intp=0,q=0;

for(inti=0;i<=20;i++)

{if(p<10)

{std:

:

cout<

else

std:

:

cout<

p++;

}

cout<

for(inti=0;i<20;i++)

{if(i>=0)

{q++;

if(q<10)st

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

当前位置:首页 > 党团工作 > 思想汇报心得体会

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

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