/** Gets the proper BFS distance*/ public int GetDistanceBetweenTiles(byte startTileId, byte endTileId) { for (byte i = 0; i < Consts.GRID_SIZE; i++) { for (byte j = 0; j < Consts.GRID_SIZE; j++) { visited[i, j] = false; } } int[] distanceOfOrigin = new int[Consts.MAX_TILES]; for (int i = 0; i < distanceOfOrigin.Length; i++) { distanceOfOrigin[i] = Int32.MaxValue; } GridPosition startV = BoardHelper.GetColRowFromTileId(startTileId); queue.Enqueue(startTileId); distanceOfOrigin[startTileId] = 0; visited[startV.Col, startV.Row] = true; while (queue.Count > 0) { byte currentTile = queue.Dequeue(); if (currentTile == endTileId) { queue.Clear(); break; } int topX = BoardHelper.GetColRowFromTileId(currentTile).Col; int topY = BoardHelper.GetColRowFromTileId(currentTile).Row; for (byte i = 0; i < 4; i++) { if (topX + dx[i] >= 0 && topX + dx[i] < Consts.GRID_SIZE && topY + dy[i] >= 0 && topY + dy[i] < Consts.GRID_SIZE) { GridPosition adjecentTile = new GridPosition(topX + dx[i], topY + dy[i]); if (!visited[adjecentTile.Col, adjecentTile.Row] && !GetTileFromList(BoardHelper.GetTileIdFromColRow(adjecentTile)).isOccupied) { distanceOfOrigin[BoardHelper.GetTileIdFromColRow(adjecentTile)] = distanceOfOrigin[currentTile] + 1; queue.Enqueue(BoardHelper.GetTileIdFromColRow(adjecentTile)); visited[adjecentTile.Col, adjecentTile.Row] = true; } } } } return(distanceOfOrigin[endTileId]); }
public Vector3[] GetVector3Path(byte startTileId, byte endTileId) { for (byte i = 0; i < Consts.GRID_SIZE; i++) { for (byte j = 0; j < Consts.GRID_SIZE; j++) { visited[i, j] = false; } } GridPosition startV = BoardHelper.GetColRowFromTileId(startTileId); queue.Enqueue(startTileId); parent[startTileId] = NO_PARENT; pathSize = 0; visited[startV.Col, startV.Row] = true; while (queue.Count > 0) { byte currentTile = queue.Dequeue(); if (currentTile == endTileId) { queue.Clear(); break; } int topX = BoardHelper.GetColRowFromTileId(currentTile).Col; int topY = BoardHelper.GetColRowFromTileId(currentTile).Row; for (byte i = 0; i < 4; i++) { if (topX + dx[i] >= 0 && topX + dx[i] < Consts.GRID_SIZE && topY + dy[i] >= 0 && topY + dy[i] < Consts.GRID_SIZE) { GridPosition adjecentTile = new GridPosition(topX + dx[i], topY + dy[i]); if (!visited[adjecentTile.Col, adjecentTile.Row] && !GetTileFromList(BoardHelper.GetTileIdFromColRow(adjecentTile)).isOccupied) { queue.Enqueue(BoardHelper.GetTileIdFromColRow(adjecentTile)); visited[adjecentTile.Col, adjecentTile.Row] = true; parent[BoardHelper.GetTileIdFromColRow(adjecentTile)] = currentTile; } } } } return(GetPathList(endTileId).ConvertAll(new Converter <byte, Vector3>(GetVectorFromTileId)).ToArray()); }