1. 程式人生 > >迷宮遊戲 用棧實現

迷宮遊戲 用棧實現

#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;
}



相關推薦

迷宮遊戲 實現

#include<iostream> #include<string> #include<stack> using namespace std; #define n 8 stack <int *> s; int * cre

實現迷宮遊戲尋路

    在我們學習資料結構的時候都曾經見過迷宮遊戲,迷宮遊戲的實現其實並不難,但是,我們在實現每一個演算法的時候都應該想一想這個問題的每一個解。最近,博主已經開始重溫資料結構啦,記得我們以前學習這裡的時候,老師會用佇列來實現迷宮最優解的尋找,氮素呢,博主就是這麼可愛,博主就是

數據結構設計——實現迷宮問題的求解

src 實驗代碼 AC pan -- \n strong AI end 求解迷宮問題 1,問題描述 以一個m*n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。迷宮問題要求求出從入口(1,1)到出口(m,n)的一條通路,或得出沒有通路的結論。 基本要求: 首先實

資料結構之實現迷宮問題(dfs)

給一個n*n的方格,讓你求從左上角到所給一點的任意一條路徑並輸出 該題用到dfs,以下是對dfs的簡要解析  :詳解請參見 傳送門 dfs是一種用於遍歷或搜尋樹或圖的演算法。 沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不

《資料結構》嚴蔚敏 實現迷宮求解問題

轉載:https://blog.csdn.net/Vit_rose/article/details/52781116 膜大佬~ 其實自己就是懶,太懶了,不想動手寫,有畏難情緒,這個毛病得改鴨 思路:利用棧窮舉路徑,從而來得到問題的解答 注意:當前路徑可通,指未曾走到過的通道塊(即不能是已經壓

java實現迷宮

迷宮實現演算法: package algrithm; import java.util.Scanner; public class maze { public static void main(String[] args) { int a[][]={

【資料結構】簡單不帶環迷宮實現實現

一.用棧來實現簡單的迷宮1. 迷宮:回溯法:對一個包括有很多個結點,每個結點有若干個搜尋分支的問 題,把原問題分解為若干個子問題求解的演算法;當搜尋到某個結點發 現無法再繼續搜尋下去時,就讓搜尋過程回溯(回退)到該節點的前一 個結點,繼續搜尋該節點外的其他尚未搜尋的分支;

Java之實現隊列

ring idt style enqueue 元素 java 出隊 入隊 span 隊列是一種典型的先進先出數據結構,隊列的實現方式有很多種,比如數組,比如鏈表等,隊列也可以用兩個棧來實現,下面就用兩個棧實現一個隊列。 原理   兩個棧中,一個棧用來入隊,叫他入隊棧,另

實現隊列

isempty row exce 數據 如果 throw 一個 異常 移動 實現思想:對於A,B兩個棧,A作為壓棧,B作為彈出棧。push操作時,將結果壓入A棧,並且判斷B棧是否為空,如果為空,則將A棧的元素全部移動到B棧pop操作時,判斷A,B棧是否為空,如果同時為空,則

LeetCode232之實現佇列(Implement Queue using Stacks)

一、題目 二、一種解題思路 1)介紹:雙棧實現佇列法   方法解析:使用兩個棧做為基礎,一個棧儲存輸入的元素,另外一個棧將前面棧中的元素儲存到自己中,這樣就實現了佇列的效果,最先進的元素在in棧的棧底,out棧的棧頂。 ()從一個棧到另外一個棧的操作,僅在out

【LeetCode 簡單題】62-實現佇列

宣告: 今天是第62道題。使用棧實現佇列的相關操作。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:使用棧實現佇列的下列操作:

LeetCode232 ·實現佇列(C++)

題目描述: 使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new MyQueue()

LR--實現移進--歸約分析(demo)

1.考慮文法 \(E->E+E\) \(E->E*E\) \(E->id\) 2.最右推導 不難看出,這個文法是而二義的,所以有多個最右推導 3.移進歸約 用一個棧存文法符號,用輸入快取區儲存要分析的輸入串,用$標記棧底 #include<iostream> #inc

佇列&//實現佇列

使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new MyQue

實現的計算器最終版本(可以實現括號以及浮點數的運算)

1 #include <stdio.h> 2 #include <ctype.h> 3 #include <stdlib.h> 4 5 #define STACK_INIT_SIZE 20 6 #define STACKINCREMENT

LeetCode232實現佇列c++

 使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new

【LeetCode題解】232_實現隊列(Implement-Queue-using-Stacks)

復雜 彈出 兩個棧 art 分析 完成後 棧操作 all n) 目錄 描述 解法一:在一個棧中維持所有元素的出隊順序 思路 入隊(push) 出隊(pop) 查看隊首(peek) 是否為空(empty) Java 實現 Python 實現 解法二:一個棧入,一個棧出

【LeetCode題解】232_實現佇列(Implement-Queue-using-Stacks)

目錄 描述 解法一:在一個棧中維持所有元素的出隊順序 思路 入隊(push) 出隊(pop) 檢視隊首(peek) 是否為空(empty) Java 實現 Python 實現 解法二:一

實現佇列_學習記錄

用棧實現佇列_學習記錄 【題目描述】 使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。

LeetCode232 實現佇列

使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new MyQueue(); qu