摘  要

迷宫最早出现在古希腊神话中。

据说,半人半神的英雄西修斯 (Theseus) 在克里特的迷宫中勇敢地杀死半人半牛的怪物,并循着绳索 (Ariadne 抓住另一头 ) 逃出迷宫。 希腊史学家希罗多德曾探访过那里。他描述说,整个迷宫由 12 座带顶院落构成,所有院落都由通道连接,形成 3000 个独立的“室”。据说,建造这座迷宫用的人力和财力“超过了希腊所有的建筑”。后来的参观者也说,一旦进入迷宫,如果没向导,根本无望走出。若不是知情人泄露了地图,盗墓者可能永远也无法探明克里特迷宫。

现在,在人们的生活中,迷宫随处可见,它在各个领域被广泛应用。本程序就是利用C语言知识和数据结构算法所做成的简易迷宫。

关键词:迷宫  C语言 数据结构

章  绪  论

1.1 课设主要研究问题

二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。

递归是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。

1.2 课设应用的理论知识

二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按"行优先顺序"存储时则元素a[i][j]的地址,按"列优先顺序"存储时的地址。存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节。递归,就是在运行的过程中调用自己。而构成递归需具备的条件以函数嵌套调用过程示例:1. 子问题须与原始问题为同样的事,且更为简单;2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

第二章  课设实现过程

2.1 实现所需算法

2.2 实现具体过程

Maze方法写入迷宫实现创建:

int createMaze();

int createFreeMaze();

void createWall();

int visit(int row2, int col2) ;

int startI = 1, startJ = 1;

int success = 0;

int maze[100][100];

int row = 0;

int col = 0;

//迷宫矩阵,2代表墙壁,0代表通道

void createWall()

{

for(int i = 0; i < col; i++)//行

maze[0][i] = 2;

for(int i = 1; i < row; i++)//列

maze[i][0] = 2;

for(int i = 1; i < col; i++)//最后一行

maze[row-1][i] = 2;

for(int i = 1; i < row-1; i++)//最后一列

maze[i][col-1] = 2;

递归方法调用函数(四个方向):

int visit(int row2, int col2)

{

int endI = row-2, endJ = col-2;

maze[row2][col2] = 1;

if(row2 == endI && col2 == endJ)

success = 1;

if(success != 1 && maze[row2][col2+1] == 0)

visit(row2, col2+1);

if(success != 1 && maze[row2+1][col2] == 0)

visit(row2+1, col2);

if(success != 1 && maze[row2][col2-1] == 0)

visit(row2, col2-1);

if(success != 1 && maze[row2-1][col2] == 0)

visit(row2-1, col2);

if(success != 1)

maze[row2][col2] = 0;

return success;

}

显示迷宫的界面

int main(void)

{

int i, j;

printf("请输入迷宫行数row(0<row<100):");

scanf("%d",&row);

printf("请输入迷宫列数col(0<col<100):");

scanf("%d",&col);

createWall();//创建迷宫外墙

int choice;

printf("请选择创建随机迷宫还是自定义迷宫(1为随机迷宫,2为自定义迷宫):");

scanf("%d",&choice);

if(choice == 1)

{

createMaze();   //创建迷宫

}

else if(choice == 2)

{

printf("\n请输入自定义迷宫的墙壁和通道,2代表墙壁,0代表通道\n");

createFreeMaze();

}

printf("\n显示迷宫:\n");

for(i = 0; i < row; i++)

{

for(j = 0; j < col; j++)

{

if(maze[i][j] == 2)

printf("█");

else

printf("  ");

}

printf("\n");

}

if(visit(startI, startJ) == 0)

{

printf("\n没有找到出口!\n");

}

else

{

printf("\n显示路径:\n");

for(i = 0; i < row; i++)

{

for(j = 0; j < col; j++)

{

if(maze[i][j] == 2)

printf("█");

else if(maze[i][j] == 1)

printf("◇");

else

printf("  ");

}

printf("\n");

}

}

system("pause");

return 0;

}

2.3 实现结果

用户首先根据提示输入迷宫行数列数,再选择创建随机迷宫还是自定义迷宫(1为随机迷宫,2为自定义迷宫)。

如果创建随机迷宫输入1,接下来程序会自动创建随机迷宫,并对迷宫进行寻找出口操作,有出口则显示含有出口路径的迷宫图,没有出口则显示:没有找到出口!

如果创建自定义迷宫,则根据提示输入代表墙壁的2或者代表通道的0组成迷宫,

有出口则显示含有出口路径的迷宫图,没有出口则显示:没有找到出口!

1、有出口的自定义迷宫

2、没有出口的随机迷宫

3、有出口的随机迷宫

程序代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int createMaze();       //创建随机迷宫
int createFreeMaze();   //创建自定义迷宫
void createWall();      //创建迷宫外墙
int visit(int row2, int col2) ;int startI = 1, startJ = 1;          // 入口
int success = 0;
//迷宫数组
int maze[100][100];
int row = 0;
int col = 0;
//迷宫矩阵,2代表墙壁,0代表通道//创建迷宫外墙
void createWall()
{//创建迷宫外墙,第一行、第一列、最后一行、最后一列均为墙壁for(int i = 0; i < col; i++)//第一行maze[0][i] = 2;for(int i = 1; i < row; i++)//第一列maze[i][0] = 2;for(int i = 1; i < col; i++)//最后一行maze[row-1][i] = 2;    for(int i = 1; i < row-1; i++)//最后一列maze[i][col-1] = 2;
}//创建随机迷宫
int createMaze()
{srand(time(0));for(int i = 1; i < row-1; i++){for(int j = 1; j < col-1; j++){if((rand()%100+1) % 2 == 0)maze[i][j] = 0;elsemaze[i][j] = 2;}}maze[1][1] = 0;maze[row-2][col-2] = 0;
}//创建自定义迷宫
int createFreeMaze()
{for(int i = 1; i < row-1; i++){//第一行,第一格为入口if(i == 1){printf("迷宫第%d行,共%d格:  ",i,col-3);for(int j = 2; j < col-1; j++)scanf("%d",&maze[i][j]);}//最后一行,最后一格为出口else if(i == row-2)  {printf("迷宫第%d行,共%d格:",i,col-3);for(int j = 1; j < col-2; j++)scanf("%d",&maze[i][j]);}else{printf("迷宫第%d行,共%d格:",i,col-2);for(int j = 1; j < col-1; j++)scanf("%d",&maze[i][j]);}}maze[1][1] = 0;           //入口为通道maze[row-2][col-2] = 0;   //出口为通道
}int visit(int row2, int col2)
{ int endI = row-2, endJ = col-2;      // 出口//该点走过,标记为1maze[row2][col2] = 1; //走到终点,成功if(row2 == endI && col2 == endJ)success = 1; //向四个方向递归调用函数visit()if(success != 1 && maze[row2][col2+1] == 0) visit(row2, col2+1); if(success != 1 && maze[row2+1][col2] == 0) visit(row2+1, col2); if(success != 1 && maze[row2][col2-1] == 0) visit(row2, col2-1); if(success != 1 && maze[row2-1][col2] == 0) visit(row2-1, col2); //该点走过,但没成功,则该点重新置为0if(success != 1) maze[row2][col2] = 0; return success;
} int main(void)
{ int i, j;printf("请输入迷宫行数row(0<row<100):");    scanf("%d",&row);printf("请输入迷宫列数col(0<col<100):");scanf("%d",&col);createWall();//创建迷宫外墙int choice;printf("请选择创建随机迷宫还是自定义迷宫(1为随机迷宫,2为自定义迷宫):");scanf("%d",&choice);if(choice == 1){createMaze();   //创建迷宫}else if(choice == 2){printf("\n请输入自定义迷宫的墙壁和通道,2代表墙壁,0代表通道\n");createFreeMaze();}printf("\n显示迷宫:\n"); for(i = 0; i < row; i++){ for(j = 0; j < col; j++) {if(maze[i][j] == 2) printf("█"); else printf("  "); }printf("\n"); }if(visit(startI, startJ) == 0){printf("\n没有找到出口!\n"); }else { printf("\n显示路径:\n"); for(i = 0; i < row; i++) { for(j = 0; j < col; j++){ if(maze[i][j] == 2) printf("█"); else if(maze[i][j] == 1) printf("◇"); else printf("  "); } printf("\n"); } }system("pause");return 0;
}

数据结构-走迷宫游戏相关推荐

  1. c语言大作业走迷宫,基于C语言实现简单的走迷宫游戏

    本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解. 学数据结构时用"栈"写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点. #includ ...

  2. Dev-c++编写走迷宫游戏 思路和代码 详解

    创作背景 今天又是放元旦假的一天,无聊的我刷够了手机,就跑过去打开电脑······ 熟悉的Dev-c++图标又映入我的眼帘,今天编点什么呢······ 我绞尽脑汁,冥思苦想,终于想到了一个游戏--走迷 ...

  3. 遗传算法在走迷宫游戏中的应用

    我的数据挖掘算法库:https://github.com/linyiqun/DataMiningAlgorithm  我的算法库:https://github.com/linyiqun/lyq-alg ...

  4. c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc

    计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...

  5. fla 走迷宫游戏 源码_迷宫新玩法,果断一试

    迷宫, 真的是谜一样的存在, 大到几十岁的成年人, 小到三岁小儿, 都对其没有抵抗力. 而迷宫君也是真给力, 除了能给人带来愉悦感与成就感, 还能同时锻炼专注力.空间感.思维力.视觉追踪等, 是儿童感 ...

  6. c语言走迷宫游戏代码

    废话不多说,直接上代码(版本:v1.0.8) #include <stdio.h> #include <stdlib.h> #include <windows.h> ...

  7. C++算法实现走迷宫游戏,10分钟学会迷宫算法!

    本文实例为大家分享了C++实现走迷宫的具体代码,供大家参考,具体内容如下 用n*n个小方格代表迷宫,每个方格上有一个字符0或1,0代表这个格子不能走,1代表这个格子可以走.只能一个格子一个走,而且只能 ...

  8. 520,花一夜给女神写走迷宫游戏

    以前虽然写过走迷宫,很多人反映没找到代码不会部署,没看明白原理,这次把更详细写出优化并将代码放到github,趁着520可以自己放一些图片献给女神! 起因 先看效果图(文末有动态图)(在线电脑尝试地址 ...

  9. 用JavaScript canvas做的走迷宫游戏,肝了一下午,请帮忙点个赞!

    引言: 上午女儿跟我去逛超市,在文具区看到一本书,总共有10幅图都是小迷宫游戏,图什么的都挺漂亮,就是有点贵应该是纸比较好,要30多块钱,我就觉得划不来(典型的铁公鸡),我就跟女儿说家里有,买了其他东 ...

  10. 设计一个算法找一条从迷宫入口到出口的最短路径。_我花了一夜用数据结构给女朋友写个H5走迷宫游戏...

    先看效果图(在线尝试请留言): 起因 又到深夜了,我按照以往在公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 超越妹妹时常埋怨,认为数据结构这么抽象难懂的东西没啥作用 ...

最新文章

  1. 微软每年豪砸安全研发 10 亿美元,聊聊背后的技术密码
  2. XAPIAN简单介绍(三)
  3. wxWidgets:wxAuiManager类用法
  4. SharePoint学习札记[4] — 创建SharePoint站点
  5. android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)
  6. python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
  7. JAVA框架--hibernate、struts2、spring
  8. java 数组以逗号分隔_在java中使用逗号分隔符拆分字符串数组
  9. Hacker Plus:Facebook 推出漏洞奖励 “忠诚计划”
  10. python学什么方向就业好_学python就业都有哪些方向
  11. DevC++的一些使用技巧
  12. QT高级编程学习笔记(1)
  13. 使用工具Android Studio实现一个简单的Android版的新闻APP之美
  14. 光伏逆变器MPPT基本算法介绍-李星硕
  15. roseha-mirror oracle数据库同步 可靠性,RoseHA集群:RHEL+RoseMirror+Oracle【1】
  16. icp许可证怎么申请
  17. 雷库兹韦尔量子计算机,人物 | 他说,再挺11年,送你长生不老,要不要?
  18. 计算机名人堂(历届图灵奖获得者)
  19. hdu 杭电1429 胜利大逃亡(续)
  20. 亚甲基蓝在胃肠道恶性肿瘤淋巴结检获中应用价值的Meta分析

热门文章

  1. 新媒体运营这条路好走吗
  2. 四川大学 2012计算机系统结构期末试题,计算机系统结构试题A.doc
  3. Power BI: 安装和设置网关
  4. Doris安全删除BE节点
  5. MySQL+MySQLWorkBench安装和配置
  6. PHP使用swoole实现多人在线聊天室
  7. win8连接wifi成功但受限制_电脑连无线网提示无线网络受限制?路由电脑都重启了没用...
  8. 平衡二叉树——调整变换规则
  9. springboot: mybatis的使用
  10. 2019/9/28_codewars自虐_play_with_digits