Advertisement
Zogra

pac/nedovrsen

Mar 31st, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.61 KB | None | 0 0
  1. from utils import Problem
  2. from uninformed_search import *
  3.  
  4.  
  5. def move_left(x, y, obs):
  6. if 0 <= x - 1 and (x - 1, y) not in obs:
  7. return [(x - 1, y), "zapad"]
  8. return 0
  9.  
  10.  
  11. def move_right(x, y, obs):
  12. if x + 1 < 10 and (x + 1, y) not in obs:
  13. return [(x + 1, y), "istok"]
  14. return 0
  15.  
  16.  
  17. def move_up(x, y, obs):
  18. if y + 1 < 10 and (x, y + 1) not in obs:
  19. return [(x, y + 1), "sever"]
  20. return 0
  21.  
  22.  
  23. def move_down(x, y, obs):
  24. if y - 1 >= 0 and (x, y - 1) not in obs:
  25. return [(x, y - 1), "jug"]
  26. return 0
  27.  
  28.  
  29. class Pacman(Problem):
  30. def __init__(self, initial, obs, goal=None):
  31. super().__init__(initial, goal)
  32. self.obs = obs
  33.  
  34. def successor(self, state):
  35. """За дадена состојба, врати речник од парови {акција : состојба}
  36. достапни од оваа состојба. Ако има многу следбеници, употребете
  37. итератор кој би ги генерирал следбениците еден по еден, наместо да
  38. ги генерирате сите одеднаш.
  39. :param state: дадена состојба
  40. :return: речник од парови {акција : состојба} достапни од оваа
  41. состојба
  42. :rtype: dict
  43. """
  44. # (i, j, facing, positions)
  45. successors = dict()
  46.  
  47. pac_x, pac_y = state[0], state[1]
  48. side = state[2]
  49. ball_pos = state[3]
  50.  
  51. if side == "istok":
  52. left = move_up(pac_x, pac_y, self.obs)
  53. right = move_down(pac_x, pac_y, self.obs)
  54. forward = move_right(pac_x, pac_y, self.obs)
  55. back = move_left(pac_x, pac_y, self.obs)
  56. if side == "zapad":
  57. left = move_down(pac_x, pac_y, self.obs)
  58. right = move_up(pac_x, pac_y, self.obs)
  59. forward = move_left(pac_x, pac_y, self.obs)
  60. back = move_right(pac_x, pac_y, self.obs)
  61. if side == "sever":
  62. left = move_left(pac_x, pac_y, self.obs)
  63. right = move_right(pac_x, pac_y, self.obs)
  64. forward = move_up(pac_x, pac_y, self.obs)
  65. back = move_down(pac_x, pac_y, self.obs)
  66. if side == "jug":
  67. left = move_right(pac_x, pac_y, self.obs)
  68. right = move_left(pac_x, pac_y, self.obs)
  69. forward = move_down(pac_x, pac_y, self.obs)
  70. back = move_up(pac_x, pac_y, self.obs)
  71.  
  72. if forward != 0:
  73. successors["ProdolziPravo"] = (forward[0][0], forward[0][1], forward[1],
  74. tuple([p for p in ball_pos if p != [forward[0][0], forward[0][1]]]))
  75. if back != 0:
  76. successors["ProdolziNazad"] = (back[0][0], back[0][1], back[1],
  77. tuple([p for p in ball_pos if p != [back[0][0], back[0][1]]]))
  78. if left != 0:
  79. successors["SvrtiLevo"] = (left[0][0], left[0][1], left[1],
  80. tuple([p for p in ball_pos if p != [left[0][0], left[0][1]]]))
  81. if right != 0:
  82. successors["SvrtiDesno"] = (right[0][0], right[0][1], right[1],
  83. tuple([p for p in ball_pos if p != [right[0][0], right[0][1]]]))
  84.  
  85. return successors
  86.  
  87. def actions(self, state):
  88. """За дадена состојба state, врати листа од сите акции што може да
  89. се применат над таа состојба
  90. :param state: дадена состојба
  91. :return: листа на акции
  92. :rtype: list
  93. """
  94. return self.successor(state).keys()
  95.  
  96. def result(self, state, action):
  97. """За дадена состојба state и акција action, врати ја состојбата
  98. што се добива со примена на акцијата над состојбата
  99. :param state: дадена состојба
  100. :param action: дадена акција
  101. :return: резултантна состојба
  102. """
  103. return self.successor(state)[action]
  104.  
  105. def goal_test(self, state):
  106. """Врати True ако state е целна состојба. Даденава имплементација
  107. на методот директно ја споредува state со self.goal, како што е
  108. специфицирана во конструкторот. Имплементирајте го овој метод ако
  109. проверката со една целна состојба self.goal не е доволна.
  110. :param state: дадена состојба
  111. :return: дали дадената состојба е целна состојба
  112. :rtype: bool
  113. """
  114. return len(state[-1]) == 0
  115.  
  116.  
  117. if __name__ == "__main__":
  118. i, j = int(input()), int(input())
  119. facing = input()
  120. num_balls = int(input())
  121. positions = []
  122.  
  123. obstacles = [(0, 6), (0, 8), (0, 9), (1, 2), (1, 3), (1, 4), (1, 9), (2, 9), (3, 6), (3, 9), (4, 1), (4, 5),
  124. (4, 6), (4, 7), (5, 1), (5, 6), (6, 0), (6, 1), (6, 2), (6, 9), (8, 1), (8, 4), (8, 7), (8, 8), (9, 4),
  125. (9, 7), (9, 8)]
  126. for k in range(num_balls):
  127. balls = list(input())
  128. positions.append([int(balls[0]), int(balls[2])])
  129. new_pos = tuple(positions)
  130. pacman = Pacman((i, j, facing, positions), obstacles)
  131.  
  132. result = breadth_first_tree_search(pacman)
  133. print(result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement