一、程序设计思路
1、题目:应用栈实现迷宫游戏
要求:以书中3.2.4节迷宫求解为基础实现迷宫游戏,游戏运行时显示一个迷宫地图(迷宫内容结构可以参照书中图片,也可以自己编写),玩家从地图左上角的入口处进入迷宫,从右下角出口离开迷宫。玩家不能穿墙而过。
2、解决思路
采用“穷举求解”方法,需要用到栈,从入口开始,往四个方向走,依次将走过的坐标点–入栈;如果走到“死路”,就出栈;一一循环;最后栈中保存的就是出迷宫的路线。
3、算法描述
求迷宫中一条从入口到出口的路径的算法可简单描述如下:
设当前位置的初值为入口位置;
do{
若当前位置可通,
则{
将当前位置压至栈顶; //纳入路径
如果当前位置是出口位置,则结束;
否则切换当前位置的东邻方块为新的当前位置;
}
否则,
若栈不为空且栈顶位置尚有其他方向未经探索,
则设定新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻方块;
若栈不为空且栈顶位置的四周均不可通,
则{
删去栈顶位置;
若栈不为空,则重新测试新的栈顶位置,
直至找到一个可通的相邻块或者出栈至栈空;
}
}while(栈不为空);
二、程序源代码
栈部分
#include "stdafx.h" //包含标准C的头文件,stdio.h,string.h等
#include <malloc.h> //动态储存分配函数头文件,用于栈的储存空间分配
#include <stdlib.h> //standard library标准库头文件
typedef int DirectiveType; //下一个通道方向
#define RANGE 100 //迷宫大小
#define STACK_INIT_SIZE 100 //定义栈的初始大小
#define STACKINCREMENT 10 //定义栈的储存增量,在栈长度越界时
typedef int DirectiveType; //下一个通道方向
#define RANGE 100 //迷宫大小
#define ROW 10 //迷宫的行数
#define COL 10 //迷宫的列数
typedef struct
{
int m, n;
int arr[RANGE][RANGE]; //迷宫数组
}MazeType; //迷宫的类型
typedef struct
{
int row; //迷宫中的行
int col; //迷宫中的列
}PosType; //坐标(row,col)
typedef struct
{
int step; //当前位置在路径上的"序号"
PosType seat; //当前的坐标位置
DirectiveType di; //往下一个坐标位置的方向
}SElemType; //栈的元素类型
typedef struct
{
SElemType *base; //栈底
SElemType *top; //栈顶
int stacksize; //栈的大小
}SqStack; //定义