小众知识

首页 > 正文

迷宫的源代码!

哪位大哥可以告诉我哪里有迷宫的原代码啊?  


说明:这是我大二开学时候课程设计用c语言做的一个小游戏,在一个.txt文档中放入一个迷宫的初始矩阵(0标识通路,1表示墙),然后运行程序,便可找出迷宫的出路
 

#include"stdio.h"  
#include"windows.h"  
#define max 100        //设置迷宫的最大长和宽  
#define TU '-'         //宏定义当迷宫能够走通时非通路路线的图形  
#define LU '#'         //宏定义当迷宫能够走通时通路路线的图形  
  
/*结构体中node存放群找出路时当前节点的数据,  
zhan[]存放堆栈中的各个节点的数据  
move[]存放上下左右四个方位*/  
struct yu_su  
{  
    int row;  //存放行号  
    int col;  //存放列号  
    int dir;  //存放4个方位, 0为右, 1为下, 2为左, 3为上  
}node,zhan[max],move[4]={{1, 0, 0}, {0, 1, 0}, {-1, 0, 0}, {0, -1, 0}};  
  
/*mi_row存放迷宫的行数, mi_col存放迷宫的列数,make[max][max]对迷宫各个节点是否遍历进行标记*/  
int mi_row = 0, mi_col = 0, mark[max][max];  
  
/*对迷宫进行初始化*/  
int chu_shi(int mi_gong[max][max])    
{  
    int choise,temp_col = 0;  
    char temp;  
    printf("作者:侯青青 \t\t\t\t 完成时间:2010.07.15\n\n");  
    printf(" -------------------------------迷宫游戏开始---------------------------------");    
    printf("\n请在  迷宫矩阵图.txt  文件中输入迷宫");  
    printf("\n迷宫矩阵左上角第一个元素为迷宫入口,右下角最后一个元素为迷宫出口");  
    printf("\n矩阵中数字0代表可通过,数字1代表有障碍物");  
    while(1)                                                   //判断迷宫文件是否已经准备好  
    {  
        printf("\n\n请问是否将迷宫放入  迷宫矩阵图.txt  文件中:");  
        printf("\n  1.已经放入");  
        printf("\n  2.未放入,退出程序将迷宫放入\n\n请选择相应的数字: ");  
        scanf("%d", &choise);  
        if(choise == 1 || choise == 2)  
            break;  
        else  
            printf("\n选择错误,请重新选择!");  
    }  
    if(choise == 2)     //迷宫文件未准备好,退出程序  
    {  
        printf("请按 任意键+回车 退出程序!\n");  
        return 0;  
    }  
    else                //迷宫文件准备好了,从文件中将迷宫读出  
    {  
        FILE *fp;  
        if((fp = fopen("迷宫矩阵图.txt", "r")) == NULL)  //如果不能打开文件,提示用户,并退出程序  
        {  
            printf("\n不能打开 迷宫矩阵图.txt 文件,请检查文件知否存在或正确!");  
            return 0;  
        }  
        while(1) //将迷宫矩阵的行号存入mi_row中,列号存入mi_col中,并检查迷宫矩阵的行列元素数是否都相等  
        {  
            temp = fgetc(fp);  
            if(temp == EOF)  //文件读取完,跳出循环  
            {  
                if(temp_col != mi_col)   //如果迷宫矩阵的列号不是全都相同,显示提示语,并退出程序  
                {  
                    printf("\n迷宫矩阵任意一列的元素个数必须相同,请修改 迷宫矩阵图.txt 中的迷宫图后再运行程序!");  
                    return 0;  
                }  
                else  
                {  
                    mi_row++;  
                    break;  
                }  
            }  
            if(temp != '\n')  
                temp_col++;  
            else   
            {  
                if(temp_col == mi_col)  
                    temp_col = 0;  
                else   
                {  
                    if(mi_col == 0)  
                    {  
                        mi_col = temp_col;  
                        temp_col = 0;  
                    }  
                    else      //如果迷宫矩阵的行号不是全都相同,显示提示语,并退出程序  
                    {  
                        printf("\n迷宫矩阵任意一行的元素个数必须相同,请修改 迷宫矩阵图.txt 中的迷宫图后再运行程序!");  
                        return 0;  
                    }  
                }  
                mi_row++;  
            }  
  
        }//while(1)  
        rewind(fp); //文件指针指向文件开头  
        for(int i = 0; i < mi_row ; i++)  
        {  
            for(int j = 0; j < mi_col ; j++)  
            {  
                temp = fgetc(fp) - 48;  //将迷宫中的ASSIC码转换成数字  
                if(temp != 0 && temp != 1)  
                {  
                    printf("\n文件中的内容只能是0或1,请查看并修改!");  
                    return 0;  
                }  
                else  
                mi_gong[i][j] = temp; //文件中的数没有错误,将其存入到 数组mi_gong[][]中  
                mark[i][j] = 0;       //将文件中每个元素的遍历标记清零  
                zhan[j + i * mi_row].dir = 0; //将 栈 的方向元素清零  
            }  
            fgetc(fp);  
        }  
        fclose(fp);  
    }//while(1)  
    system("cls");  //清屏  
    printf("\n\t\t这是一个 %d行 %d列 的迷宫矩阵!\n", mi_row, mi_col);  
    return 1;  
}  
  
  
/*寻找出路函数,如果存在出路,则把出路打印出来*/  
void chulu(int mi_gong[max][max])  
{  
    /*top为栈定数,found存放出路是否找到的标记,found为1则表示出路找到, 
      dir存放当前元素正遍历的方位,0为右, 1为下, 2为左, 3为上 
      next_row, next_col分别存放当前元素的下一个元素的行列值*/  
    int top = 1, found = 0,dir = 0, next_row, next_col;  
    int choise; //  选择输出  
    zhan[0].row = 0;  //对栈底进行初始化  
    zhan[0].col = 0;  
    zhan[0].dir = 0;  
    mark[0][0] = 1;  //对0行0列元素标记,说明此元素已经遍历  
    while(top > -1 && !found)  //如果栈未假溢出并且迷宫出路没有找到  
    {  
        top--;  
        node = zhan[top]; //将栈顶元素的各项值赋予node  
        dir  = node.dir;     
        while(dir < 4 && !found) //当4个方向没有遍历完,并且迷宫出路没有找到  
        {  
            next_row = node.row + move[dir].row;  //对下一个元素的行值赋值  
            next_col = node.col + move[dir].col;  //对下一个元素的列值赋值  
            if(next_row >= 0 && next_col >= 0)    //下一个元素的行列值没有溢出  
            {  
                if(next_row == mi_row - 1 && next_col == mi_col - 1)  //如果下一个元素为出口  
                    found = 1;  
                else if(!mi_gong[next_row][next_col] && !mark[next_row][next_col]) //如果下一个元素可通,并且未被标记  
                {   
                    mark[next_row][next_col] = 1;   //此元素标记已经遍历  
                    zhan[top].dir = ++dir;          //当前元素的下一个方向赋值给当前元素  
                    top++;                          //将此元素放入栈顶    
                    zhan[top].row = node.row = next_row;  
                    zhan[top].col = node.col = next_col;  
                    dir = 0;                        //方向控制dir清零  
                }  
                else  
                    dir++;  
            }  
            else  
                dir++;  
        }// while(dir < 4 && !found)  
    }//while(top > -1 && !found)  
    if(found)  //如果迷宫出路找到,则将出路输出  
    {  
        char tu[max][max];   //tu[][]存放迷宫的出路路径图中的元素   
        for(int q = 0; q < mi_row; q++)    
            for(int w = 0; w < mi_col; w++)  
                tu[q][w] = TU;  
        printf("\n请选择显示方式:\n  1.显示迷宫出路路径坐标\n  2.显示迷宫出路模拟图\n  0.结束游戏\n");  
        printf("\n请选择相应的数字: ");  
        scanf("%d", &choise);  
        while(choise)  
        {  
            switch(choise)    //选择显示方式  
            {  
            case 1:  
                {  
                    printf("\n出路路径为:");     //输出出路路径  
                    printf("\n行\t列");  
                    for(int i = 0; i <= top; i++)  
                        printf("\n%d\t%d", zhan[i].row+1, zhan[i].col+1);  
                    printf("\n%d\t%d",mi_row,mi_col);  
                    choise = 0;  
                    break;  
                }  
            case 2:  
                {  
                    for(int i = 0; i <= top; i++)  
                        tu[zhan[i].row][zhan[i].col] = LU;  
                    tu[mi_row - 1][mi_col - 1] = LU;          
                    printf("\n迷宫的出路模拟图为\n");  
                    for(q = 0; q < mi_row; q++)    //将出路路线图输出  
                    {  
                        for(int w = 0; w < mi_col; w++)  
                                printf("%c ",tu[q][w]);  
                        printf("\n");  
                    }  
                    choise = 0;  
                    break;  
                }  
            default:  
                {  
                    printf("输入错误,请重新输入!\n");  
                    scanf("%d", &choise);  
                }  
            }//switch(choise)  
        }//while(choise)  
    }//if(found)  
    else    //如果迷宫出路没有找到,提示输出  
        printf("\n 此迷宫没有出路!\n");  
}  
  
int main()  
{  
    int mi_gong[max][max];  
    if(chu_shi(mi_gong) == 0)//如果迷宫的初始化失败,则退出程序  
    {  
        getchar();getchar();  
        return 0;  
    }  
    printf("\n迷宫的初始状态为:\n");  
    for(int i = 0; i < mi_row; i++) //迷宫的初始化成功,输出迷宫的初始状态  
    {  
        for(int j = 0; j < mi_col; j++)  
            printf("%d ",mi_gong[i][j]);  
        printf("\n");  
    }  
    chulu(mi_gong);  //调用寻找出路函数  
    printf("\n-----------------------------游戏结束---------------------------------");  
    printf("\n\n\t\t\t\t\t\t作者:侯青青\n\t\t\t\t\t\t完成时间:2010.07.15");  
    getchar();getchar();  
    return 0;  
}  

 scie 发表于:2003-01-03 15:16:01
得分:0 

找一本数据结构的书(最好是C语言版),看看堆栈部分,一般有迷宫问题的讲解。 

 zihuilegend 发表于:2003-01-05 21:29:09
得分:0 

多给点分再贴帖子,这么少的分找这么牛的程序,没人理吧!
加些分。我给你 

 gaocs1102 发表于:2003-01-06 20:08:33
得分:0 

我有一个,我想做一个能和图连起来的. 

 wincf 发表于:2003-01-07 22:54:05
得分:20 

#include 
#include 
#include 
#include 
#include 
#include "utility.h"
using namespace std;

#define max_int 2147483847
#define unsolve 0
#define success 1
#define fail 2
#define MAXSIZE 100
//#define wall 2
//#define space 3

int maze[MAXSIZE+2][MAXSIZE+2];
int mark[MAXSIZE+2][MAXSIZE+2];

struct item
{
int x;
int y;
int dir;
};

/****************************************************************************************************/

class Random
{
public:
Random(bool pseudo=true);
int random_integer(int low,int high);
double random_real();
private:
int reseed();
int seed,multiplier,add_on;
};

int Random::reseed()
{
seed=seed*multiplier+add_on;
return seed;
}

Random::Random(bool pseudo)
{
if(pseudo) seed=1;
else seed=time(NULL)%max_int;
multiplier=2743;
add_on=5923;
}

double Random::random_real()
{
double max=max_int+1.0;
double temp=reseed();
if (temp<0)
temp=temp+max;
return temp/max;
}

int Random::random_integer(int low,int high)
{
if (low>high)
return random_integer(high,low);
else
return ((int)((high-low+1)*random_real()))+low;
}

/****************************************************************************************************/

class Maze
{
public:
Maze();
void initial();
void solve();
void print();
void print(stack &s);
private:
int rows;
int cols;
int result;
};

Maze::Maze()

for(int i=0;i{
for(int j=0;j{
maze[i][j]=1;
}
}
for(i=0;i{
for(int j=0;j{
mark[i][j]=0;
}
}
//result=unsolve;
}

void Maze::initial()
{
int row,col,rate;
Random ran;

do{
cout<<"Please input the row size (1->"<cin>> row;
}while (row<1||row>MAXSIZE);
rows = row;

do{
cout<<"Please input the col size (1->"<cin>> col;
}while (col<1||col>MAXSIZE);
cols = col;

do{
cout<<"Please input the rate (0->100): "<cin>> rate;
}while (rate<0||rate>100);

for(int i=1;i<=row;i++) //initialize the maze array
{
for(int j=1;j<=col;j++)
{
maze[i][j]=0;
}
}
for (int k=0;k<=row*col*rate/100;k++) //create a maze randomly
{
int x=ran.random_integer(1,row);
int y=ran.random_integer(1,col);
maze[x][y]=1;
}
maze[1][1]=2; //Entrance
maze[rows][cols]=3; //Exit
result=unsolve;
}

void Maze::solve()
{
struct offsets
{
int a,b;
};
enum directions {SE,S,SW,W,NW,N,NE,E}; 
offsets move[8];
move[SE].a=1;move[SE].b=1;
move[S].a=1;move[S].b=0;
move[SW].a=1;move[SW].b=-1;
move[W].a=0;move[W].b=-1;
move[NW].a=-1;move[NW].b=-1;
move[N].a=-1;move[N].b=0;
move[NE].a=-1;move[NE].b=1;
move[E].a=0;move[E].b=1;
    /***********************/
mark[1][1]=1;
stack s;
item test;
test.x=1;test.y=1;test.dir=SE; //:1st position
s.push(test);
while (!s.empty())
{
test=s.top();
s.pop();
int i=test.x;int j=test.y;int d=test.dir;
while(d<8)
{
int newi=i+move[d].a;int newj=j+move[d].b;
if((newi==rows)&&(newj==cols)) //find a way out
{
maze[i][j]=4;
while (!s.empty())
{
test=s.top();
maze[test.x][test.y]=4;
s.pop();
}
result=success;
maze[1][1]=2;
return;
}
if(maze[newi][newj]==0&&mark[newi][newj]==0) //new position
{
mark[newi][newj]=1;
test.x=i;test.y=j;test.dir=d+1;
//test.x=i;test.y=j;test.dir=d;
s.push(test);
i=newi;j=newj;d=SE;
//print(s);
//getchar();
}
else
d++;
}
maze[i][j]=-1;
}
result=fail;
return;
while(!s.empty()) //empty the stack
{
s.pop();

}

void Maze::print()
{
if (result==unsolve) //after initilize
{
cout<<"The maze is:"<for(int m=0;m<=rows+1;m++)
{
for(int n=0;n<=cols+1;n++)

if(maze[m][n]==4)
cout<<">";
else if(maze[m][n]==1)
cout<<"#";
else if(maze[m][n]==2)
cout<<"+";
else if(maze[m][n]==3)
cout<<"!";
else
cout<<" ";
}
cout<<'\n';
}
cout<<'\n';
}
else if (result==success) //when success
{
cout<<"The solution is:"<for(int m=0;m<=rows+1;m++)
{
for(int n=0;n<=cols+1;n++)
{
if(maze[m][n]==4)
cout<<">";
else if(maze[m][n]==1)
cout<<"#";
else if(maze[m][n]==2)
cout<<"+";
else if(maze[m][n]==3)
cout<<"!";
else
cout<<" ";
}
cout<<'\n';
}
cout<<'\n';
}
else if (result==fail) //when fail
{
cout<<"No solution available!!!"<}
}


void Maze::print(stack &s)
{
stack temps;
temps=s;
item test;
while(!temps.empty()){
test=temps.top();
maze[test.x][test.y]=4;
temps.pop();
}

if (result==unsolve) //after initilize
{
cout<<"The maze is:"<for(int m=0;m<=rows+1;m++)
{
for(int n=0;n<=cols+1;n++)
{
if(maze[m][n]==4)
cout<<">";
else if(maze[m][n]==1)
cout<<"#";
else if(maze[m][n]==2)
cout<<"+";
else if(maze[m][n]==3)
cout<<"!";
else
cout<<" "; 
}
cout<<'\n';
}
cout<<'\n';
}
else if (result==success) //when success
{
cout<<"The solution is:"<for(int m=0;m<=rows+1;m++)
{
for(int n=0;n<=cols+1;n++)
{
if(maze[m][n]==4)
cout<<">";
else if(maze[m][n]==1)
cout<<"#";
else if(maze[m][n]==2)
cout<<"+";
else if(maze[m][n]==3)
cout<<"!";
else
cout<<" ";
}
cout<<'\n';
}
cout<<'\n';
}
else if (result==fail) //when fail
{
cout<<"No solution available!!!"<}
}

/****************************************************************************************************/

void main()
{
do{
Maze puzzle; 
puzzle.initial();
puzzle.print();
cout<<"Press Enter for solution..."<if (getchar())
{
if (getchar())
{
puzzle.solve();
puzzle.print();
}
}
cout<<"Do you want to continue"<}while(user_says_yes());
}




////////////////////// utility.h
using namespace std;
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
bool user_says_yes();

enum Error_code {success,fail,range_error,underflow,overflow,fatal,not_present,duplicate_error,
entry_inserted,entry_found,internal_error};

bool user_says_yes()
{
int c;
bool initial_response=true;
do{
if (initial_response)
cout<<"(y,n)?"<else
cout<<"Respond with either y or n:"<do{
c=cin.get();
}while(c=='\n'||c==' '||c=='\t');
initial_response=false;
}while (c!='y'&&c!='Y'&&c!='n'&&c!='N');
return (c=='y'||c=='Y');
}

 qrlvls 发表于:2003-01-08 20:50:29
得分:0 

数据结构里面有,主要是讲堆栈的那几篇! 

 ftp123 发表于:2003-01-09 03:38:33
得分:0 

嘿嘿,人家是作业,你给源玛啊 

 SUNXLLEE 发表于:2003-01-09 20:40:22
得分:0 

不是吧,这么长的程序,感觉就是递归和几面“旗帜”就可以搞定的了。 

 yelong 发表于:2003-01-09 23:04:56
得分:0 

多谢!值得参考!

 zhaohangcom 发表于:2003-02-28 15:54:45
得分:0 


上一篇:如何设计只能得到一个实例的类?
下一篇:20分是开头 假如能给我说明白我送100分热心朋友进来看看

分享到: