资源描述
福建农林大学计算机与信息学院
课程设计报告
课程名称:
面向对象程序设计课程设计
课程设计题目:
五子棋
姓 名:
系:
计算机
专 业:
软件工程
年 级:
学 号:
指导教师:
职 称:
年 月 日
福建农林大学计算机与信息学院计算机类
课程设计报告结果评定
评语:
评分项目
分值
得分
课程设计报告符合规范
10分
类图、用例图、系统框图合理
30分
主要技术线路正确
30分
设计报告条理清晰、重点突出
20分
有一定创新性、难易程度
10分
成绩:
指导教师签字:
任务下达日期:12 月6日
评定日期:
目 录
1.设计目的................................................................. 4
2.设计要求................................................................ 4
3.设计方案 ................................................................4
4.设计内容 ................................................................7
4.1系统的主要结构和类结构..................................................7
4.2 (2)五子棋类的结构.......................................................7
4.3 ⑶ 系统工作流程介绍.................................................... 7
4.4 ⑷ 类的介绍.............................................................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 <<' '; }
else
std::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)通过此次课程设计,让我产生对益智游戏编程的兴趣,尤其是当我真正把那程序运行出来时,那种兴奋劲,无法比拟。
2)在这次课设的过程中当然也让我学到了很多东西,让我学到了很多课外的相关C++高层次的东西,当然其中也复习到了C++知识,尤其是通过类的运用,更让我体会面向对象在编程的过程中的作用。
3 )由于能力所限,所以该五子棋个相关功能还比较少,代码还过于冗长,我相信接下去只要我继续努力,一定可以克服次问题。
参考文献
[1] 廉师友编著,C++面向对象程序设计简明教程,西安电子科技大学出版社,1998
[2] 李师贤等编著,面向对象程序设计基础,高等教育出版社,1998
[3] 谭浩强编著,C++程序设计,清华大学出版社,2004
附加源代码
#include<iostream>
using namespace std;
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();//显示开始菜单界面
};
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++;
}
}
void five::menu()//进入菜单界面
{ char *q=new char[9];
cin>>q;
if(strcmp(q,"c"))
five::showqipan();
}
void five::showqipan() //输出20行20列的坐标数值
{ int p=0,q=0;
for(int i = 0 ; i <= 20 ; i++)
{ if(p<10)
{ std::cout << p <<' '; }
else
std::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;
}
}
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;
}
bool five::IsmnWin() //黑棋获胜实现函数
{ int num1=1,num2=1,num3=1,num4=1;
for(int i = m ; i < m+5&& m+5<20 ; i ++)
{ if(qipan[n-1][i] != '*') break;
if(qipan[n-1][i] == '*') num1++;
}
for(i = m-2; i >= 0 ; i --)
{ if(qipan[n-1][i] != '*') break;
if(qipan[n-1][i] == '*') num1++;
}
for( i = n ; i < n+5 ; i ++)
{ if(qipan[i][m-1] != '*') break;
if(qipan[i][m-1] == '*') num2++;
}
for(i = n-2; i >= 0 ; i --)
{ if(qipan[i][m-1] != '*') break;
if(qipan[i][m-1] == '*') num2++;
}
for(i = 0 ; i < 5 && m+i<20 && n+i<20; i++ )
{ if(qipan[n+i][m+i] != '*') break;
if(qipan[n+i][m+i] =='*') num3++;
}
for(i = 0 ; m - i -2>=0 && n-i-2>=0 && i < 5;i++ )
{ if(qipan[n-i-2][m-i-2] != '*') break;
if(qipan[n-i-2][m-i-2] == '*') num3++;
}
for(i = 0 ; m + i < 20 && n - i - 2 >= 0 && i < 5;i ++)
{ if(qipan[n-i-2][m+i] != '*') break;
if(qipan[n-i-2][m+i] == '*') num4++;
}
for(i = 0 ; n + i < 20 && m - i - 2 >= 0 && i < 5;i ++)
{ if(qipan[n+i][m-i-2] != '*') break;
if(qipan[n+i][m-i-2] == '*') num4++;
}
if(num1>=5||num2>=5||num3>=5||num4>=5) return 1;
else return 0;
}
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
展开阅读全文