gatherer.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 board import Board
  6. from blob.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. def reached(self, goal):
  33. return goal is not None and self.x == goal[0] and self.y == goal[1]
  34. def choose_goal(self):
  35. goals = []
  36. for food in self.knowledge['food']:
  37. if not self.reached(food):
  38. goals.append(food)
  39. if len(goals) == 0:
  40. return None
  41. else:
  42. return goals[random.randrange(len(goals))]
  43. def reset(self):
  44. self.goal = None
  45. self.path = []
  46. self.x = 0
  47. self.y = 0
  48. def move(self):
  49. if self.goal is None or self.goal not in self.knowledge['food']:
  50. self.goal = self.choose_goal()
  51. self.path = []
  52. # No goal
  53. if self.goal is None:
  54. return
  55. if len(self.path) == 0 or not self.light_compute:
  56. self.best_way_to()
  57. # No path found, search another goal next time
  58. if len(self.path) == 0:
  59. self.goal = None
  60. return
  61. new_pos = self.path[0]
  62. self.path = self.path[1:]
  63. self.x = new_pos[0]
  64. self.y = new_pos[1]
  65. if self.reached(self.goal):
  66. self.goal = None
  67. self.path = []
  68. if self.reached(self.goal) or (self.goal not in self.knowledge['food']):
  69. val = self.choose_goal()
  70. if val is None:
  71. return
  72. else:
  73. self.goal = val