From ffc699494a57ba89473c31011959561a5802e85d Mon Sep 17 00:00:00 2001 From: MarRac Date: Sun, 14 Apr 2024 14:28:40 +0200 Subject: [PATCH] added BFS for generating movement list --- source/__pycache__/bfs.cpython-311.pyc | Bin 0 -> 9131 bytes .../area/__pycache__/tractor.cpython-311.pyc | Bin 6566 -> 6464 bytes source/area/tractor.py | 18 +- source/bfs.py | 179 ++++++++++++++++++ 4 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 source/__pycache__/bfs.cpython-311.pyc create mode 100644 source/bfs.py diff --git a/source/__pycache__/bfs.cpython-311.pyc b/source/__pycache__/bfs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..242ec3f305dd02b152c470adee111d718d333636 GIT binary patch literal 9131 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 delta 2150 zcmbuAOKclO7=UNIyNTaUnr@QK!*-G;)}~d8+9Fy=QXZvgA$8RzAnGPEi`Pya)(?%H zBCJY|1P3EUs-oeL0}>H}KvXU$95`^`!UZXkZCSFlRZ$VAo-hvy2_(Y&>(+Im8d8{D ze>?v_|NcAkKjd$YZ5(%g>Tp;Q8_8`ka=U%i*^Sjz-_b#gRHSm6C1wp+W43_Jka^7> zu$#~nQiXRB{Q-BZ-aLd`R=@NM{M6+auh2d$<03taivpfOvV#tp&Y3bM8Z%|O(>#2n zHWphS%+}2m^Bo;X#Tyu*TkKaG>lV<{pW0nd-$22-`3 z8(pht2JLds@6)~T-`uzC(|v0*_u0L>hZD$Ve`b(`Q;8)K3a5@nW6A=1q=^zrCrFS) z7p|qplJSLm5a^7jso_%6u;RdKpo!H95>yj!#SKHqZBs)M)WQ+tv$B;|O`}ifg0U~1 z*Aj}VJ3@*0^)N{X6)ky9k$Ig@g|!Ijg4A{c`sf&!!hh0_xY2CYjCzK0{EG9A*!%um zSsW>fBYEG;1#!A0PM5_%Q4AEsxso`?Y^-`EKBo6X}%x@ zOHy!OZ#8?V$|0ARePyf6Z41~-Ke71m0Nu98*thk&#bLrjTY~)^d}R~+Wee$pSO|b# zfDs>vJAv*XW`GecXpl`zyzG&JG<(Saqt3??*TWh6Y^@Z=K)OtSbbQ!5#8yM~#$y6F zh0OoDPH(z;+RdtoRT`6PBi=^8b9!l}&2C>b`VZ9W9JFf|8mQjpD!0MbZ`Ey>lZR_i zs=S|cvUkZrhUmu5&d#P#JEX)Ex`h>OJQYchnBGDXX(b&d{b2n9L*uzzwZ&jM5u|RH zJEp?=Ifi9avAI?z*De)p?!3)i>36ea`E!0&6*)hv3#DN9z=Ty&NgOVVM~dQ+&t^Xl zeAQ79CraW3R8WpxIVy7brqg4h^Qx)*@iSwLe1=#J~~jK;M8@5l!V;&@3M ze|Y4rzdCyG`RAEq*+w8AWQsu-QXxgVp9n~%&cC5W(+vd)6{xqW(Nt1X-q!hu7EQ_= z@zSX1VWs_^=)-CHg(%~@^tSj+3q)2vNc%d6vkmRel(kfIFgp%-3UC5&67VG86krhW zEZ_{_JYX6y%dm-z+!^&x9H0e2yQF?$Sgv0cGyS%6Iol?@j;pAFBR=6+71i-7b_v5( zRL3Dfn5?2Y+5}+&#QR{P8^pb+?Fn`wJN2#*NhE_wR>R>C&3B#7>Q;q>m9a=Ptf>V4 zmx&Evq`)}BYal}4jAQ*_9*-r|B`rKj=9muJIQ20@mBScU(5d|HyMna*Ki;lA%k=y1 Vq0=0: + return "move west" + elif node.get_direction() == DIRECTION_NORTH and node.get_y() - TILE_SIZE >=0: + return "move north" + elif node.get_direction() == DIRECTION_SOUTH and node.get_y() + TILE_SIZE < FIELD_HEIGHT: + return "move south" + else: + return False + def draw_tractor(self, win): imageTractor = pygame.transform.scale(self.image, (TILE_SIZE, TILE_SIZE)) diff --git a/source/bfs.py b/source/bfs.py new file mode 100644 index 0000000..20725e2 --- /dev/null +++ b/source/bfs.py @@ -0,0 +1,179 @@ +from queue import Queue +from area.constants import DIRECTION_EAST, DIRECTION_WEST, DIRECTION_NORTH, DIRECTION_SOUTH, TILE_SIZE +from area.field import get_tile_coordinates, tiles, fieldX, fieldY +import copy +from area.tractor import Tractor + +class Istate: + + def __init__(self, x, y, direction ): + self.x = x + self.y = y + self.direction = direction + + + def get_x(self): + return self.x + + def set_x(self, _x): + self.x = _x + + def get_y(self): + return self.y + + def set_y(self, _y): + self.y = _y + + def get_direction(self): + return self.direction + + def set_direction(self, _direction): + self.parent = _direction + +class Node: + + def __init__(self, x, y, direction, parent, action): + self.x = x + self.y = y + self.direction = direction + self.action = action + self.parent = parent + + + + #getters and setters: + + def get_parent(self): + return self.parent + + def set_parent(self, _parent): + self.parent = _parent + + def get_action(self): + return self.action + + def set_action(self, _action): + self.parent = _action + + def get_x(self): + return self.x + + def set_x(self, _x): + self.x = _x + + def get_y(self): + return self.y + + def set_y(self, _y): + self.y = _y + + def get_direction(self): + return self.direction + + def set_direction(self, _direction): + self.parent = _direction + + def copy(self): + return copy.copy(self) + + #State: + def get_state(self): + x = self.get_x() + y = self.get_y() + direct = self.get_direction() + state = (x, y, direct) + return state #returns state as a tuple (x,y,direction) + + +def goal_test(elem, goalstate): + if elem.get_x() == goalstate[0] and elem.get_y() == goalstate[1]: + return True + else: + return False + +#actions(string): move, rotate_to_left, rotate_to_right + +#main search function: +def graphsearch(istate, succ, goaltest): + + fringe = [] + explored = [] + node = Node(istate.get_x(), istate.get_y(), istate.get_direction(), None, None) + fringe.append(node) + + while True: + + if not fringe: + return False + + elem = fringe.pop(0) + temp = copy.copy(elem) + if goal_test(elem, goaltest) is True: #jesli True zwroc ciag akcji + return get_moves(elem) + + explored.append(elem) + + for (action, state) in succ(temp): #dla wszystkich mozliwych stanow i akcjach otrzymanych dla danego wierzcholka + fringe_tuple = [] + explored_tuple = [] + + for node in fringe: + fringe_tuple.append((node.get_x(), node.get_y(), node.get_direction())) + for node in explored: + explored_tuple.append((node.get_x(), node.get_y(), node.get_direction())) + + + if state not in fringe_tuple and state not in explored_tuple: + x = Node(state[0], state[1], state[2], elem, action) + fringe.append(x) + + +#funkcja nastepnika - jakie akcje sa mozlwie na danym polu i jaki bedzie stan po wykonaniu tych akcji +def succ(elem): + actions_states = [] + temp = copy.copy(elem.get_direction()) + + if temp == 1: + temp = 4 + else: + temp -= 1 + actions_states.append(("rotate_left", (elem.get_x(), elem.get_y(), temp))) + + temp = copy.copy(elem.get_direction()) + if temp == 4: + temp = 1 + else: + temp += 1 + actions_states.append(("rotate_right", (elem.get_x(), elem.get_y(), temp))) + + temp_move_east = elem.get_x() + TILE_SIZE + temp_move_west = elem.get_x() - TILE_SIZE + temp_move_north = elem.get_y() - TILE_SIZE + temp_move_south = elem.get_y() + TILE_SIZE + + if Tractor.can_it_move_node(elem) == "move east": + actions_states.append(("move", (temp_move_east, elem.get_y(), elem.get_direction()))) + elif Tractor.can_it_move_node(elem) == "move west": + actions_states.append(("move", (temp_move_west, elem.get_y(), elem.get_direction()))) + elif Tractor.can_it_move_node(elem) == "move north": + actions_states.append(("move", (elem.get_x(), temp_move_north, elem.get_direction()))) + elif Tractor.can_it_move_node(elem) == "move south": + actions_states.append(("move", (elem.get_x(), temp_move_south, elem.get_direction()))) + return actions_states + + + + + +def get_moves(elem): + move_list = [] + while (elem.get_parent() != None): + move_list.append(elem.get_action()) + elem = elem.get_parent() + move_list.reverse() + return move_list + + + + +#Testy