1、问题描述
程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。
基本要求:
- 老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;
- 迷宫的墙足够结实,老鼠不能穿墙而过;
- 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,并给出一条路径,否则提示失败。
提高要求:
- 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;
- 增加闯关和计分功能;
- 找出走出迷宫的所有路径,以及最短路径。
。
2.需求分析
软件的基本功能:通过键盘控制光标移动实现老鼠在迷宫中的行走、全部路径和最短路径的显示、自定义地图(墙变路,路变墙)。在老鼠闯关只能在地图显示是路的地方行走,不能穿墙,有计时功能,当时间结束时若没有到达指定地点,显示game over,查看排行榜,游戏结束,若成功到达指定位置,进去下一关,直到所有关结束,程序结束;.
输入/输出形式:用户可以通过控制台,根据输入提示。
输入形式:
- 方向键、空格键、enter键
输出形式:
- 输出地图菜单。
- 输出地图
- 输出是否成功信息、输出排行榜
3.概要设计
(1)主程序流程
图1:主程序流程图
(3)模块调用关系 :
本程序中函数包括:main函数,menu函数,menu2函数,mouse类内函数,path类内函数,change函数,
函数调用关系如下:
图2:函数调用关系
4.详细设计
(1)实现概要设计的数据类型:
Mouse类
class mouse
{
private:
int m_x;
int m_y;
time_t begin ,stop;
public:
int move_up(int map[x][y],int end);//向上移动
int move_down(int map[x][y],int end);//向下移动
int move_left(int map[x][y],int end);//左
int move_right(int map[x][y],int end);//右
void initialize(int map[x][y],int end){ m_x=S;m_y=S;map[end][end]=9;}
void print(int map[x][y],int end);//打印地图
void operate(int map[x][y],int end,char name[30]);//操作
void success();
void charts(char Name[30]);//排行榜
};
Path类
class Path
{public:
Path(){pa=1000;}
void path(int i,int j,int map[x][y],int &t,int end);
int check(int i, int j, int d, int map[x][y],int end);
void Print2(int map[x][y], int &t,int end);//打印每条路径
void allpath(int s,int e,int map[x][y],int &t,int end);
private:
int pa;
};
(2)主程序以及其它模块的算法描述:
主函数具体代码 :
int main()
{
menu();
file(1);
v: if(menu2(1,11)==1)//1,返回当前关卡菜单,0,进入下一关卡
goto v;
v2: file(2);
if(menu2(2,12)==1)
goto v2;
v3: file(3);
if(menu2(3,13)==1)
goto v3;
v4: file(4);
if(menu2(4,15)==1)
goto v4;
v5: file(5);
if(menu2(5,18)==1)
goto v5;
final();
return 0;
}
Menu2 函数具体代码
int menu2(int t,int e)
{
mouse mickey;
Path path;
int p=0;
system("cls");
Loc1(15,3);
cout〈〈"Welcome"<<Name;
Loc1(15,5);
cout<<"△▼△▼第"〈〈t〈〈"关▼△▼△"<〈endl;
cout<<endl;
a();//菜单初始状态
char k;
int sel=1;//选中第一项
while(1){
k=getch();//移动上下方向键
switch(k){
case 72://上移
if(sel〉1)
{
sel--;
if(sel==1)
a();
else if(sel==2)
b();
else if(sel==3)
c();
else if(sel==4)
d();
else if(sel==5)
menue();
}
break;
case 80: //下移
if(sel<6)
{
sel++;
if(sel==1)
a();
else if(sel==2)
b();
else if(sel==3)
c();
else if(sel==4)
d();
else if(sel==5)
menue();
}
break;
case 13://回车确定选择
if(sel==1)//开始闯关
{
mickey.operate(MAP,e,Name);
return 0;
}
else if(sel==2)//查看所有路径和最短路径
{
system("cls");
path。allpath(9,9,MAP,p,e);
return 1;
}
else if(sel==3)//更改地图
{
change(2*(18---e),18-e,e);
return 1;
}
else if(sel==4)//查看排名
{
mickey。charts(Name);
return 1;
}
else if(sel==5)//退出
{
exit(0);
}
}
}
}
这个函数主要调用了各实现功能函数。其步骤为:用户进入菜单选项,方向键控制选中选项移动,enter进入选中选项。
(3) 其它模块的算法描述
控制老鼠移动函数
功能:方向键移动老鼠.(上方向键进入Move_up函数)
if(map[m_x-1][m_y]==1)
return 0;
else if(map[m_x-1][m_y]==9)
{
map[m_x][m_y]=0;
m_x------;
map[m_x][m_y]=3;
return -1;
}
else{
map[m_x][m_y]=0;
Y=-1;
X=0;
Loc(2*m_y,m_x);
cout<〈" ";
Loc(2*m_y+X,m_x+Y);
cout〈<"♂";
m_x--;
map[m_x][m_y]=3;
求全部路径
功能:输出迷宫所有路径
int dir[4][2]={{-1,0},{1,0},{0,-1},{0, 1}};//上下左右
int d,tx,ty,p;
for(d=0;d〈4;d++)
{
if(check(i,j,d,map,end)==1)//检查是否可以走
{
tx=i+dir[d][0];
ty=j+dir[d][1];
p=map[tx][ty];//记录状态
map[tx][ty]=4;//标记路径
map[end][end]=0;
if(tx==end&&ty==end)//终点
{
t++ ;//路径条数加一
Print2(map,t,end);//终点
}
else
{
path(tx,ty,map,t,end);
map[tx][ty]=p;
}
}
更改地图功能
char key;
Loc2(sx,sy);
while(1){
key=getch();
switch(key){
case 72:
Loc2(sx,--sy);
break;
case 80:
Loc2(sx,sy++);
break;
case 75:
Loc2(sx---=2,sy);
break;
case 77:
Loc2(sx+=2,sy);
break;
case 32:
if(MAP[sy][sx/2]==1)
{
MAP[sy][sx/2]=0;
Loc1(sx,sy);
cout<<" ";
Loc1(sx,sy);
}
else if(MAP[sy][sx/2]==0)
{
MAP[sy][sx/2]=1;
Loc1(sx,sy);
cout<<"■";
Loc1(sx,sy);
}
break;
case 13:
return ;
default:
break;
5、编码与调试分析
1.编码与调试过程中遇到的问题及解决办法 :
【问题一】通过清屏打印地图实现老鼠移动,屏幕闪烁严重
解决办法:分析得知,通过移动光标打印老鼠位置,可以解决屏闪问题
解决此问题的核心代码:
COORD pos = {a,b};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
2.待解决问题 :
①时间不能实现连续变化
3 、使用说明
进入菜单,根据提示进行选择:
方向键选择,enter键进入
6 、测试结果
略
7、自学知识
在课程设计过程中,特别是在代码编写和调试的过程中,自学了很多新的知识.例如Loc()函数,包含于表头文件 #include <window.h> 。 其功能是: 移动光标位置,更改控制台输出颜色.
还有一个知识点是清屏函数,它也是包含于〈stdlib。h〉头文件中的, 使用形式为system("CLS")。主要功能就是清空屏幕。
8、课程设计心得体会
课程设计是一次可以让我们所学的理论与实际相结合的机会。我们选择了迷宫游戏这一题目。我这次的程序准确来说还算不上一个游戏,刚开始想要自学MFC因为时间原因没有实现,这是一个遗憾。但学习不会随着课设的结束而结束,课程也给我指明了未来努力的方向.课程中最大的困难还是一些难以查出的错误,编译时查不出的错误,其被发现时很可能只是位置的错误,仅隔数行,这些微小的信息却极大地影响了整体的效果.这不仅存在于一个程序之中,因而我对于生活中的细节也有了改观,对于整体和局部的观念也有了更多的见解.
参考书:
[1]《c++面向对象程序设计》 清华大学出版社 谭浩强著
[2]《数据结构(C++版)》清华大学出版社 王红梅、胡明、王涛著