added moving by bfs

This commit is contained in:
michalnowak18 2022-04-07 13:01:11 +02:00
parent 1b2a4a376b
commit a67d160f9a
9 changed files with 29 additions and 31 deletions

View File

@ -19,8 +19,7 @@ def main():
screen = pygame.display.set_mode((settings.screen_width, settings.screen_height)) screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
pygame.display.set_caption('TRAKTOHOLIK') pygame.display.set_caption('TRAKTOHOLIK')
search = BFSSearcher().search((8, 1), (6, 2), Constants.UP) path = BFSSearcher().search((8, 1), (6, 2), Constants.UP)
print(search)
run = True run = True
while run: while run:
@ -33,7 +32,7 @@ def main():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
run = False run = False
tractor.update() tractor.update(path)
tractor.check_collision(obstacles) tractor.check_collision(obstacles)
pygame.display.update() pygame.display.update()
pygame.quit() pygame.quit()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,7 @@
import pygame import pygame
import math import math
from pygame.sprite import Sprite from pygame.sprite import Sprite
from constants import Constants as C
class Tractor(Sprite): class Tractor(Sprite):
""" Class to represent our agent """ """ Class to represent our agent """
@ -88,16 +88,17 @@ class Tractor(Sprite):
self.rect.y += self.curr_direction[1] * self.settings.tile_size # jak wejdzie na kolizje to cofamy ruch self.rect.y += self.curr_direction[1] * self.settings.tile_size # jak wejdzie na kolizje to cofamy ruch
# w przyszlosci mozna zmienic # w przyszlosci mozna zmienic
def update(self): def update(self, path):
key = pygame.key.get_pressed()
if key[pygame.K_d] and self.rect.x: while(path):
self.turn_right() action = path.pop(0)
elif key[pygame.K_a]: if action == C.ROTATE_RIGHT and self.rect.x:
self.turn_left() self.turn_right()
elif key[pygame.K_w]: elif action == C.ROTATE_LEFT:
self.move() self.turn_left()
# print(self.rect) elif action == C.MOVE:
self.move()
# print(self.rect)
def draw(self, screen): def draw(self, screen):
screen.blit(self.image, self.rect) screen.blit(self.image, self.rect)

Binary file not shown.

View File

@ -5,7 +5,6 @@ class Node:
def __init__(self, current_x, current_y, agent_direction, action=None, parent=None): def __init__(self, current_x, current_y, agent_direction, action=None, parent=None):
self.current_x = current_x self.current_x = current_x
self.current_y = current_y self.current_y = current_y
self.state = tuple([self.current_x, self.current_y])
self.action = action self.action = action
self.parent = parent self.parent = parent
self.agent_direction = agent_direction self.agent_direction = agent_direction
@ -40,7 +39,7 @@ class Node:
neighbours.append((actions, (x - 1, y), C.LEFT)) neighbours.append((actions, (x - 1, y), C.LEFT))
if y < 9: # upper neighbour if y > 0: # upper neighbour
if self.agent_direction == C.RIGHT: if self.agent_direction == C.RIGHT:
actions = [C.ROTATE_LEFT, C.MOVE] actions = [C.ROTATE_LEFT, C.MOVE]
elif self.agent_direction == C.LEFT: elif self.agent_direction == C.LEFT:
@ -50,9 +49,9 @@ class Node:
elif self.agent_direction == C.DOWN: elif self.agent_direction == C.DOWN:
actions = [C.ROTATE_LEFT, C.ROTATE_LEFT, C.MOVE] actions = [C.ROTATE_LEFT, C.ROTATE_LEFT, C.MOVE]
neighbours.append((actions, (x, y + 1), C.UP)) neighbours.append((actions, (x, y - 1), C.UP))
if y > 0: # down neighbour if y < 9: # down neighbour
if self.agent_direction == C.RIGHT: if self.agent_direction == C.RIGHT:
actions = [C.ROTATE_RIGHT, C.MOVE] actions = [C.ROTATE_RIGHT, C.MOVE]
elif self.agent_direction == C.LEFT: elif self.agent_direction == C.LEFT:
@ -62,12 +61,10 @@ class Node:
elif self.agent_direction == C.DOWN: elif self.agent_direction == C.DOWN:
actions = C.MOVE actions = C.MOVE
neighbours.append((actions, (x, y - 1), C.DOWN)) neighbours.append((actions, (x, y + 1), C.DOWN))
return neighbours return neighbours
def __str__(self):
return self.state + ' ' + self.parent
class BFSSearcher: class BFSSearcher:
@ -76,27 +73,30 @@ class BFSSearcher:
self.explored_states = [] self.explored_states = []
self.path = [] self.path = []
def search(self, first_state: tuple, goal: tuple, agent_direction: list): def search(self, first_state: tuple, goal, agent_direction):
self.fringe.append(Node(first_state[0], first_state[1], agent_direction)) self.fringe.append(Node(first_state[0], first_state[1], agent_direction))
while True: while True:
if not self.fringe: if not self.fringe:
return False return False
element: Node = self.fringe.pop(0) element = self.fringe.pop(0)
if element.state == goal: if element.state == goal:
return self.__state_eq_goal_action(element) return self.__state_eq_goal_action(element)
self.explored_states.append(element) self.explored_states.append(element)
for action, state, direction in element.successor():
for action, state, direction in element.succesor():
fringe_states = [] fringe_states = []
explored_states = [] explored_states = []
for node in self.fringe: for node in self.fringe:
fringe_states.append(node.state) fringe_states.append(node.state)
for node in self.explored_states: for node in self.explored_states:
explored_states.append(node.state) explored_states.append(node)
if (state not in fringe_states) and (state not in explored_states): if state not in fringe_states and state not in explored_states:
x = Node(state[0], state[1], direction, action, element) x = Node(state[0], state[1], direction)
x.parent = element
x.action = action
self.fringe.append(x) self.fringe.append(x)
def __state_eq_goal_action(self, current_element: Node): def __state_eq_goal_action(self, current_element: Node):
@ -107,7 +107,5 @@ class BFSSearcher:
self.path.append(action) self.path.append(action)
else: else:
self.path.append(current_element.action) self.path.append(current_element.action)
current_element = current_element.parent
self.path.reverse() return self.path.reverse()
return self.path