finished bfs;

This commit is contained in:
Angelika Iskra 2022-04-11 12:56:22 +02:00
parent 88297d0b9b
commit e98a4da2aa
4 changed files with 28 additions and 11 deletions

View File

@ -3,8 +3,9 @@ from typing import List
# temporary goal for testing # temporary goal for testing
from common.constants import ACTION, Direction, ROWS, COLUMNS from common.constants import ACTION, Direction, ROWS, COLUMNS
from common.helpers import castle_neighbors
GOAL = (9, 9) GOAL_LIST = []
class State: class State:
@ -21,8 +22,8 @@ class Node:
self.action = action self.action = action
def goal_test(state: State): def goal_test(goal_list, state: State):
if (state.row, state.column) == GOAL: if (state.row, state.column) in goal_list:
return True return True
return False return False
@ -45,16 +46,13 @@ def get_successors(state: State, map):
return successors return successors
def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored: List[Node] = None, def graphsearch(initial_state: State, map, goal_cords, fringe: List[Node] = None, explored: List[Node] = None):
tox: int = None, toy: int = None):
# fringe and explored initialization # fringe and explored initialization
global GOAL
if fringe is None: if fringe is None:
fringe = list() fringe = list()
if explored is None: if explored is None:
explored = list() explored = list()
if tox is not None and toy is not None: goal_list = castle_neighbors(map, goal_cords[0], goal_cords[1])
GOAL = (tox, toy)
explored_states = set() explored_states = set()
fringe_states = set() fringe_states = set()
@ -73,7 +71,7 @@ def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored:
fringe_states.remove((element.state.row, element.state.column, element.state.direction)) fringe_states.remove((element.state.row, element.state.column, element.state.direction))
# if solution was found, prepare and return actions sequence # if solution was found, prepare and return actions sequence
if goal_test(element.state): if goal_test(goal_list, element.state):
actions_sequence = [element.action] actions_sequence = [element.action]
parent = element.parent parent = element.parent

View File

@ -28,3 +28,20 @@ def print_numbers():
# parse array index to screen x or y coordinate # parse array index to screen x or y coordinate
def parse_cord(cord): def parse_cord(cord):
return (GRID_CELL_PADDING + GRID_CELL_SIZE) * cord + GRID_CELL_PADDING + 7 return (GRID_CELL_PADDING + GRID_CELL_SIZE) * cord + GRID_CELL_PADDING + 7
def castle_neighbors(map, castle_bottom_right_row, castle_bottom_right_col):
neighbors = []
for row_add in range(-2, 2):
new_row = castle_bottom_right_row + row_add
if 0 <= new_row <= len(map) - 1:
for col_add in range(-2, 2):
new_col = castle_bottom_right_col + col_add
if 0 <= new_col <= len(map) - 1:
if (new_col == castle_bottom_right_col - 1 and new_row == castle_bottom_right_row - 1) \
or (new_col == castle_bottom_right_col and new_row == castle_bottom_right_row - 1) \
or (new_col == castle_bottom_right_col - 1 and new_row == castle_bottom_right_row) \
or (new_col == castle_bottom_right_col and new_row == castle_bottom_right_row):
continue
neighbors.append((new_col, new_row))
return neighbors

View File

@ -102,12 +102,13 @@ class Level:
def handle_turn(self): def handle_turn(self):
print("next turn") print("next turn")
# current_knight = self.list_knights_red[0]
current_knight = self.knights_queue.dequeue_knight() current_knight = self.knights_queue.dequeue_knight()
knight_pos_x = current_knight.position[0] knight_pos_x = current_knight.position[0]
knight_pos_y = current_knight.position[1] knight_pos_y = current_knight.position[1]
state = State(knight_pos_y, knight_pos_x, current_knight.direction) state = State(knight_pos_y, knight_pos_x, current_knight.direction)
action_list = graphsearch(state, self.map)
castle_cords = (self.list_castles[0].position[0], self.list_castles[0].position[1])
action_list = graphsearch(state, self.map, castle_cords)
print(action_list) print(action_list)
if len(action_list) == 0: if len(action_list) == 0:

View File

@ -8,6 +8,7 @@ class Castle(pygame.sprite.Sprite):
super().__init__(group) super().__init__(group)
self.image = pygame.image.load("./resources/textures/castle.png").convert_alpha() self.image = pygame.image.load("./resources/textures/castle.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (78, 78)) self.image = pygame.transform.scale(self.image, (78, 78))
self.position = position
position_in_px = (parse_cord(position[0]), parse_cord(position[1])) position_in_px = (parse_cord(position[0]), parse_cord(position[1]))
self.rect = self.image.get_rect(center=position_in_px) self.rect = self.image.get_rect(center=position_in_px)
self.health = 80 self.health = 80