迷宫游戏 用栈实现

#include<iostream>
#include<string>
#include<stack>
using namespace std;
#define n 8

stack <int *> s;

int * createMaze(){//初始化迷宫
	int i,j;
	int * a;
	a=new int[n*n];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			*(a+n*i+j)=-1;//不设置为0的原因是超过矩阵范围的位置
		}				//系统默认的是0,会引起麻烦
	}
	*(a+n*0+1)=3;s.push(a+n*0+1);//当前位置入栈
	*(a+n*1+1)=1;*(a+n*1+2)=1;*(a+n*1+3)=1;*(a+n*1+5)=1;
	*(a+n*2+3)=1;*(a+n*2+4)=1;*(a+n*2+5)=1;*(a+n*2+6)=1;
	*(a+n*3+1)=1;*(a+n*3+2)=1;*(a+n*3+3)=1;*(a+n*3+5)=1;
	*(a+n*4+1)=1;*(a+n*4+4)=1;
	*(a+n*5+1)=1;*(a+n*5+2)=1;*(a+n*5+4)=1;*(a+n*5+5)=1;*(a+n*5+6)=1;
	*(a+n*6+2)=1;*(a+n*6+3)=1;*(a+n*6+4)=1;*(a+n*6+6)=1;
	*(a+n*7+6)=1;
	return a;
}
//程序中标记-1,1,2,3,4的值表示意义如下:
//-1:障碍物(方块)
//1:可行走的通道且还未曾被五角星通过
//2:五角星走过的通道(这样说不完全准确),更准确的说是已经压栈的元素(地址)
//3:标识五角星
//4:遇到再也走不通的位置,离开时所填充的障碍(与-1的作用相同,但是不显示出来)

void printMaze(int * a){//打印迷宫
	int i,j;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(*(a+n*i+j)==1||*(a+n*i+j)==2||*(a+n*i+j)==4){
				cout<<"  ";
			}
			else if(*(a+n*i+j)==3){
				cout<<"★";
			}
			else{//*(a+n*i+j)==-1
				cout<<"■";
			}
		}
		cout<<endl;
	}
}

void run(int * a,char ch){
	int i,j;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(*(a+n*i+j)==3){
				switch(ch){
				case ‘w‘:
					if(*(a+n*(i-1)+j)==1){
						*(s.top())=2;
						s.push(a+n*(i-1)+j);//入栈
						*(s.top())=3;
					}
					if(*(a+n*(i-1)+j)==2){
						*(s.top())=-1;
						s.pop();//出栈
						*(s.top())=3;
					}
					return;
				case ‘a‘:
					if(*(a+n*i+j-1)==1){
						*(s.top())=2;
						s.push(a+n*i+j-1);//入栈
						*(s.top())=3;
					}
					if(*(a+n*i+j-1)==2){
						*(s.top())=-1;
						s.pop();//出栈
						*(s.top())=3;
					}
					return;
				case ‘s‘:
					if(*(a+n*(i+1)+j)==1){
						*(s.top())=2;
						s.push(a+n*(i+1)+j);//入栈
						*(s.top())=3;
					}
					if(*(a+n*(i+1)+j)==2){
						*(s.top())=-1;
						s.pop();//出栈
						*(s.top())=3;
					}
					return;
				case ‘d‘:
					if(*(a+n*i+j+1)==1){
						*(s.top())=2;
						s.push(a+n*i+j+1);//入栈
						*(s.top())=3;
					}
					if(*(a+n*i+j+1)==2){
						*(s.top())=-1;
						s.pop();//出栈
						*(s.top())=3;
					}
					return;
				}
			}
		}
	}
}

char getDirection(int * a){//得到方向
	int i,j;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(*(a+n*i+j)==3){
				//必须按优先级排列
				if(*(a+n*i+j+1)==1){
					return ‘d‘;
				}
				if(*(a+n*(i+1)+j)==1){
					return ‘s‘;
				}
				if(*(a+n*i+j-1)==1){
					return ‘a‘;
				}
				if(*(a+n*(i-1)+j)==1){
					return ‘w‘;
				}

				if(*(a+n*i+j+1)==2){
					return ‘d‘;
				}
				if(*(a+n*(i+1)+j)==2){
					return ‘s‘;
				}
				if(*(a+n*i+j-1)==2){
					return ‘a‘;
				}
				if(*(a+n*(i-1)+j)==2){
					return ‘w‘;
				}

				else{
					cout<<"无效按键"<<endl;
				}
			}
		}
	}
}

int handle(){
	int * a;
	int count=1;
	string step;//用string是为了避免用户多输入字符而引起错误
	a=createMaze();
	printMaze(a);
	cout<<"请按任意键进行下一步!"<<endl;
	while(*(a+n*7+6)!=3){
		cout<<"第"<<count<<"步:";
		cin>>step;
		run(a,getDirection(a));
		printMaze(a);
		count++;
	}
	cout<<"恭喜你,顺利到达终点!"<<endl;
	return 0;
}

int main(){
	handle();
	return 0;
}

迷宫游戏 用栈实现,布布扣,bubuko.com

时间: 2024-10-13 12:34:02

迷宫游戏 用栈实现的相关文章

用栈实现迷宫游戏寻路

在我们学习数据结构的时候都曾经见过迷宫游戏,迷宫游戏的实现其实并不难,但是,我们在实现每一个算法的时候都应该想一想这个问题的每一个解.最近,博主已经开始重温数据结构啦,记得我们以前学习这里的时候,老师会用队列来实现迷宫最优解的寻找,氮素呢,博主就是这么可爱,博主就是想试试用栈来找一下. 在实现之前让我们先来复习一下栈的特点:first in last out 对于栈这种数据结构我们只能在栈顶对其操作,根据实际情况可将其实现成链式或者顺序结构.但是一般情况下我们都会实现成顺序结构,因为栈的特点导致

数据结构应用:利用栈破解迷宫游戏

最近刚开始学数据结构,发现数据结构真是个神奇的东西哈,很多现实中的问题都可以用不同的数据结 构来解决,比如利用和栈中缀表达式编写一个计算机程序,利用栈破解迷宫游戏,今天我就来跟大家分 享一下如何利用栈来破解迷宫游戏. 学过数据结构的人都知道,栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.如下图: 而我们在破解迷宫游戏的时候采用的方法是"回溯",也就是在寻找通路的时候,每找到一个通路,就将这个数据

【Qt编程】3D迷宫游戏

说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中.由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩.要想画出三维的迷宫游戏,我们需要先从二维开始. 二维迷宫: 迷宫的程序描述: 现实生活中,我们经常将问题用数学的方法来描述并解决(数学建模).同样的,我们想用程序来解决问题,就得把问题程序化.废话不多说,进入正题: 我们可以用一个矩阵matrix来描绘整个迷宫:元素为1,代表是空的,元素为0代表墙.为了描述问题的方便,下

迷宫游戏(单源最短路)

个人心得:对于复杂抽象的算法还是比较模糊,希望以后有待加强.这题就是用dijskrual算法,在算出最短时间的时候进行适当的更改,还是比较模糊. 1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽

51nod 1459迷宫游戏,迪杰特斯拉算法

1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间.道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得

c语言迷宫游戏的实现

// // main.c // 迷宫游戏代码实现 // #include <stdio.h> #define ROW 6 //宏定义行 #define COL 6 //宏定义列 /** * 打印地图 * * @param arr 地图数组 */ void print_arr (char arr[ROW][COL]) { for (int i = 0; i < ROW; i ++) { for (int j = 0; j < COL; j ++) { printf("%c&

51nod1459迷宫游戏

1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一 些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间. 道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么? Inpu

迷宫问题(栈)

"迷宫问题(栈)" "栈"是一种简单的数据结构,它的主要特点就是"先进后出",即就是先压入栈中的数据需要最后出栈.相当于栈是一个杯子,最先放进栈中的东西,只能够最后拿出来.下面对"栈"的特点用图形象的表示出来. 这次所要讨论的是基于栈的迷宫问题,当给定一个迷宫,我们怎样能够找出迷宫中的通道呢?如果迷宫的规模比较大,我们又该如何去实现呢?我们能够明显的知道需要使用一个二维数组用来保存迷宫,但是当迷宫的规模比较大时,或者是当我们想

数字迷宫游戏安卓源码

数字迷宫游戏源码,这是一款很另类的小游戏哦,虽然是迷宫游戏,但是却没有很多阻碍,只是你需要按照数字的顺序去移动,小心不要把自己围起来哦. <ignore_js_op> <ignore_js_op> <ignore_js_op> 详细说明:http://android.662p.com/thread-5590-1-1.html