gatherer.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import random
  2. from pathfinding.core.diagonal_movement import DiagonalMovement
  3. from pathfinding.core.grid import Grid
  4. from pathfinding.finder.a_star import AStarFinder
  5. from simulation.board import Board
  6. from simulation.logic.dumb_scouter import DumbScouter
  7. class Gatherer(DumbScouter):
  8. def __init__(self, board, knowledge, x, y, drop_value, use_diagonal=True, light_compute=True):
  9. DumbScouter.__init__(self, board, knowledge, x, y, drop_value)
  10. self.use_diagonal = use_diagonal
  11. self.light_compute = light_compute
  12. self.goal = None
  13. self.path = []
  14. def get_matrix(self):
  15. matrix = []
  16. for y in range(self.board.height):
  17. matrix.append([])
  18. for x in range(self.board.width):
  19. matrix[y].append(
  20. 0 if self.board.board_array[x, y].blob <= 0
  21. else Board.MAX_BLOB - self.board.board_array[x, y].blob + 1)
  22. return matrix
  23. def best_way_to(self):
  24. grid = Grid(matrix=self.get_matrix())
  25. start = grid.node(self.x, self.y)
  26. end = grid.node(self.goal[0], self.goal[1])
  27. if self.use_diagonal:
  28. finder = AStarFinder(diagonal_movement=DiagonalMovement.always)
  29. else:
  30. finder = AStarFinder(diagonal_movement=DiagonalMovement.never)
  31. self.path, runs = finder.find_path(start, end, grid)
  32. self.path = self.path[1:]
  33. def reached(self, goal):
  34. return goal is not None and self.x == goal[0] and self.y == goal[1]
  35. def choose_goal(self):
  36. goals = []
  37. for food in self.knowledge['food']:
  38. if not self.reached(food):
  39. goals.append(food)
  40. if len(goals) == 0:
  41. return None
  42. else:
  43. return goals[random.randrange(len(goals))]
  44. def reset(self):
  45. self.goal = None
  46. self.path = []
  47. self.x = 0
  48. self.y = 0
  49. def move(self):
  50. if self.goal is None or self.goal not in self.knowledge['food']:
  51. self.goal = self.choose_goal()
  52. self.path = []
  53. # No goal
  54. if self.goal is None:
  55. return
  56. if len(self.path) == 0 or not self.light_compute:
  57. self.best_way_to()
  58. # No path found, search another goal next time
  59. if len(self.path) == 0:
  60. self.goal = None
  61. return
  62. new_pos = self.path[0]
  63. self.path = self.path[1:]
  64. self.x = new_pos[0]
  65. self.y = new_pos[1]
  66. if self.reached(self.goal):
  67. self.goal = None
  68. self.path = []
  69. if self.reached(self.goal) or (self.goal not in self.knowledge['food']):
  70. val = self.choose_goal()
  71. if val is None:
  72. return
  73. else:
  74. self.goal = val