数据结构-走迷宫游戏
摘 要
迷宫最早出现在古希腊神话中。
据说,半人半神的英雄西修斯 (Theseus) 在克里特的迷宫中勇敢地杀死半人半牛的怪物,并循着绳索 (Ariadne 抓住另一头 ) 逃出迷宫。 希腊史学家希罗多德曾探访过那里。他描述说,整个迷宫由 12 座带顶院落构成,所有院落都由通道连接,形成 3000 个独立的“室”。据说,建造这座迷宫用的人力和财力“超过了希腊所有的建筑”。后来的参观者也说,一旦进入迷宫,如果没向导,根本无望走出。若不是知情人泄露了地图,盗墓者可能永远也无法探明克里特迷宫。
现在,在人们的生活中,迷宫随处可见,它在各个领域被广泛应用。本程序就是利用C语言知识和数据结构算法所做成的简易迷宫。
关键词:迷宫 C语言 数据结构
二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵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;
}
数据结构-走迷宫游戏相关推荐
- c语言大作业走迷宫,基于C语言实现简单的走迷宫游戏
本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解. 学数据结构时用"栈"写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点. #includ ...
- Dev-c++编写走迷宫游戏 思路和代码 详解
创作背景 今天又是放元旦假的一天,无聊的我刷够了手机,就跑过去打开电脑······ 熟悉的Dev-c++图标又映入我的眼帘,今天编点什么呢······ 我绞尽脑汁,冥思苦想,终于想到了一个游戏--走迷 ...
- 遗传算法在走迷宫游戏中的应用
我的数据挖掘算法库:https://github.com/linyiqun/DataMiningAlgorithm 我的算法库:https://github.com/linyiqun/lyq-alg ...
- c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc
计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...
- fla 走迷宫游戏 源码_迷宫新玩法,果断一试
迷宫, 真的是谜一样的存在, 大到几十岁的成年人, 小到三岁小儿, 都对其没有抵抗力. 而迷宫君也是真给力, 除了能给人带来愉悦感与成就感, 还能同时锻炼专注力.空间感.思维力.视觉追踪等, 是儿童感 ...
- c语言走迷宫游戏代码
废话不多说,直接上代码(版本:v1.0.8) #include <stdio.h> #include <stdlib.h> #include <windows.h> ...
- C++算法实现走迷宫游戏,10分钟学会迷宫算法!
本文实例为大家分享了C++实现走迷宫的具体代码,供大家参考,具体内容如下 用n*n个小方格代表迷宫,每个方格上有一个字符0或1,0代表这个格子不能走,1代表这个格子可以走.只能一个格子一个走,而且只能 ...
- 520,花一夜给女神写走迷宫游戏
以前虽然写过走迷宫,很多人反映没找到代码不会部署,没看明白原理,这次把更详细写出优化并将代码放到github,趁着520可以自己放一些图片献给女神! 起因 先看效果图(文末有动态图)(在线电脑尝试地址 ...
- 用JavaScript canvas做的走迷宫游戏,肝了一下午,请帮忙点个赞!
引言: 上午女儿跟我去逛超市,在文具区看到一本书,总共有10幅图都是小迷宫游戏,图什么的都挺漂亮,就是有点贵应该是纸比较好,要30多块钱,我就觉得划不来(典型的铁公鸡),我就跟女儿说家里有,买了其他东 ...
- 设计一个算法找一条从迷宫入口到出口的最短路径。_我花了一夜用数据结构给女朋友写个H5走迷宫游戏...
先看效果图(在线尝试请留言): 起因 又到深夜了,我按照以往在公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 超越妹妹时常埋怨,认为数据结构这么抽象难懂的东西没啥作用 ...
最新文章
- 微软每年豪砸安全研发 10 亿美元,聊聊背后的技术密码
- XAPIAN简单介绍(三)
- wxWidgets:wxAuiManager类用法
- SharePoint学习札记[4] — 创建SharePoint站点
- android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)
- python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
- JAVA框架--hibernate、struts2、spring
- java 数组以逗号分隔_在java中使用逗号分隔符拆分字符串数组
- Hacker Plus:Facebook 推出漏洞奖励 “忠诚计划”
- python学什么方向就业好_学python就业都有哪些方向
- DevC++的一些使用技巧
- QT高级编程学习笔记(1)
- 使用工具Android Studio实现一个简单的Android版的新闻APP之美
- 光伏逆变器MPPT基本算法介绍-李星硕
- roseha-mirror oracle数据库同步 可靠性,RoseHA集群:RHEL+RoseMirror+Oracle【1】
- icp许可证怎么申请
- 雷库兹韦尔量子计算机,人物 | 他说,再挺11年,送你长生不老,要不要?
- 计算机名人堂(历届图灵奖获得者)
- hdu 杭电1429 胜利大逃亡(续)
- 亚甲基蓝在胃肠道恶性肿瘤淋巴结检获中应用价值的Meta分析
热门文章
- 新媒体运营这条路好走吗
- 四川大学 2012计算机系统结构期末试题,计算机系统结构试题A.doc
- Power BI: 安装和设置网关
- Doris安全删除BE节点
- MySQL+MySQLWorkBench安装和配置
- PHP使用swoole实现多人在线聊天室
- win8连接wifi成功但受限制_电脑连无线网提示无线网络受限制?路由电脑都重启了没用...
- 平衡二叉树——调整变换规则
- springboot: mybatis的使用
- 2019/9/28_codewars自虐_play_with_digits