📄 path.cpp
字号:
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 + -