代码之家  ›  专栏  ›  技术社区  ›  totalnoob

了解JavaScript中的寻路算法

  •  1
  • totalnoob  · 技术社区  · 6 年前

    我一直在研究一种寻路算法,在很大程度上我了解它,但仍然让我困惑的是如何设置正确的路径。

    它打印出来了

    [ 'East' ]
    [ 'South' ]
    [ 'East', 'East' ]
    [ 'South', 'South' ]
    [ 'East', 'East', 'East' ]
    [ 'South', 'South', 'South' ]
    [ 'South', 'South', 'South', 'East' ]
    [ 'South', 'South', 'South', 'East', 'East' ]
    [ 'South', 'South', 'South', 'East', 'East', 'North' ]
    

    它在代码中的何处/如何决定,嘿['East'、'East'、'East']不再工作并从路径数组中丢弃它?

    // Start location will be in the following format:
    // [distanceFromTop, distanceFromLeft]
    var findShortestPath = function(startCoordinates, grid) {
      var distanceFromTop = startCoordinates[0];
      var distanceFromLeft = startCoordinates[1];
    
      // Each "location" will store its coordinates
      // and the shortest path required to arrive there
      var location = {
        distanceFromTop: distanceFromTop,
        distanceFromLeft: distanceFromLeft,
        path: [],
        status: 'Start'
      };
    
      // Initialize the queue with the start location already inside
      var queue = [location];
    
      // Loop through the grid searching for the goal
      while (queue.length > 0) {
        // Take the first location off the queue
        var currentLocation = queue.shift();
        // Explore North
        var newLocation = exploreInDirection(currentLocation, 'North', grid);
        if (newLocation.status === 'Goal') {
          return newLocation.path;
        } else if (newLocation.status === 'Valid') {
          queue.push(newLocation);
        }
    
        // Explore East
        var newLocation = exploreInDirection(currentLocation, 'East', grid);
        if (newLocation.status === 'Goal') {
          return newLocation.path;
        } else if (newLocation.status === 'Valid') {
          queue.push(newLocation);
        }
    
        // Explore South
        var newLocation = exploreInDirection(currentLocation, 'South', grid);
        if (newLocation.status === 'Goal') {
          return newLocation.path;
        } else if (newLocation.status === 'Valid') {
          queue.push(newLocation);
        }
    
        // Explore West
        var newLocation = exploreInDirection(currentLocation, 'West', grid);
        if (newLocation.status === 'Goal') {
          return newLocation.path;
        } else if (newLocation.status === 'Valid') {
          queue.push(newLocation);
        }
      }
    
      // No valid path found
      return false;
    
    };
    
    // This function will check a location's status
    // (a location is "valid" if it is on the grid, is not an "obstacle",
    // and has not yet been visited by our algorithm)
    // Returns "Valid", "Invalid", "Blocked", or "Goal"
    var locationStatus = function(location, grid) {
      var gridSize = grid.length;
      var dft = location.distanceFromTop;
      var dfl = location.distanceFromLeft;
    
      if (location.distanceFromLeft < 0 ||
          location.distanceFromLeft >= gridSize ||
          location.distanceFromTop < 0 ||
          location.distanceFromTop >= gridSize) {
    
        // location is not on the grid--return false
        return 'Invalid';
      } else if (grid[dft][dfl] === 'Goal') {
        return 'Goal';
      } else if (grid[dft][dfl] !== 'Empty') {
        // location is either an obstacle or has been visited
        return 'Blocked';
      } else {
        return 'Valid';
      }
    };
    
    
    // Explores the grid from the given location in the given
    // direction
    var exploreInDirection = function(currentLocation, direction, grid) {
    
      var newPath = currentLocation.path.slice();
      newPath.push(direction);
    
      var dft = currentLocation.distanceFromTop;
      var dfl = currentLocation.distanceFromLeft;
    
      if (direction === 'North') {
        dft -= 1;
      } else if (direction === 'East') {
        dfl += 1;
      } else if (direction === 'South') {
        dft += 1;
      } else if (direction === 'West') {
        dfl -= 1;
      }
    
      var newLocation = {
        distanceFromTop: dft,
        distanceFromLeft: dfl,
        path: newPath,
        status: 'Unknown'
      };
      newLocation.status = locationStatus(newLocation, grid);
    
      // If this new location is valid, mark it as 'Visited'
      if (newLocation.status === 'Valid') {
        grid[newLocation.distanceFromTop][newLocation.distanceFromLeft] = 'Visited';
      }
    
      return newLocation;
    };
    
    
    // OK. We have the functions we need--let's run them to get our shortest path!
    
    // Create a 4x4 grid
    // Represent the grid as a 2-dimensional array
    var gridSize = 4;
    var grid = [];
    for (var i=0; i<gridSize; i++) {
      grid[i] = [];
      for (var j=0; j<gridSize; j++) {
        grid[i][j] = 'Empty';
      }
    }
    
    // Think of the first index as "distance from the top row"
    // Think of the second index as "distance from the left-most column"
    
    // This is how we would represent the grid with obstacles above
    grid[0][0] = "Start";
    grid[2][2] = "Goal";
    
    grid[1][1] = "Obstacle";
    grid[1][2] = "Obstacle";
    grid[1][3] = "Obstacle";
    grid[2][1] = "Obstacle";
    
    console.log(findShortestPath([0,0], grid));
    0 回复  |  直到 6 年前