c++迷宫游戏实验报告材料.docx
《c++迷宫游戏实验报告材料.docx》由会员分享,可在线阅读,更多相关《c++迷宫游戏实验报告材料.docx(16页珍藏版)》请在冰豆网上搜索。
c++迷宫游戏实验报告材料
1、问题描述
程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。
基本要求:
(1)老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;
(2)迷宫的墙足够结实,老鼠不能穿墙而过;
(3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,并给出一条路径,否则提示失败。
提高要求:
(1)添加编辑迷宫功能,可修改当前迷宫,修改内容:
墙变路、路变墙;
(2)增加闯关和计分功能;
(3)找出走出迷宫的所有路径,以及最短路径。
。
2.需求分析
软件的基本功能:
通过键盘控制光标移动实现老鼠在迷宫中的行走、全部路径和最短路径的显示、自定义地图(墙变路,路变墙)。
在老鼠闯关只能在地图显示是路的地方行走,不能穿墙,有计时功能,当时间结束时若没有到达指定地点,显示gameover,查看排行榜,游戏结束,若成功到达指定位置,进去下一关,直到所有关结束,程序结束;。
输入/输出形式:
用户可以通过控制台,根据输入提示。
输入形式:
1方向键、空格键、enter键
输出形式:
1输出地图菜单。
2输出地图
3输出是否成功信息、输出排行榜
3.概要设计
(1)主程序流程
图1:
主程序流程图
(3)模块调用关系:
本程序中函数包括:
main函数,menu函数,menu2函数,mouse类内函数,path类内函数,change函数,
函数调用关系如下:
图2:
函数调用关系
4.详细设计
(1)实现概要设计的数据类型:
Mouse类
classmouse
{
private:
intm_x;
intm_y;
time_tbegin,stop;
public:
intmove_up(intmap[x][y],intend);//向上移动
intmove_down(intmap[x][y],intend);//向下移动
intmove_left(intmap[x][y],intend);//左
intmove_right(intmap[x][y],intend);//右
voidinitialize(intmap[x][y],intend){m_x=S;m_y=S;map[end][end]=9;}
voidprint(intmap[x][y],intend);//打印地图
voidoperate(intmap[x][y],intend,charname[30]);//操作
voidsuccess();
voidcharts(charName[30]);//排行榜
};
Path类
classPath
{public:
Path(){pa=1000;}
voidpath(inti,intj,intmap[x][y],int&t,intend);
intcheck(inti,intj,intd,intmap[x][y],intend);
voidPrint2(intmap[x][y],int&t,intend);//打印每条路径
voidallpath(ints,inte,intmap[x][y],int&t,intend);
private:
intpa;
};
(2)主程序以及其它模块的算法描述:
主函数具体代码:
intmain()
{
menu();
file
(1);
v:
if(menu2(1,11)==1)//1,返回当前关卡菜单,0,进入下一关卡
gotov;
v2:
file
(2);
if(menu2(2,12)==1)
gotov2;
v3:
file(3);
if(menu2(3,13)==1)
gotov3;
v4:
file(4);
if(menu2(4,15)==1)
gotov4;
v5:
file(5);
if(menu2(5,18)==1)
gotov5;
final();
return0;
}
Menu2函数具体代码
intmenu2(intt,inte)
{
mousemickey;
Pathpath;
intp=0;
system("cls");
Loc1(15,3);
cout<<"Welcome"<Loc1(15,5);
cout<<"△▼△▼第"<cout<a();//菜单初始状态
chark;
intsel=1;//选中第一项
while
(1){
k=getch();//移动上下方向键
switch(k){
case72:
//上移
if(sel>1)
{
sel--;
if(sel==1)
a();
elseif(sel==2)
b();
elseif(sel==3)
c();
elseif(sel==4)
d();
elseif(sel==5)
menue();
}
break;
case80:
//下移
if(sel<6)
{
sel++;
if(sel==1)
a();
elseif(sel==2)
b();
elseif(sel==3)
c();
elseif(sel==4)
d();
elseif(sel==5)
menue();
}
break;
case13:
//回车确定选择
if(sel==1)//开始闯关
{
mickey.operate(MAP,e,Name);
return0;
}
elseif(sel==2)//查看所有路径和最短路径
{
system("cls");
path.allpath(9,9,MAP,p,e);
return1;
}
elseif(sel==3)//更改地图
{
change(2*(18-e),18-e,e);
return1;
}
elseif(sel==4)//查看排名
{
mickey.charts(Name);
return1;
}
elseif(sel==5)//退出
{
exit(0);
}
}
}
}
这个函数主要调用了各实现功能函数。
其步骤为:
用户进入菜单选项,方向键控制选中选项移动,enter进入选中选项。
(3)其它模块的算法描述
控制老鼠移动函数
功能:
方向键移动老鼠。
(上方向键进入Move_up函数)
if(map[m_x-1][m_y]==1)
return0;
elseif(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;
求全部路径
功能:
输出迷宫所有路径
intdir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//上下左右
intd,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;
}
}
更改地图功能
charkey;
Loc2(sx,sy);
while
(1){
key=getch();
switch(key){
case72:
Loc2(sx,--sy);
break;
case80:
Loc2(sx,sy++);
break;
case75:
Loc2(sx-=2,sy);
break;
case77:
Loc2(sx+=2,sy);
break;
case32:
if(MAP[sy][sx/2]==1)
{
MAP[sy][sx/2]=0;
Loc1(sx,sy);
cout<<"";
Loc1(sx,sy);
}
elseif(MAP[sy][sx/2]==0)
{
MAP[sy][sx/2]=1;
Loc1(sx,sy);
cout<<"■";
Loc1(sx,sy);
}
break;
case13:
return;
default:
break;
5、编码与调试分析
1.编码与调试过程中遇到的问题及解决办法:
【问题一】通过清屏打印地图实现老鼠移动,屏幕闪烁严重
解决办法:
分析得知,通过移动光标打印老鼠位置,可以解决屏闪问题
解决此问题的核心代码:
COORDpos={a,b};
HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
2.待解决问题:
时间不能实现连续变化
3、使用说明
进入菜单,根据提示进行选择:
方向键选择,enter键进入
4、测试结果
(1)进入页面
(2)菜单页面
(3)闯关
(4)打印路径
(5)自定义地图
(6)查看排行榜
8、自学知识
在课程设计过程中,特别是在代码编写和调试的过程中,自学了很多新的知识。
例如Loc()函数,包含于表头文件#include。
其功能是:
移动光标位置,更改控制台输出颜色。
还有一个知识点是清屏函数,它也是包含于头文件中的,使用形式为system("CLS")。
主要功能就是清空屏幕。
9、课程设计心得体会
课程设计是一次可以让我们所学的理论与实际相结合的机会。
我们选择了迷宫游戏这一题目。
我这次的程序准确来说还算不上一个游戏,刚开始想要自学MFC因为时间原因没有实现,这是一个遗憾。
但学习不会随着课设的结束而结束,课程也给我指明了未来努力的方向。
课程中最大的困难还是一些难以查出的错误,编译时查不出的错误,其被发现时很可能只是位置的错误,仅隔数行,这些微小的信息却极大地影响了整体的效果。
这不仅存在于一个程序之中,因而我对于生活中的细节也有了改观,对于整体和局部的观念也有了更多的见解。
参考书:
[1]《c++面向对象程序设计》清华大学出版社谭浩强著
[2]《数据结构(C++版)》清华大学出版社王红梅、胡明、王涛著