C++语言程序设计课程设计报告课程:C++语言程序设计题目:五子棋年级:专业:学号:姓名:指导教师:江苏师范大学数学与统计学院【摘要】五子棋是我国古代的、传统的黑白棋种之一。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
本游戏是以C++语言作为开发工具,运行环境Visual C++ 6.0,通过构造函数绘制棋谱,以及落子函数、判断函数,实现双人对弈的功能。
【关键词】五子棋、游戏、人人对战、C++【引言】五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
本游戏是以C++语言作为开发工具,运行环境Visual C++ 6.0,通过构造函数绘制棋谱,以及落子函数、判断函数,实现双人对弈的功能。
【设计思路】第一步:绘制棋谱第二步:对战双方落子第三步:判断是否有五子连珠第四步:重复第一、二、三步直至出现五子连珠【设计过程】通过构造函数实现棋盘,编写落子函数实现玩家落子,通过判断函数判断是否有五子连珠的结果。
【设计结果】图1-1初始画面图1-2 双方落子图1-3 白棋胜出【设计总结】本五子棋游戏是一种简单的小程序,没有图形界面以及复杂的人机、网络对战,但即便如此我们也可以在娱乐中感受到C++编程的奇妙之处。
附录:#include <iostream>#include <stdlib.h>using namespace std;class MyGobang{public: MyGobang();void printBoard();void getPointXY();void getPointMN();bool isFirstWin();bool isSecondWin();private: int x,y,m,n,num_xy,num_mn;char board[20][20];};MyGobang::MyGobang()//构造函数实现棋谱{num_xy=0;num_mn=0;for(int i=0;i<20;i++)for(int j=0;j<20;j++)board[i][j]='.';}void MyGobang::printBoard()//刷新棋谱{for(int i=0;i<=20;i++){if(i<10) cout<<i<<" ";else cout<<i;}cout<<endl;for(int j=1;j<=20;j++){if(j<10){cout<<j<<" ";for(int k=0;k<20;k++)cout<<board[j-1][k]<<" ";cout<<endl;}else{cout<<j;for(int k=0;k<20;k++)cout<<board[j-1][k]<<" ";cout<<endl;}}}void MyGobang::getPointXY()//第一人落子函数{cout<<"请输入第"<<num_xy+1<<"步白旗X,Y的坐标(x,y在1和20之间):";cin>>x>>y;cout<<endl;while(x<1||x>20||y<1||y>20){cout<<"出界,请重新输入:";cin>>x>>y;cout<<endl;}while(board[y-1][x-1]!='.'){cout<<"该位置已被占,重新输入:";cin>>x>>y; cout<<endl;while(x<1||x>20||y<1||y>20){cout<<"出界,请重新输入:";cin>>x>>y; cout<<endl;}}board[y-1][x-1]='o';num_xy++;}bool MyGobang::isFirstWin()//判断第一人是否赢{int num1=1,num2=1,num3=1,num4=1;int i,j;//这里是判断X坐标向右的'0'连续数for(i=x;i<=x+3&&i<20;i++){if(board[y-1][i]=='o') num1++;else break;}//这里是判断X坐标向左的'0'连续数for(i=x-2;0<=i&&i>=x-5;i--){if(board[y-1][i]=='o') num1++;else break;}//这里是判断Y坐标向下的'0'连续数for(j=y;j<20&&j<=y+3;j++){if(board[j][x-1]=='o') num2++;else break;}//这里是判断Y坐标向上的'0'连续数for(j=y-2;j>=0&&j>=y-5;j--){if(board[j][x-1]=='o') num2++;else break;}//这里是判断右斜上'0'连续数for(i=x,j=y;i<20&&j<20&&i<=x+3&&j<=y+3;i++,j++) {if(board[j][i]=='o') num3++;else break;}//这里是判断左斜下'0'连续数for(i=x-2,j=y-2;i>=0&&j>=0&&i>=i-5&&j>=5;i--,j--){if(board[j][i]=='o') num3++;else break;}//这里是判断左斜上'0'连续数for(i=x-2,j=y;i>=0&&j<20&&i>=x-5&&j<=y+3;i--,j++){if(board[j][i]=='o') num4++;else break;}//这里是判断右斜下'0'连续数for(i=x,j=y-2;i<20&&j>=0&&i<=x+3&&j>=y-5;i++,j--){if(board[j][i]=='o') num4++;else break;}if(num1==5||num2==5||num3==5||num4==5) return 1;// 这里总结X,Y ,左斜,右斜的'0'连续数,有等于五的就直接返回1 否则返回0 else return 0;}void MyGobang::getPointMN()//第二人落子函数{cout<<"请输入第"<<num_mn+1<<"步黑旗X,Y的坐标(x,y在1和20之间):";cin>>m>>n;cout<<endl;while(m<1||m>20||n<1||n>20){cout<<"出界,请重新输入:";cin>>m>>n;cout<<endl;}while(board[n-1][m-1]!='.'){cout<<"该位置已被占,重新输入:";cin>>m>>n;cout<<endl;while(m<1||m>20||n<1||n>20){cout<<"出界,请重新输入:";cin>>m>>n; cout<<endl;}}board[n-1][m-1]='x'; num_mn++;}bool MyGobang::isSecondWin()//第二人是否赢{int num1=1,num2=1,num3=1,num4=1;int i,j;for(i=m;i<=m+3&&i<20;i++){if(board[n-1][i]=='x') num1++;else break;}for(i=m-2;0<=i&&i>=m-5;i--){if(board[n-1][i]=='x') num1++;else break;}for(j=n;j<20&&j<=n+3;j++){if(board[j][m-1]=='x') num2++;else break;}for(j=n-2;j>=0&&j>=n-5;j--){if(board[j][m-1]=='x') num2++;else break;}for(i=m,j=n;i<20&&j<20&&i<=m+3&&j<=n+3;i++,j++) {if(board[j][i]=='x') num3++;else break;}for(i=m-2,j=n-2;i>=0&&j>=0&&i>=i-5&&j>=5;i--,j--){if(board[j][i]=='x') num3++;else break;}for(i=m-2,j=n;i>=0&&j<20&&i>=m-5&&j<=n+3;i--,j++) {if(board[j][i]=='x') num4++;else break;}for(i=m,j=n-2;i<20&&j>=0&&i<=m+3&&j>=n-5;i++,j--) {if(board[j][i]=='x') num4++;else break;}if(num1==5||num2==5||num3==5||num4==5) return 1;else return 0;}int main(){cout<<"***************五子棋*****************"<<endl;MyGobang gobang; gobang.printBoard ();//申明MYGobang类的一个对象for(int i=0;;i++){gobang.getPointXY();//调用这个函数gobang.printBoard ();//调用绘制棋盘if(gobang.isFirstWin ()!=0)//调用第一人是否赢的函数{cout<<"*************白棋胜利***************"<<endl;break;}gobang.getPointMN();gobang.printBoard ();if(gobang.isSecondWin ()!=0){cout<<"*************黑棋胜利***************"<<endl;break;}}system("pause");}。