五子棋游戏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某方在水平方向是否大于4某方在正对角线方向是否大于4某方在垂直方向是否大于4某方在反对角线方向是否大于4否白(黑)方获胜白(黑)方获胜白(黑)方获胜白(黑)方获胜进入选择是否重新开局框黑(白)方下子是是是是否否否白(黑)方下子游戏开始{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;i20;i++)//输出20行20列的棋盘界面{for(intj=0;j20;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;i20;i++)//输出20行20列的棋盘界面{for(intj=0;j20;j++)qipan[i][j]='.';}}voidgetpointxy();//白棋出子及计数voidgetpointmn();//黑棋出子及计数voidshowqipan();//实现20行20列正方形界面输出voidprint();//输出下一棋盘界面boolIsxyWin();//白棋获胜boolIsmnWin();//黑棋获胜voidmenu();//显示开始菜单界面};(2)白棋和黑棋落子情况的判断的实现:游戏开始,玩家通过输入棋子的坐标确定下棋的位置,黑棋白棋轮流开始。voidfive::getpointxy()//判断白棋出子情况及对其计数{std::cout请分别输入第num_xy+1步白棋○的横坐标和纵坐标:;std::cinyx;if(!(1=x&&x=20&&1=y&&y=20)){std::cout输入错误,请重新输入:endl;getpointxy();}elseif(qipan[y-1][x-1]!='.'){std::cout请所下的位置已经有棋子,请重新输入:endl;getpointxy();}elseif(num_xy+num_mn=400){std::cout棋盘已满,平局!endl;exit(0);}else{qipan[y-1][x-1]='O';num_xy++;}}voidfive::getpointmn()//判断黑棋出子情况及对其计数{std::cout请分别输入第num_mn+1步黑棋●的横坐标和纵坐标:;std::cinnm;if(!(1=m&&m=20&&1=n&&n=20)){std::cout输入错误,请重新输入:endl;getpointmn();}elseif(qipan[n-1][m-1]!='.'){std::cout请所下的位置已经有棋子,请重新输入:endl;getpointmn();}elseif(num_xy+num_mn=400){std::cout棋盘已满,平局!endl;exit(0);}else{qipan[n-1][m-1]='*';num_mn++;}}(3)菜单界面模块:voidfive::menu()//进入菜单界面{char*q=newchar[9];cinq;if(strcmp(q,c))five::showqipan();}(4)输出模块:voidfive::showqipan()//输出20行20列的坐标数值{intp=0,q=0;for(inti=0;i=20;i++){if(p10){std::coutp'';}elsestd::coutp;p++;}coutendl;for(i=0;i20;i++){if(i=0){q++;if(q10)std::coutq'';elsestd::coutq;}for(intj=0;j20;j++)std::coutqipan[i][j]'';std::coutendl;}}voidfive::print(){intp=0,q=0;for(inti=0;i=20;i++){if(p10){std::coutp'';}elsestd::coutp;p++;}std::coutendl;for(i=0;i20;i++){if(i=0){q++;if(q10)std::coutq'';elsestd::coutq;}for(intj=0;j20;j++){std::coutqipan[i][j]'';}std::coutendl;}}(5)黑白棋输赢的判断,判断当前棋盘的形势是哪一方获胜。五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图:图3判断胜负方向boolfive::IsxyWin()//白棋获胜实现函数{intnum1=1,num2=1,num3=1,num4=1;for(inti=x;ix+5&&x+520;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;iy+5;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;i5&&x+i20&&y+i20;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&&i5;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+i20&&y-i-2=0&&i5;i++){if(qipan[y-i-2][x+i]!='O')break;if(qipan[y-i-2][x+i]=='O')num4++;}for(i=0;y+i20&&x-i-2=0&&i5;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*************欢迎使用*******************endl;std::cout______________________________________________endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?●?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?○e╋?╋?╋?╋?╋?○e╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?●?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?●?╋?╋?╋?╋?╋?●?○e╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?○e○e╋?○e╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?╋?╋?╋?╋?●?╋?╋?╋?╋?●?╋?╋?╋?╋?╋?╋?╋?╋?╋?╋?|endl;std::cout|╋?╋?