| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1236 人关注过本帖
标题:用C++写的老鼠钻迷宫,请大家指点
取消只看楼主 加入收藏
yuleol
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-12-10
收藏
 问题点数:0 回复次数:1 
用C++写的老鼠钻迷宫,请大家指点

/*---------------------------
迷宫用字符型二维数组存储;
迷宫随机生成;
其中"*"表示墙;
" "(空格表示路);
"+"表示走过的有用的路;
"="表示走过的无用的路;
"^"表示当前老鼠所在位置;
TIMEMAX可以设定执行速度;
编译环境VC++6.0;
----------------------------*/
#include<iostream>
using namespace std;
#include<process.h>
#include <stdio.h>
#include<time.h>
#define TIMEMAX 6000
#define OK 0
#define ERROR -1
#define UP 1 //用于存储方向的常量
#define DOWN 2
#define LEFT 3
#define RIGHT 4
char a[15][60]; //定义存储迷宫用的字符型二维数组
/*定义存储走过路线的栈*/
typedef struct SNode{
int data;
struct SNode *next;
}SNode;
typedef struct {
int length;
SNode *top;
}STACK;

/*显示迷宫函数*/
void ShowMaze()
{
int i,j;
system("cls.exe");//清屏
for(i=0;i<15;i++)
{
for(j=0;j<60;j++)
cout<<a[i][j];
cout<<"\n";
}
cout<<"*表示墙 ^表示老鼠 空格表示路 +表示有用的路 =表示无用的路"<<endl;
}

/*迷宫初始化函数*/
void InitMaze()
{
int n,i,j;
for(i=0;i<15;i++)
for(j=0;j<60;j++)
a[i][j]='*';
srand((unsigned)time(NULL));//随机函数作种
for(i=1;i<14;i++)//for开始
for(j=1;j<59;j++)
{
n=rand()%21;//随机函数
if(n<17) a[i][j]=' ';
}//for结束
a[1][0]=' ';//给迷宫留入口
a[1][1]=' ';
a[1][2]=' ';
a[1][3]=' ';
a[13][56]=' ';//给迷宫留出口
a[13][57]=' ';
a[13][58]=' ';
a[13][59]=' ';
}

/*栈初始化*/
void InitStack(STACK *S)
{
S->top=NULL;
S->length=NULL;
}

/*元素e入栈*/
int Push(STACK *S,int e)
{
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
if(!p) return ERROR;
p->data=e;
p->next=S->top;
S->top=p;
S->length++;
return OK;
}

/*栈顶元素出栈,e带回栈顶元数*/
int Pop(STACK *S,int *e)
{
SNode *p;
if(S->top==NULL) return ERROR;
p=S->top;
*e=p->data;
S->top=p->next;
S->length--;
delete p;
return OK;
}

/*判断S是否为空栈*/
int Empty(STACK S)
{
if(S.top==NULL) return OK;
return ERROR;
}

void main()
{
int i,j,path,speed=0;
long timei,timej;
STACK S;//定义一个用于存储老鼠走过的路线的栈
InitMaze();//随机成生迷宫
InitStack(&S);//初始化栈
i=1;
j=0;
a[i][j]='^';//初始化老鼠位置
ShowMaze(); //显示迷宫
cout<<"请选择速度:1 快速 2较慢 "<<endl;
while(speed!=1 && speed!=2) cin>>speed;
while(i>=0 && i<15 && j>=0 && j<60)//开始钻迷宫
{
ShowMaze(); //显示迷宫
if(speed==2)//选择2较慢时进入空循环延时
for(timei=0;timei<TIMEMAX;timei++)
for(timej=0;timej<TIMEMAX;timej++);//空循环,延时用的!
if(i==13 && j==59)//判断是否到达出口
{
cout<<"老鼠终于逃出来了!有用的步数为:"<<S.length<<endl;
exit(1);
}

if(a[i][j+1]==' ')//向右走一步
{
a[i][j]='+';
j=j+1;
a[i][j]='^';
Push(&S,RIGHT);
}
else
{
if(a[i+1][j]==' ')//向下走一步
{
a[i][j]='+';
i=i+1;
a[i][j]='^';
Push(&S,DOWN);
}
else
{
if(a[i-1][j]==' ')//向上走一步
{
a[i][j]='+';
i=i-1;
a[i][j]='^';
Push(&S,UP);
}
else
{
if(a[i][j-1]==' ')//向左走一步
{
a[i][j]='+';
j=j-1;
a[i][j]='^';
Push(&S,LEFT);
}
else//遇到障碍往回走一步
{
if(Empty(S)==OK) //判断是否回到起点了,是则退出程序
{
cout<<"迷宫没有出路!\n"<<endl;
exit(1);
}
else
{
if(Pop(&S,&path)==OK)//判断能否取回上一步路径
{
switch(path)
{
case LEFT:
a[i][j]='=';
j=j+1;
a[i][j]='^';
break;
case UP:
a[i][j]='=';
i=i+1;
a[i][j]='^';
break;
case DOWN:
a[i][j]='=';
i=i-1;
a[i][j]='^';
break;
case RIGHT:
a[i][j]='=';
j=j-1;
a[i][j]='^';
break;
}//结束分支语句switch
}//结束判断能否取回上一步路径

}

}
}
}
}
}//结束while循环
}

以上程序在VC++6.0上编译通过!~
但是老是觉得这老鼠太笨,用什么算法才能让它聪明点尽量少走弯路呢?
还望各位大虾指点!

搜索更多相关主题的帖子: 迷宫 老鼠 
2005-12-11 04:48
yuleol
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-12-10
收藏
得分:0 
还有,我用一个空循环还达到延时的作用,

在VC++6.0中我试了Sleep();结果编译时出错!提示没有定义!

想问一下,C++标准库里有没有现成的延时函数;

有的话需要包含哪个头文件;


兴趣是我的源动力!
2005-12-11 04:56
快速回复:用C++写的老鼠钻迷宫,请大家指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.078877 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved