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

📄 path.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		do
		{
			if(tempY <= 0) break;
			TileValue = m_pTile[tempX][tempY].m_bMove;		//	ON
			if(!TileValue) 
			{
				if( IsConer(tempX, tempY+1) )
				{
					m_PathConer[ConerNum].x = tempX; m_PathConer[ConerNum].y = tempY;
					m_PathConer[ConerNum].dist = m_BlockTileY - tempY; ConerTile = TRUE; ConerNum++; 
				}
			}
			else	tempY -= 2;
		} while(TileValue);
		
		tempX = m_BlockTileX;
		tempY = m_BlockTileY;

		do
		{
			if(tempX >= m_nSizeX) break;
			TileValue = m_pTile[tempX][tempY].m_bMove;		//	OE
			if(!TileValue) 
			{
				if( IsConer(tempX-1, tempY) )
				{ 
					m_PathConer[ConerNum].x = tempX; m_PathConer[ConerNum].y = tempY;
					m_PathConer[ConerNum].dist = tempX - m_BlockTileX; ConerTile = TRUE; ConerNum++; 
				}
			}
			else	tempX += 2;
		} while(TileValue);

		tempX = m_BlockTileX;
		tempY = m_BlockTileY;
		do
		{
			if(tempY >= m_nSizeY) break;
			TileValue = m_pTile[tempX][tempY].m_bMove;		//	OS
			if(!TileValue) 
			{
				if( IsConer(tempX, tempY-1) )
				{ 
					m_PathConer[ConerNum].x = tempX; m_PathConer[ConerNum].y = tempY;
					m_PathConer[ConerNum].dist = tempY - m_BlockTileX; ConerTile = TRUE; ConerNum++; 
				}
			}
			else	tempY += 2;
		} while(TileValue);

		tempX = m_BlockTileX;
		tempY = m_BlockTileY;
		do
		{
			if(tempX <= 0) break;
			TileValue = m_pTile[tempX][tempY].m_bMove;		//	OW
			if(!TileValue) 
			{
				if( IsConer(tempX+1, tempY) )
				{
					m_PathConer[ConerNum].x = tempX; m_PathConer[ConerNum].y = tempY;
					m_PathConer[ConerNum].dist = m_BlockTileX - tempX;	ConerTile = TRUE; ConerNum++; 
				}
			}
			else	tempX -= 2;
		} while(TileValue);
	}

	return ConerNum;
}

//------------------------------------------------------------------------
//	Name :	IsConer()
//	Desc :	葛辑府牢瘤 魄窜(函版 : 弊 寇瘤痢捞 1牢瘤 魄窜)
//	UpDate:	2000, 9, 18
//------------------------------------------------------------------------
BOOL CPath::IsConer(int x, int y)
{
	BOOL bConer = FALSE;

	if( (!m_pTile[x-1][y-1].m_bMove) && (!m_pTile[x+1][y-1].m_bMove ))	//   ^
	{
		if((m_pTile[x-2][y].m_bMove) && (m_pTile[x-1][y+1].m_bMove) && (m_pTile[x+1][y+1].m_bMove) && (m_pTile[x+2][y].m_bMove)) bConer = FALSE;
		else bConer = TRUE;
	}

	if(!bConer && (!m_pTile[x+1][y-1].m_bMove) && (!m_pTile[x+1][y+1].m_bMove) )//	>	
	{
		if((m_pTile[x][y-2].m_bMove) && (m_pTile[x-1][y-1].m_bMove) && (m_pTile[x-1][y+1].m_bMove) && (m_pTile[x][y+2].m_bMove)) bConer = FALSE;
		else bConer = TRUE;
	}

	if(!bConer &&  (!m_pTile[x-1][y+1].m_bMove) && (!m_pTile[x+1][y+1].m_bMove) )//	
	{
		if((m_pTile[x-2][y].m_bMove) && (m_pTile[x-1][y-1].m_bMove) && (m_pTile[x+1][y-1].m_bMove) && (m_pTile[x+2][y].m_bMove)) bConer = FALSE;
		else bConer = TRUE;
	}

	if(!bConer && (!m_pTile[x-1][y-1].m_bMove) && (!m_pTile[x-1][y+1].m_bMove) )//	<
	{
		if((m_pTile[x][y-2].m_bMove) && (m_pTile[x+1][y-1].m_bMove) && (m_pTile[x+1][y+1].m_bMove) && (m_pTile[x][y+2].m_bMove)) bConer = FALSE;
		else bConer = TRUE;
	}

	return bConer;
}

//-----------------------------------------------------------------------------
// Name: IsShortDistance
// Desc: 剧率栏肺何磐 八祸窍搁辑 规秦拱捞 乐绰瘤八祸(函悼 : 泅犁 瘤痢篮 公矫)
// UpDate : 2000, 12, 11
//-----------------------------------------------------------------------------
BOOL CPath::SearchBlock(POS *str, POS *end)
{
	int bx = 0, by = 0;

	if(IsBlock(str, end))
	{
		bx = m_BlockTileX;
		by = m_BlockTileY;

		if(IsBlock(end, str)) 
		{
			m_BlockTileX = bx;
			m_BlockTileY = by;
			return TRUE;
		}
		else return FALSE;
	}
	else return FALSE;
}

//------------------------------------------------------------------------
//	Name :	IsBlock()
//	Desc :	函悼 : 泅犁谅钎客 格钎谅钎阑 力寇( 蜡飞葛靛 眠啊 : if(m_Ghost && TileValue > 1) 公矫 )
//	UpDate:	2000, 3, 5
//------------------------------------------------------------------------
BOOL CPath::IsBlock(POS *pre, POS *next)
{
	BOOL BlockTile = FALSE;
	int TileValue = 0, num = 0;
	int i = pre->x;
	int j = pre->y;
	int ax = next->x - pre->x;
	int ay = next->y - pre->y;
	int x, y, Ln = 0, On = 0, pDEST;
	int DEST = CheckDirection(ax, ay);
	x = abs(abs(ax) - 1);		//	for testing 窍唱究 猾促.
	y = abs(abs(ay) - 1);		//	for testing 窍唱究 猾促.

	if(DEST > 4)
	{
		Ln = (x + y)/2;
		if(!(x - y)) { num = 1; }
		else
		{
			On = abs(x - y)/2;
			Ln = abs(On - Ln);
			pDEST = DEST;
			if(x > y)	DEST = CheckDirection(ax, 0);
			else		DEST = CheckDirection(0, ay); 
		}
	}
	else
	{
		num = 1;
		if(x) On = x/2; 
		else	On = y/2;
	}


	for(x = num; x < 2; x++)
	{
		switch(DEST)
		{
		case ON:
			{
				do
				{
					j -= 2; On -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if(j == pre->y || j == next->y) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(On > 0);
			}
			break;
		case OE:
			{
				do
				{
					i += 2; On -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if(i == pre->x || i == next->x) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(On > 0);
			}
			break;
		case OS:
			{
				do
				{
					j += 2; On -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if((j == pre->y || j == next->y)) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(On > 0);
			}
			break;
		case OW:
			{
				do
				{
					i -= 2; On -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if(i == pre->x || i == next->x) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(On > 0);
			}
			break;
		case NE:
			{
				do
				{
					i += 1;	j -= 1; Ln -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if((i ==pre->x && j == pre->y)||(i == next->x && j == next->y)) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(Ln > 0);
			}
			break;
		case ES:
			{
				do
				{
					i += 1; j += 1; Ln -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if((i ==pre->x && j == pre->y)||(i == next->x && j == next->y)) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(Ln > 0);
			}
			break;
		case SW:
			{
				do
				{
					i -= 1; j += 1;Ln -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if((i ==pre->x && j == pre->y)||(i == next->x && j == next->y)) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(Ln > 0);
			}
			break;
		case WN:
			{
				do
				{
					i -= 1; j -= 1;Ln -= 1;
					TileValue = m_pTile[i][j].m_bMove;
					if(TileValue)
					{
						if((i ==pre->x && j == pre->y)||(i == next->x && j == next->y)) break;
//						if(m_Ghost && TileValue > 1) ;
						else if(m_pEndLink->x == i && m_pEndLink->y == j && m_Object) ;
						else { m_BlockTileX = i; m_BlockTileY = j; BlockTile = TRUE; break; }
					}
				} while(Ln > 0);
			}
			break;
		}
		if(DEST > 4 || BlockTile) break;
		else { DEST = pDEST; }
	}
	return BlockTile;
}


//------------------------------------------------------------------------
//	Name :	PathList(POS *pstr, POS *pend)
//	Desc :	鞘夸绝绰 畴靛甫 力芭茄促.
//	UpDate:	2000, 9, 18
//------------------------------------------------------------------------
void CPath::PathList(POS *pstr, POS *pend)
{
	POS *now = pstr;
	POS *end = pend;

	if(pstr != pend)
	{
		do
		{
			do
			{
				if( !SearchBlock(now, end) && (now != end->prev) )
				{
					DeleteNode(now, end);
					break;
				}
				else
				{
					if(end->prev == now || (end == now)) break;
					end = end->prev;
				}

			} while(1);
			
			now = now->next;
			end = pend;
			if(now->next == end || (end == now)) break;

		} while(1);

		if(SearchBlock(pstr, pend) && pstr->next == pend) { m_PathList[0].x = pstr->x; m_PathList[0].y = pstr->y; }
		else PutDistance();
	}
	else { m_PathList[0].x = pstr->x; m_PathList[0].y = pstr->y; }
}

void CPath::PutDistance()
{
	PATH PathList[100];
	POS *str = m_pStrLink;
	POS *end = m_pStrLink->next;

	BOOL nObj = FALSE;
	int x, y, a, b;
	int num = 0;
	m_PathListNum = 0;
	m_PathList[m_PathListNum].x = m_pStrLink->x;
	m_PathList[m_PathListNum].y = m_pStrLink->y;
	m_PathListNum++;

	do
	{
		if(m_pEndLink->x == end->x && m_pEndLink->y == end->y && m_Object) nObj = TRUE;
		if(IsBlock(str, end))
		{
			x = str->x - end->x; y =str->y - end->y;
			a = abs(x); b = abs(y);
			if(a > b) num = PutXPath(PathList, end->x, end->y, x, y);
			else	  num = PutYPath(PathList, end->x, end->y, x, y);
			
			do
			{
				m_PathList[m_PathListNum].x = PathList[num].x;
				m_PathList[m_PathListNum].y = PathList[num].y;
				m_PathListNum++; num--;
			} while(num > -1);
			
		}
		else
		{

			x = end->x - str->x; y =end->y - str->y;
			a = abs(x); b = abs(y);
			if(a > b) PutXPath(str, x, y);
			else	  PutYPath(str, x, y);
		}

		str = str->next;
		end = end->next;
		if(end == NULL) break;
	} while(1);
}

int CPath::PutXPath(PATH *PathList, int x, int y, int ax, int ay)
{
	int PathListNum = 0;
	int index = CheckDirection(ax, ay);
	int i = 0;
	int j = 0;
	int test = abs(ay);
	int sum = abs(ax);
	int loop = (sum + test)/2;
	int Ln = abs(test - sum)/2;

	switch(index)
	{
		case OE:
			do
			{
				PathList[PathListNum].x = x + i;
				PathList[PathListNum].y = y;
				i += 2;
				sum -= 1;
				PathListNum++;
			}while(sum > 0);
			break;
		
		case OW:
			do
			{
				PathList[PathListNum].x = x + i;
				PathList[PathListNum].y = y;
				i -= 2;
				sum -= 1;
				PathListNum++;
			}while(sum > 0);
			break;

		case ON:
			do
			{
				PathList[PathListNum].x = x;
				PathList[PathListNum].y = y + j;
				j -= 2;
				test -= 1;
				PathListNum++;
			}while(test > 0);
			break;

		case OS:
			do
			{
				PathList[PathListNum].x = x;
				PathList[PathListNum].y = y + j;					
				j += 2;
				test -= 1;
				PathListNum++;
			}while(test > 0);
			break;


		case ES:
			do
			{
				PathList[PathListNum].x = x + i;
				PathList[PathListNum].y = y + j;
				if(Ln > 0) { j; i += 2; }
				else  { j++; i++; }
				Ln--;
				loop--;
				PathListNum++;
			}while(loop > 0);
			break;

		case WN:
			do
			{
				PathList[PathListNum].x = x + i;
				PathList[PathListNum].y = y + j;
				if(Ln > 0) { j; i -= 2; }
				else { j--; i--; }
				Ln--;
				loop--;
				PathListNum++;
			}while(loop > 0);
			break;


		case SW:
			do
			{
				PathList[PathListNum].x = x + i;

⌨️ 快捷键说明

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