⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 humansway.h

📁 Visual C++ 游戏开发与设计实例 源代码(所有)
💻 H
字号:
////////////////////////////////////
// this one is only for perfect maze
// and it is very important that we should ensure that every available way's authority should be a 
//positive
// Copyright: 胡小民,丁展 2002.5

#include <iostream.h>
#include <stdlib.h>
#include "maze.h"


const int fromLeft=0;
const int fromUp=1; 
const int fromRight=2;
const int fromDown=3;

#define END 0

int refreshSig(int sig[CONST_MAZEX][CONST_MAZEY]);

int refreshSig(int sig[CONST_MAZEX][CONST_MAZEY],int x,int y,int dir)
{
//确保权值在表示墙时不会相加
	if(y>=CONST_MAZEY||x>=CONST_MAZEX||x<0||y<0)
		return 0;	// dingzhan added
	
	if(sig[y][x]<UNACCESSABLE)
		sig[y][x]=UNACCESSABLE;

	int temp1,temp2,temp3;

// 不使用sig[y][x]==UNACCESSABLE是为了确保有些情况那儿的确是墙了,却有sig[y][x]约等于UNACCESSABLE
	if(sig[y][x]==END || sig[y][x]<UNACCESSABLE/2)
		return 0;
	if(x==1)
	{
		if(y==1)
		{
			if(dir==fromRight)
			{
				temp1=refreshSig(sig,x,y+1,fromUp);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
 			else if(dir==fromDown)
			{
				temp1=refreshSig(sig,x+1,y,fromLeft);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
			else if(dir==fromLeft)  // from the entrance
			{
				temp1=refreshSig(sig,x+1,y,fromLeft);
				temp2=refreshSig(sig,x,y+1,fromUp);
				if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
					sig[y][x]=temp1+temp2;
				else return sig[y][x];
				return temp1+temp2;
			}
		}
		else if(y==SIZEX_MAZE)
		{
			if(dir==fromRight)
			{
				temp1=refreshSig(sig,x,y-1,fromDown);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
			else if(dir==fromUp)
			{
				temp1=refreshSig(sig,x+1,y,fromLeft);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
		}
		else 
		{
			if(dir==fromRight)
			{
				temp1=refreshSig(sig,x,y-1,fromDown);
				temp2=refreshSig(sig,x,y+1,fromUp);
				if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
					sig[y][x]=temp1+temp2;
				else return sig[y][x];
				return temp1+temp2;
			}
			else if(dir==fromDown)
			{
				temp1=refreshSig(sig,x+1,y,fromLeft);
				temp2=refreshSig(sig,x,y-1,fromDown);
				if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
					sig[y][x]=temp1+temp2;
				else return sig[y][x];
				return temp1+temp2;
			}
			else if(dir==fromUp)
			{
				temp1=refreshSig(sig,x+1,y,fromLeft);
				temp2=refreshSig(sig,x,y+1,fromUp);
				if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
					sig[y][x]=temp1+temp2;
				else return sig[y][x];
				return temp1+temp2;
			}
		}
	}
	else if(x==SIZEY_MAZE)
	{
		if(y==1)
		{
			if(dir==fromLeft)
			{
				temp1=refreshSig(sig,x,y+1,fromUp);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
			else if(dir==fromDown)
			{
				temp1=refreshSig(sig,x-1,y,fromRight);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
		}
		else if(y==SIZEX_MAZE)
		{
			if(dir==fromLeft)
			{
				temp1=refreshSig(sig,x,y-1,fromDown);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
			else if(dir==fromUp)
			{
				temp1=refreshSig(sig,x-1,y,fromRight);
				if(temp1!=END && temp1>UNACCESSABLE/2)
					sig[y][x]=temp1;
				else return sig[y][x];
				return temp1;
			}
		}
		else 
		{
			if(dir==fromLeft)
			{
				temp1=refreshSig(sig,x,y-1,fromDown);
				temp2=refreshSig(sig,x,y+1,fromUp);
			}
			else if(dir==fromDown)
			{
				temp1=refreshSig(sig,x-1,y,fromRight);
				temp2=refreshSig(sig,x,y-1,fromDown);
			}
			else if(dir==fromUp)
			{
				temp1=refreshSig(sig,x-1,y,fromRight);
				temp2=refreshSig(sig,x,y+1,fromUp);
			}
			else
			{
				cout<<"error in refreshSig"<<endl;
				exit(0);
			}
			if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
				sig[y][x]=temp1+temp2;
			else return sig[y][x];
			return temp1+temp2;
		}
	}
	if(y==1)
	{
		if(dir==fromDown)
		{
			temp1=refreshSig(sig,x-1,y,fromRight);
			temp2=refreshSig(sig,x+1,y,fromLeft);
		}
		else if(dir==fromLeft)
		{
			temp1=refreshSig(sig,x+1,y,fromLeft);
			temp2=refreshSig(sig,x,y+1,fromUp);			
		}
		else if(dir==fromRight)
		{
			temp1=refreshSig(sig,x-1,y,fromRight);
			temp2=refreshSig(sig,x,y+1,fromUp);
		}
		else
		{
			cout<<"error in refreshSig"<<endl;
			exit(0);
		}
		if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
			sig[y][x]=temp1+temp2;
		else 
			return sig[y][x];
		return temp1+temp2;
	}
	else if(y==SIZEX_MAZE)
	{
		if(dir==fromUp)
		{
			temp1=refreshSig(sig,x-1,y,fromRight);
			temp2=refreshSig(sig,x+1,y,fromLeft);
		}
		else if(dir==fromLeft)
		{
			temp1=refreshSig(sig,x+1,y,fromLeft);
			temp2=refreshSig(sig,x,y-1,fromDown);			
		}
		else if(dir==fromRight)
		{
			temp1=refreshSig(sig,x-1,y,fromRight);
			temp2=refreshSig(sig,x,y-1,fromDown);
		}	
		else
		{
			cout<<"error in refreshSig"<<endl;
			exit(0);
		}
		if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
			sig[y][x]=temp1+temp2;
		else return sig[y][x];
		return temp1+temp2;
	}

	if(dir==fromUp)
	{
		temp1=refreshSig(sig,x-1,y,fromRight);
		temp2=refreshSig(sig,x+1,y,fromLeft);
		temp3=refreshSig(sig,x,y+1,fromUp);
	}
	else if(dir==fromDown)
	{
		temp1=refreshSig(sig,x-1,y,fromRight);
		temp2=refreshSig(sig,x+1,y,fromLeft);
		temp3=refreshSig(sig,x,y-1,fromDown);
	}
	else if(dir==fromRight)
	{
		temp1=refreshSig(sig,x-1,y,fromRight);
		temp2=refreshSig(sig,x,y-1,fromDown);
		temp3=refreshSig(sig,x,y+1,fromUp);
	}
	else
	{
		temp1=refreshSig(sig,x+1,y,fromLeft);
		temp2=refreshSig(sig,x,y-1,fromDown);
		temp3=refreshSig(sig,x,y+1,fromUp);
	}
	if((temp1+temp2+temp3)>UNACCESSABLE/2 && (temp1+temp2+temp3)!=END)
		sig[y][x]=temp1+temp2+temp3;
	else return sig[y][x];
	return temp1+temp2+temp3;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -