我正在研究使用自定義類而不是節點的 A* 尋路方法,但我的回圈存在問題。使用 int i 的第一個 for 回圈最多可以達到 3(Player1.instance.movement = 3),但我需要在該回圈內使用 if 陳述句來檢查是否已經找到目標位置。我想知道當我的 If 陳述句為假時是否有可能打破我的 for 回圈。public void GetNeighbors(Tile originTile) { Tile originalTile = originTile;
nextTile.Clear();
int minX = 0;
int minY = 0;
var originCostFunc = Mathf.Infinity;
for (int i = 0; i < Player1.instance.movement; i )
{
for (int x = -1; x <= 1; x )
{
for (int y = -1; y <= 1; y )
{
if (x != y && y != x)
{
var costX = Mathf.Abs((originTile.transform.position.x x) - originalTile.transform.position.x);
var costY = Mathf.Abs((originTile.transform.position.y y) - originalTile.transform.position.y);
var distanceX = Mathf.Abs(targetPos.transform.position.x - (originTile.transform.position.x x));
var distanceY = Mathf.Abs(targetPos.transform.position.y - (originTile.transform.position.y y));
var costFunc = costX costY distanceX distanceY;
if (costFunc <= originCostFunc)
{
originCostFunc = costFunc;
minX = x;
minY = y;
Debug.Log($"x: {x}, y: {y}");
}
}
}
}
nextTile.Add(GridManagerHandPlaced.instance.GetTileAtPosition(new Vector2(originTile.transform.position.x minX, originTile.transform.position.y minY)));
if (nextTile[i] != targetPos)
{
originTile = nextTile[i];
}
else
{
break;
}
}
DisplayPath();
}
uj5u.com熱心網友回復:
您可以按條件多次中斷回圈。
bool breakLoop = false;
for (int i = 0; i < length; i )
{
for (int j = 0; j < length; j )
{
for (int k = 0; k < length; k )
{
breakLoop = nextTile == target;
if (breakLoop)
break;
}
if (breakLoop)
break;
}
if (breakLoop)
break;
}
或者將搜索邏輯移動到分離的方法并從任意數量的嵌套回圈中回傳一個值
string path = FindPath();
Display(path);
string FindPath()
{
for (int i = 0; i < length; i )
{
for (int j = 0; j < length; j )
{
for (int k = 0; k < length; k )
{
if (nextTile == target)
return nextTile;
}
}
}
return null;
}
永遠不要使用 goto 運算子。
uj5u.com熱心網友回復:
這是我會使用的少數有效案例之一goto。事實上,這是檔案中給出的示例,說明何時應該使用它。
void CheckMatrices(Dictionary<string, int[][]> matrixLookup, int target)
{
foreach (var (key, matrix) in matrixLookup)
{
for (int row = 0; row < matrix.Length; row )
{
for (int col = 0; col < matrix[row].Length; col )
{
if (matrix[row][col] == target)
{
goto Found;
}
}
}
Console.WriteLine($"Not found {target} in matrix {key}.");
continue;
Found:
Console.WriteLine($"Found {target} in matrix {key}.");
}
}
請注意,標簽的語法很簡單myLabel:,您可以將其放置在程式可執行代碼中的任何位置。
uj5u.com熱心網友回復:
為了涵蓋處理這種情況的其他方式,這里是布爾解決方案。
bool breakLoops = false;
for (int i = 0; i < length1; i )
{
for (int ii = 0; ii < length2; ii )
{
for (int iii = 0; iii < length3; iii )
{
if (breakingCondition)
{
breakLoops = true;
break;
}
}
if (breakLoops) break;
}
if (breakLoops) break;
}
簡單明了,但需要在要中斷的每個回圈結束時進行中斷條件檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485850.html
上一篇:站在移動平臺上無法移動
下一篇:使用Junit但不用于測驗?
