Compare commits

...

2 Commits

Author SHA1 Message Date
Mateusz d503ee4f0c implemented path finding 2023-04-19 23:53:36 +02:00
Mateusz 9406038dcb implemented movement planning 2023-04-19 23:51:24 +02:00
3 changed files with 50 additions and 18 deletions

14
bfs.py
View File

@ -1,15 +1,21 @@
from succ import succ as successors from succ import succ as successors
def bfs(istate, goalstate): def bfs(istate, goalx, goaly):
fringe = [istate] fringe = [istate]
explored = [] explored = []
steps = []
while(fringe): while(fringe):
state = fringe.pop(0) state = fringe.pop(0)
if state == goalstate : if state.xpos == goalx and state.ypos == goaly:
return steps.insert(0, state)
while(state.parent != None):
state = state.parent
steps.insert(0, state)
return steps
element = successors(state) element = successors(state)
explored.append(state) explored.append(state)
for value in element : for value in element :
if value not in explored : if value not in explored and value not in fringe:
fringe.append(value) fringe.append(value)
return False return False

53
main.py
View File

@ -1,5 +1,8 @@
import pygame import pygame
import random import random
from bfs import bfs
from state import State
import time
pygame.init() pygame.init()
WIDTH, HEIGHT = 800, 800 WIDTH, HEIGHT = 800, 800
@ -17,6 +20,10 @@ COBBLE_IMG = pygame.image.load("cobble.jpeg")
COBBLE = pygame.transform.scale(COBBLE_IMG, (50, 50)) COBBLE = pygame.transform.scale(COBBLE_IMG, (50, 50))
FPS = 10 FPS = 10
class Agent:
def __init__(self, rect, direction):
self.rect = rect
self.direction = direction
def randomize_map(): # tworzenie mapy z losowymi polami def randomize_map(): # tworzenie mapy z losowymi polami
fields_list = [DIRT, GRASS, SAND, COBBLE] fields_list = [DIRT, GRASS, SAND, COBBLE]
@ -34,37 +41,57 @@ def draw_window(agent, fields):
for i in range(16): for i in range(16):
for j in range(16): for j in range(16):
window.blit(fields[i][j], (i * 50, j * 50)) window.blit(fields[i][j], (i * 50, j * 50))
window.blit(AGENT, (agent.x, agent.y)) # wyswietlanie agenta window.blit(AGENT, (agent.rect.x, agent.rect.y)) # wyswietlanie agenta
pygame.display.update() pygame.display.update()
def agent_movement(keys_pressed, agent): # sterowanie #def agent_movement(keys_pressed, agent): # sterowanie
if keys_pressed[pygame.K_LEFT] and agent.x > 0: # if keys_pressed[pygame.K_LEFT] and agent.x > 0:
agent.x -= 50 # agent.x -= 50
if keys_pressed[pygame.K_RIGHT] and agent.x < 750: # if keys_pressed[pygame.K_RIGHT] and agent.x < 750:
agent.x += 50 # agent.x += 50
if keys_pressed[pygame.K_UP] and agent.y > 0: # if keys_pressed[pygame.K_UP] and agent.y > 0:
agent.y -= 50 # agent.y -= 50
if keys_pressed[pygame.K_DOWN] and agent.y < 750: # if keys_pressed[pygame.K_DOWN] and agent.y < 750:
agent.y += 50 # agent.y += 50
def main(): def main():
clock = pygame.time.Clock() clock = pygame.time.Clock()
run = True run = True
agent = pygame.Rect(0, 0, 50, 50) # tworzenie pola dla agenta agent = Agent(pygame.Rect(0, 0, 50, 50), 0) # tworzenie pola dla agenta
fields = randomize_map() fields = randomize_map()
while run: while run:
clock.tick(FPS) clock.tick(FPS)
for event in pygame.event.get(): # przechwycanie zamknięcia okna for event in pygame.event.get(): # przechwycanie zamknięcia okna
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
run = False run = False
keys_pressed = pygame.key.get_pressed() #keys_pressed = pygame.key.get_pressed()
draw_window(agent, fields) draw_window(agent, fields)
agent_movement(keys_pressed, agent) steps = bfs(State(None, None, 0, 0, 'E'), 250, 100)
for interm in steps:
if interm.action == 'LEFT':
agent.direction = (agent.direction - 1) % 4
if interm.action == 'RIGHT':
agent.direction = (agent.direction + 1) % 4
if interm.action == 'FORWARD':
if agent.direction == 0:
agent.rect.x += 50
elif agent.direction == 1:
agent.rect.y += 50
elif agent.direction == 2:
agent.rect.x -= 50
else:
agent.rect.y -= 50
draw_window(agent, fields)
time.sleep(1)
while True:
pass
pygame.quit() pygame.quit()
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -26,5 +26,4 @@ def succ(st: State):
successors.append(State(st, 'RIGHT', st.xpos, st.ypos, 'S')) successors.append(State(st, 'RIGHT', st.xpos, st.ypos, 'S'))
if st.xpos < 750: if st.xpos < 750:
successors.append(State(st, 'FORWARD', st.xpos + 50, st.ypos, 'E')) successors.append(State(st, 'FORWARD', st.xpos + 50, st.ypos, 'E'))
return successors return successors