福建农林大学计算机与信息学院课程设计报告课程名称:面向对象程序设计课程设计课程设计题目:五子棋姓名:系:计算机专业:软件工程年级:学号:指导教师:职称:年月日福建农林大学计算机与信息学院计算机类课程设计报告结果评定目录1.设计目的 (4)2.设计要求 (4)3.设计方案 (4)4.设计内容 (7)4.1系统的主要结构和类结构 (7)4.2 (2)五子棋类的结构 (7)4.3⑶系统工作流程介绍.................................................... 7错误!未定义书签。
⑷类的介绍. (8)4.5 (5) 各个模块的介绍 (8)4.6 (6)程序运行图示 (14)5.总结 (16)参考文献 (17)(a)1.设计目的(1)加深我对面向对象程序基本的理解和掌握。
(2)熟练掌握基本流程图的绘制。
(3)熟练visio的一些操作方法。
(4)能够在调试程序中快速发现并排除程序中的错误。
(5)提高面向对象程序语言解决实际中的问题的能力。
(b)2.设计要求五子棋是玩家在游戏棋盘上逐个输入黑子或白子的坐标,因此游戏要求在DOS界面生成一个可供操作的棋盘。
通过输入坐标完成对应落子情况,在输入过程中判断落子是否正确、是否有一方胜利等情况。
编写代码可以在VC6.0下编译通过。
游戏要能实现五子棋游戏的简单操作。
程序中要体现面向对象思想。
(c)3.设计方案(必须包含系统功能说明、用例图和类图)一、用例图落子基于用户的用例图步数用例图系统用例图1)输出棋盘界面菜单及图像2)开始进入控制3)黑白棋正确输入格式控制4)判断黑白输赢控制5)正确计数对羿步数及下一步所要走的棋盘界面二、类图(d)4.设计内容⑴本系统的主要结构和类结构1)五子棋功能实现的主要结构函数void getpointxy(); //白棋出子函数void getpointmn(); //黑棋出子函数void showqipan(); //实现20行20列正方形界面输出void print(); //输出下一棋盘界面及计数bool IsxyWin(); //白棋获胜bool IsmnWin(); //黑棋获胜void menu();//显示开始菜单界面(2)五子棋类的结构class five{int x,y,m,n,num_xy,num_mn;char qipan[20][20]; //定义20行20列的数组public:five(int X = 0,int Y =0,int M = 0,int N = 0,int Num_xy = 0,int Num_mn = 0) //构造函数初始化{x = X;y = Y;m = M;n = N;num_xy = Num_xy;num_mn = Num_mn;for(int i = 0 ; i < 20 ; i ++) //输出20行20列的棋盘界面{for(int j = 0 ;j < 20 ; j ++)qipan[i][j] = '.';}}⑶系统工作流程介绍。
⑷类的介绍:该类完成了对输入棋子坐标的初始化,通过for循环实现了一个20行20列的坐标,在公有成员中定义了相应的功能函数void getpointxy(); //白棋出子及计数void getpointmn(); //黑棋出子及计数void showqipan(); //实现20行20列正方形界面输出void print(); //输出下一棋盘界面bool IsxyWin(); //白棋获胜bool IsmnWin(); //黑棋获胜void menu();//显示开始菜单界面(5)各个模块的介绍:1)类的实现:包括对数据成员的赋值和成员函数的初始化还有通过for循环实现对20行20列坐标的定义:源代码如下class five{int x,y,m,n,num_xy,num_mn;char qipan[20][20]; //定义20行20列的数组public:five(int X = 0,int Y =0,int M = 0,int N = 0,int Num_xy = 0,int Num_mn = 0) //构造函数初始化{ x = X;y = Y;m = M;n = N;num_xy = Num_xy;num_mn = Num_mn;for(int i = 0 ; i < 20 ; i ++) //输出20行20列的棋盘界面{ for(int j = 0 ;j < 20 ; j ++) qipan[i][j] = '.'; }}void getpointxy(); //白棋出子及计数void getpointmn(); //黑棋出子及计数void showqipan(); //实现20行20列正方形界面输出void print(); //输出下一棋盘界面bool IsxyWin(); //白棋获胜bool IsmnWin(); //黑棋获胜void menu();//显示开始菜单界面};2)白棋和黑棋落子情况的判断的实现,源代码如下:void five::getpointxy() //判断白棋出子情况及对其计数{ std::cout<<"请分别输入第"<<num_xy+1<<"步白棋○的横坐标和纵坐标:"; std::cin >> y >> x;if (!(1<=x&&x<=20&&1<=y&&y<=20)){ std::cout << "输入错误,请重新输入:"<<endl ;getpointxy();}else if(qipan[y-1][x-1] != '.' ){ std::cout << "请所下的位置已经有棋子,请重新输入:" <<endl;getpointxy();}else if(num_xy+num_mn >= 400){ std::cout << "棋盘已满,平局!" << endl;exit(0);}else{ qipan[y-1][x-1] = 'O';num_xy++;}}void five::getpointmn() //判断黑棋出子情况及对其计数{ std::cout<<"请分别输入第"<<num_mn+1<<"步黑棋●的横坐标和纵坐标:"; std::cin >> n >> m;if (!(1<=m&&m<=20&&1<=n&&n<=20)){ std::cout << "输入错误,请重新输入:"<<endl ;getpointmn();}else if(qipan[n-1][m-1]!='.'){ std::cout << "请所下的位置已经有棋子,请重新输入:" <<endl;getpointmn();}else if(num_xy+num_mn >= 400){ std::cout << "棋盘已满,平局!" << endl;exit(0);}else{ qipan[n-1][m-1] = '*';num_mn++;}}3)菜单界面模块void five::menu()//进入菜单界面{ char *q=new char[9];cin>>q;if(strcmp(q,"c"))five::showqipan();}4)输出模块void five::showqipan() //输出20行20列的坐标数值{ int p=0,q=0;for(int i = 0 ; i <= 20 ; i++){ if(p<10){ std::cout << p <<' '; }elsestd::cout << p ;p++;}cout << endl;for(i = 0 ; i < 20 ; i++){ if(i>=0){ q++;if(q<10) std::cout << q <<' ';else std::cout << q;}for(int j = 0 ; j < 20 ; j ++) std::cout << qipan[i][j]<<' ' ;std::cout << endl;}}void five::print(){ int p=0,q=0;for(int i = 0 ; i <= 20 ; i++){ if(p<10){ std::cout << p <<' '; }else std::cout << p ;p++;}std::cout << endl;for(i = 0 ; i < 20 ; i++){ if(i>=0){ q++;if(q<10) std::cout << q <<' ';else std::cout << q;}for(int j = 0 ; j < 20 ; j ++){ std::cout << qipan[i][j]<<' ' ; }std::cout << endl;}}5)黑白棋输赢的判断,其源代码如下:bool five::IsxyWin()//白棋获胜实现函数{ int num1=1,num2=1,num3=1,num4=1;for(int i = x ; i < x+5&& x+5<20 ; 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 < y+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 ; 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)return 1;else return 0;}黑棋获胜情况与白棋类似6)主函数模块void main(){ std::cout<<"*************欢迎使用*^_^*`~******************"<<endl;std::cout<<"______________________________________________"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl; std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋●╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋○╋╋╋╋╋○╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋●╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋●╋╋╋╋╋●○╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋○○╋○╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋●╋╋╋╋●╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋|"<<endl;std::cout<<"|---------------------------------------------"<<endl;std::cout<<"进入按任意键";five a; //定义一个类的对象int temp;a.menu();std::cout << "这是本游戏的棋盘,请按坐标输入棋子:" << endl;a.showqipan(); //通过对象调用功能函数std::cout << "确认请按1,退出请按其他键:";std::cin >> temp;if(temp !=1) //游戏开始及退出控制exit(1);if(temp == 1){ std::cout << "游戏开始:" << endl;for(int i = 0 ; ; i ++){a.getpointxy();a.print();if(a.IsxyWin()){std::cout << "白棋胜!" << endl;break;}a.getpointmn();a.print();if(a.IsmnWin()){std::cout << "黑棋胜!" << endl;break;}}}std::cout << "游戏结束\n";}(6)程序运行图示:进入游戏界面棋盘界面通过输入横纵坐标完成落子下在同一个地方的情况获胜情况5.总结1)通过此次课程设计,让我产生对益智游戏编程的兴趣,尤其是当我真正把那程序运行出来时,那种兴奋劲,无法比拟。