worked on bfs;
This commit is contained in:
parent
8196a5ec62
commit
57cdb87820
@ -30,10 +30,10 @@ def goal_test(state: State):
|
|||||||
def get_successors(state: State, map):
|
def get_successors(state: State, map):
|
||||||
successors = list()
|
successors = list()
|
||||||
|
|
||||||
state_left = State(state.row, state.column, state.direction.right())
|
state_left = State(state.row, state.column, state.direction.left())
|
||||||
successors.append((ACTION.get("rotate_left"), state_left))
|
successors.append((ACTION.get("rotate_left"), state_left))
|
||||||
|
|
||||||
state_right = State(state.row, state.column, state.direction.left())
|
state_right = State(state.row, state.column, state.direction.right())
|
||||||
successors.append((ACTION.get("rotate_right"), state_right))
|
successors.append((ACTION.get("rotate_right"), state_right))
|
||||||
|
|
||||||
target = go(state.row, state.column, state.direction)
|
target = go(state.row, state.column, state.direction)
|
||||||
@ -95,8 +95,7 @@ def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored:
|
|||||||
|
|
||||||
# make sure not to fall into a cycle
|
# make sure not to fall into a cycle
|
||||||
successor_state = (successor[1].row, successor[1].column, successor[1].direction)
|
successor_state = (successor[1].row, successor[1].column, successor[1].direction)
|
||||||
if successor_state not in fringe_states and \
|
if successor_state not in fringe_states and successor_state not in explored_states:
|
||||||
successor_state not in explored_states:
|
|
||||||
# create new Node and add it at the end of fringe
|
# create new Node and add it at the end of fringe
|
||||||
new_node = Node(state=successor[1],
|
new_node = Node(state=successor[1],
|
||||||
parent=element,
|
parent=element,
|
||||||
@ -122,7 +121,6 @@ def go(row, column, direction):
|
|||||||
|
|
||||||
|
|
||||||
def is_valid_move(map, target_row, target_column):
|
def is_valid_move(map, target_row, target_column):
|
||||||
# TODO: check collisions with objects
|
|
||||||
if 0 <= target_row < ROWS and 0 <= target_column < COLUMNS:
|
if 0 <= target_row < ROWS and 0 <= target_column < COLUMNS:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -47,11 +47,11 @@ class Direction(Enum):
|
|||||||
DOWN = 2
|
DOWN = 2
|
||||||
LEFT = 3
|
LEFT = 3
|
||||||
|
|
||||||
def left(self):
|
def right(self):
|
||||||
v = (self.value + 1) % 4
|
v = (self.value + 1) % 4
|
||||||
return Direction(v)
|
return Direction(v)
|
||||||
|
|
||||||
def right(self):
|
def left(self):
|
||||||
v = (self.value - 1) % 4
|
v = (self.value - 1) % 4
|
||||||
return Direction(v)
|
return Direction(v)
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import pygame
|
|||||||
|
|
||||||
from common.constants import *
|
from common.constants import *
|
||||||
from common.helpers import print_numbers
|
from common.helpers import print_numbers
|
||||||
from logic.knights_queue import KnightsQueue
|
|
||||||
from logic.level import Level
|
from logic.level import Level
|
||||||
from ui.logs import Logs
|
from ui.logs import Logs
|
||||||
from ui.screens.credits import Credits
|
from ui.screens.credits import Credits
|
||||||
@ -59,7 +58,7 @@ class Game:
|
|||||||
running = False
|
running = False
|
||||||
if event.key == 110: # clicked n letter on keyboard
|
if event.key == 110: # clicked n letter on keyboard
|
||||||
print_numbers_flag = not print_numbers_flag
|
print_numbers_flag = not print_numbers_flag
|
||||||
if event.type == NEXT_TURN: # is called every 't' milliseconds
|
if event.type == NEXT_TURN: # is called every 'TURN_INTERVAL' milliseconds
|
||||||
self.level.handle_turn()
|
self.level.handle_turn()
|
||||||
|
|
||||||
stats.draw(self.screen)
|
stats.draw(self.screen)
|
||||||
|
@ -63,15 +63,15 @@ class Level:
|
|||||||
if col == "w":
|
if col == "w":
|
||||||
texture_index = 5
|
texture_index = 5
|
||||||
texture_surface = textures[texture_index][1]
|
texture_surface = textures[texture_index][1]
|
||||||
Tile((row_index, col_index), texture_surface, self.sprites, 'w')
|
Tile((col_index, row_index), texture_surface, self.sprites, 'w')
|
||||||
elif col == "t":
|
elif col == "t":
|
||||||
texture_index = 6
|
texture_index = 6
|
||||||
texture_surface = textures[texture_index][1]
|
texture_surface = textures[texture_index][1]
|
||||||
Tile((row_index, col_index), texture_surface, self.sprites, 't')
|
Tile((col_index, row_index), texture_surface, self.sprites, 't')
|
||||||
else:
|
else:
|
||||||
texture_index = random.randint(0, 4)
|
texture_index = random.randint(0, 4)
|
||||||
texture_surface = textures[texture_index][1]
|
texture_surface = textures[texture_index][1]
|
||||||
Tile((row_index, col_index), texture_surface, self.sprites)
|
Tile((col_index, row_index), texture_surface, self.sprites)
|
||||||
|
|
||||||
def setup_objects(self):
|
def setup_objects(self):
|
||||||
castle_count = 0 # TODO: find some smarter method to print castle
|
castle_count = 0 # TODO: find some smarter method to print castle
|
||||||
@ -82,52 +82,55 @@ class Level:
|
|||||||
|
|
||||||
# add objects, e.g. knights, monsters, castle
|
# add objects, e.g. knights, monsters, castle
|
||||||
if col == "k_b":
|
if col == "k_b":
|
||||||
knight = Knight((row_index, col_index), self.sprites, "blue")
|
knight = Knight((col_index, row_index), self.sprites, "blue")
|
||||||
self.map[row_index][col_index] = knight
|
self.map[row_index][col_index] = knight
|
||||||
self.list_knights_blue.append(knight)
|
self.list_knights_blue.append(knight)
|
||||||
elif col == "k_r":
|
elif col == "k_r":
|
||||||
knight = Knight((row_index, col_index), self.sprites, "red")
|
knight = Knight((col_index, row_index), self.sprites, "red")
|
||||||
self.map[row_index][col_index] = knight
|
self.map[row_index][col_index] = knight
|
||||||
self.list_knights_red.append(knight)
|
self.list_knights_red.append(knight)
|
||||||
elif col == "m":
|
elif col == "m":
|
||||||
monster = Monster((row_index, col_index), self.sprites)
|
monster = Monster((col_index, row_index), self.sprites)
|
||||||
self.map[row_index][col_index] = monster
|
self.map[row_index][col_index] = monster
|
||||||
self.list_monsters.append(monster)
|
self.list_monsters.append(monster)
|
||||||
elif col == "c":
|
elif col == "c":
|
||||||
castle_count += 1
|
castle_count += 1
|
||||||
if castle_count == 4:
|
if castle_count == 4:
|
||||||
castle = Castle((row_index, col_index), self.sprites)
|
castle = Castle((col_index, row_index), self.sprites)
|
||||||
self.map[row_index][col_index] = castle
|
self.map[row_index][col_index] = castle
|
||||||
self.list_castles.append(castle)
|
self.list_castles.append(castle)
|
||||||
|
|
||||||
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_x, knight_pos_y, current_knight.direction)
|
state = State(knight_pos_y, knight_pos_x, current_knight.direction)
|
||||||
action_list = graphsearch(state, self.map)
|
action_list = graphsearch(state, self.map)
|
||||||
print(action_list)
|
print(action_list)
|
||||||
|
|
||||||
if len(action_list) == 0:
|
if len(action_list) == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
if action_list[0] == ACTION.get("rotate_left"):
|
next_action = action_list.pop(0)
|
||||||
|
if next_action == ACTION.get("rotate_left"):
|
||||||
current_knight.rotate_left()
|
current_knight.rotate_left()
|
||||||
elif action_list[0] == ACTION.get("rotate_right"):
|
elif next_action == ACTION.get("rotate_right"):
|
||||||
current_knight.rotate_right()
|
current_knight.rotate_right()
|
||||||
elif action_list[0] == ACTION.get("go"):
|
elif next_action == ACTION.get("go"):
|
||||||
current_knight.step_forward()
|
current_knight.step_forward()
|
||||||
self.map[knight_pos_x][knight_pos_y] = ' '
|
self.map[knight_pos_y][knight_pos_x] = ' '
|
||||||
|
|
||||||
|
# update knight on map
|
||||||
if current_knight.direction.name == 'UP':
|
if current_knight.direction.name == 'UP':
|
||||||
self.map[knight_pos_x][knight_pos_y - 1] = current_knight
|
self.map[knight_pos_y - 1][knight_pos_x] = current_knight
|
||||||
elif current_knight.direction.name == 'RIGHT':
|
elif current_knight.direction.name == 'RIGHT':
|
||||||
self.map[knight_pos_x + 1][knight_pos_y] = current_knight
|
self.map[knight_pos_y][knight_pos_x + 1] = current_knight
|
||||||
elif current_knight.direction.name == 'DOWN':
|
elif current_knight.direction.name == 'DOWN':
|
||||||
self.map[knight_pos_x][knight_pos_y + 1] = current_knight
|
self.map[knight_pos_y + 1][knight_pos_x] = current_knight
|
||||||
elif current_knight.direction.name == 'LEFT':
|
elif current_knight.direction.name == 'LEFT':
|
||||||
self.map[knight_pos_x - 1][knight_pos_y] = current_knight
|
self.map[knight_pos_y][knight_pos_x - 1] = current_knight
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
bg_width = (GRID_CELL_PADDING + GRID_CELL_SIZE) * COLUMNS + BORDER_WIDTH
|
bg_width = (GRID_CELL_PADDING + GRID_CELL_SIZE) * COLUMNS + BORDER_WIDTH
|
||||||
|
@ -8,6 +8,6 @@ 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))
|
||||||
position_in_px = (parse_cord(position[1]), parse_cord(position[0]))
|
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
|
||||||
|
@ -26,7 +26,7 @@ class Knight(pygame.sprite.Sprite):
|
|||||||
|
|
||||||
self.image = self.states[self.direction.value]
|
self.image = self.states[self.direction.value]
|
||||||
self.position = position
|
self.position = position
|
||||||
position_in_px = (parse_cord(position[1]), parse_cord(position[0]))
|
position_in_px = (parse_cord(position[0]), parse_cord(position[1]))
|
||||||
self.rect = self.image.get_rect(topleft=position_in_px)
|
self.rect = self.image.get_rect(topleft=position_in_px)
|
||||||
|
|
||||||
self.team = team
|
self.team = team
|
||||||
@ -36,19 +36,23 @@ class Knight(pygame.sprite.Sprite):
|
|||||||
self.points = 1
|
self.points = 1
|
||||||
|
|
||||||
def rotate_left(self):
|
def rotate_left(self):
|
||||||
self.direction = self.direction.right()
|
self.direction = self.direction.left()
|
||||||
self.image = self.states[self.direction.value]
|
self.image = self.states[self.direction.value]
|
||||||
|
|
||||||
def rotate_right(self):
|
def rotate_right(self):
|
||||||
self.direction = self.direction.left()
|
self.direction = self.direction.right()
|
||||||
self.image = self.states[self.direction.value]
|
self.image = self.states[self.direction.value]
|
||||||
|
|
||||||
def step_forward(self):
|
def step_forward(self):
|
||||||
if self.direction.name == 'UP':
|
if self.direction.name == 'UP':
|
||||||
|
self.position = (self.position[0], self.position[1] - 1)
|
||||||
self.rect.y = self.rect.y - GRID_CELL_SIZE - 5
|
self.rect.y = self.rect.y - GRID_CELL_SIZE - 5
|
||||||
elif self.direction.name == 'RIGHT':
|
elif self.direction.name == 'RIGHT':
|
||||||
|
self.position = (self.position[0] + 1, self.position[1])
|
||||||
self.rect.x = self.rect.x + GRID_CELL_SIZE + 5
|
self.rect.x = self.rect.x + GRID_CELL_SIZE + 5
|
||||||
elif self.direction.name == 'DOWN':
|
elif self.direction.name == 'DOWN':
|
||||||
|
self.position = (self.position[0], self.position[1] + 1)
|
||||||
self.rect.y = self.rect.y + GRID_CELL_SIZE + 5
|
self.rect.y = self.rect.y + GRID_CELL_SIZE + 5
|
||||||
elif self.direction.name == 'LEFT':
|
elif self.direction.name == 'LEFT':
|
||||||
|
self.position = (self.position[0] - 1, self.position[1])
|
||||||
self.rect.x = self.rect.x - GRID_CELL_SIZE - 5
|
self.rect.x = self.rect.x - GRID_CELL_SIZE - 5
|
||||||
|
@ -16,7 +16,7 @@ class Monster(pygame.sprite.Sprite):
|
|||||||
super().__init__(group)
|
super().__init__(group)
|
||||||
self.image = random.choice(monster_images)
|
self.image = random.choice(monster_images)
|
||||||
self.image = pygame.transform.scale(self.image, (40, 40))
|
self.image = pygame.transform.scale(self.image, (40, 40))
|
||||||
position_in_px = (parse_cord(position[1]), parse_cord(position[0]))
|
position_in_px = (parse_cord(position[0]), parse_cord(position[1]))
|
||||||
self.rect = self.image.get_rect(topleft=position_in_px)
|
self.rect = self.image.get_rect(topleft=position_in_px)
|
||||||
|
|
||||||
self.health = random.randrange(15, 25)
|
self.health = random.randrange(15, 25)
|
||||||
|
@ -7,6 +7,6 @@ class Tile(pygame.sprite.Sprite):
|
|||||||
def __init__(self, position, image, group, tile_type=' '):
|
def __init__(self, position, image, group, tile_type=' '):
|
||||||
super().__init__(group)
|
super().__init__(group)
|
||||||
self.image = image
|
self.image = image
|
||||||
position_in_px = (parse_cord(position[1]), parse_cord(position[0]))
|
position_in_px = (parse_cord(position[0]), parse_cord(position[1]))
|
||||||
self.rect = self.image.get_rect(topleft=position_in_px)
|
self.rect = self.image.get_rect(topleft=position_in_px)
|
||||||
self.tile_type = tile_type
|
self.tile_type = tile_type
|
Loading…
Reference in New Issue
Block a user