From 40b2b178f339a3d62b64a3797e3883f286b0bdad Mon Sep 17 00:00:00 2001 From: Michal Zmudzinski Date: Tue, 15 Jun 2021 19:48:34 +0200 Subject: [PATCH] bfs --- __pycache__/bfs.cpython-39.pyc | Bin 0 -> 1516 bytes __pycache__/colors.cpython-39.pyc | Bin 0 -> 301 bytes __pycache__/house.cpython-39.pyc | Bin 0 -> 999 bytes __pycache__/text.cpython-39.pyc | Bin 0 -> 684 bytes __pycache__/trash.cpython-39.pyc | Bin 0 -> 792 bytes __pycache__/truck.cpython-39.pyc | Bin 0 -> 1525 bytes bfs.py | 55 +++++++++++++++++++++++ main.py | 71 +++++++++++++++++++----------- text.py | 16 ------- 9 files changed, 100 insertions(+), 42 deletions(-) create mode 100644 __pycache__/bfs.cpython-39.pyc create mode 100644 __pycache__/colors.cpython-39.pyc create mode 100644 __pycache__/house.cpython-39.pyc create mode 100644 __pycache__/text.cpython-39.pyc create mode 100644 __pycache__/trash.cpython-39.pyc create mode 100644 __pycache__/truck.cpython-39.pyc delete mode 100644 text.py diff --git a/__pycache__/bfs.cpython-39.pyc b/__pycache__/bfs.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b61c917e8931b8e186a418843c54fd3483cf1e64 GIT binary patch literal 1516 zcmah}&2A$_5bnSEv7JN~3fWDxhj3e87O_Gc5JCu6LI~kY#AReOc&8`HB=(HmJx&Pf zIXO?j1FUwBya+;^IiR_6KzRi&@KrmG&0gqH*Hm@=bXR@VJ>K2zGK}~C`t|z{BF6qC zVS7jjpJCdMKs3{Q!lpdooOm%2iTILfsnsphYAF(_10CM7MCnM!_y<~?utDbzzHGqT zxUlJYwXpdxqm}LPu+ITjbCz(;5}}nATHbQR<%kosYFKGF2V0)R3(PMt?Gq5k9ZQ)L zpxjAN;S{LU3?cY%pjtVrY}?U=$+Nns$~K&hOTbmm@`liUvM=x@FSy!{su)4lEKCLD?H^)z(4@M_nr884q zV{Kn&^FurJ5cJWbnfnocXdm=M2{ zrt`&kveK9yg7_0|5dzpyeJK@7wTiiyGg@2^%8m?t9e)FJ#v19k=2y)0wI~5ZqaZ8D z$67)Tn!w4|%%S31K4v;RU^TxGXYvi&W21Sr*2sH}vOhUA&mnVxj`rCjM9}h(orxx_ zl?$C%3j2%q4;@FuVC7eSc<<${*S`Pfu?ECpwE=p~8r-+E453PW6E>U&E- z1875l9$myf9<)s~AO2@8JYi0e4O!G39}9apxs)&1ch5(%iJMN-#kpb!t?MpT({nwi zuDE%Hf8hT(x$9Ac`K$R8hnTnq9=bu->?2Lz!gQBsZ7?%MS#O~50BtU z>Y+G9pd`8~Y*FXB4d#n{0iagzfK58t!kDzgT}*g`kg7f!}BxC{U#~=$UG47%Qe|5CbT%Us5r(qGdUy1CAB!a zB)=fWFTcD}AuT^ACACOF!$>nG*fYMMC_gJTyCl9iH#0RkGqET;F(x@bC%>pzub}c4 WhfQvNN@-529mp@m96*AF5dr}NS3{!! literal 0 HcmV?d00001 diff --git a/__pycache__/house.cpython-39.pyc b/__pycache__/house.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50f49c9de2e88e56f797f986987e1c48e581fe3d GIT binary patch literal 999 zcmZ8g&5qMB5VjrXXDhlCX)j0!tvC^BSuLCpLI}Z%p98%t2vG%@D0aKqrb%n3uv;Y; zx>v+2z>zoL0eA{?@`QzPpM#wKTE|LevLtt|Q z#8V=Pr02kEHX@Qq@0^UN4~@VFq#k5M=E#?0}*$9%HFwaL1D#+~L-LRxORn z@M9Z79j`tHHUkh1ZHOQZ0|_bM8Xd;Wdh^OyZt|6iJ=j$-wh_4UIgP5P6x`LSTW0gCI1Zt8LfC{^oE9jX`9Y&Xf?gC&a9h%L4UFLM)bP(Vgfm zxbCXEAR_cp%nNMrGZA%mhWdsOBV>osbx<05NZ#(WtYIglAycL~g~vJ~3oaQT<_%vy ziK)gEv8R35Y~Y$Q)_41V71$^@!W|%Z28$vzqCH@J8T1UR+Yp{2yJ9|qG9fLk;qy2r zl7I3(CoQXK!`4{jqlC3y%faT(J^wZl)YE8#&5_DX*`q@c=R=E!-jtGn(!;7 zWU;rn_8O*gY-Rj+Gszdo%k)hmBlk8j<@SsCYrvK-z- z*+`XHCG&D(>1}v4UdV$gux$#P)-MKMU>IOAI|ouz6$;!ycojmfOnn? W8C`CdHoD(U*#kE?IGWo*6#fP0jMl6G literal 0 HcmV?d00001 diff --git a/__pycache__/text.cpython-39.pyc b/__pycache__/text.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..387112172a7b87099501a313bfd4363d3394897e GIT binary patch literal 684 zcmY*Xy>8nu5ayp~rFMb<**XR25-k}z21QXIL4g3RhuU2P0jexgj%?W!NCt@mYHFuE zg+2Bmy7dt{aqZ++=+vWv0_h!i{0?{e?nf*R4__dV$6r6c{J;qP4$gBS;Jkxl&cFyH zaD!Gj#W-Nnkdz22*f*3?5eW`A6J&yt!5*?vf_-#%Q(HMM1I<6703tY-aLh|E4sVeI zYKwQYBMx*+cBl$OWIRo%=UT3X)H<;EcrI z|6G+Bfb)lC<7WmHF zjUNS&tJwl-n$WmmU=TjS`T*|#W(!qAw4dz)fWRFQq@xxs@D`Tk$c}W(QimP;N;1+# z9e336oH?|OT;%wUgyq8QY`lL33<;?}0OkG|@WXMXr8LFb%%J;oYpaBN-frf_N@@-X zp1p@%^nH0=%C(i+vsqKyWZ;J(>#8w+m|aQOKrL zU*Q;y7QQisRnD=-xp)x&{h;%wRC|baxM!6x&_>?ocih5yw8o)fKlsGplp*Q4$mC1a zEYdz{TvOe3g8tdHL#!HWsL6>iJydDGHJhT67qq9{+qZ^G(!hH3*EaKfZr@=MwT0C%1OmN51T;mRpwAIZIM#9n?(#~%SGx#=dx__3f?!zfF`^z*5DLX` zVQV|>C)*{$*c#+XST}y6Qo&Cq`p~#K9ZKU23T^5lRWdHqA~$nj^0>%LRb<8=oF-9U z8ZYffi8O9jL?U$Iq|6SKkB`+rn7X|gue&1Z9<2P@i(hmSheHtHj_oO~5i$S+t zoSbeR6q%4}^U2e&yZ?p{RMC@1CD;8_#%ZLEqV5FrsR=kw^R(m~pVIRn2=(o^LK~om z^ES;}(`_+^J{@R#@Y{Uvf>CAHBde4ATFsWpb12JBVf?8nC zGI>ZYDFymW{1d>U(%1gd1%lBtwolYDTp4=Cj|Kyoiy8O|kw8!g)%dnCw5jFtgabcj zgKCsgmpoRHKD-b6HO5b_{)Z25nXJ8%peD`CKK3KF<(ZQy(2Lh!)w9t0}f z6-YwWD?M934ozu!Z;N5eGX4!?j9CtungeBPGYQGsom!M-9QZvOkFSa{D&;C1(nvKz z*Xbf1HmgV~=U-9aOO{(}V3g3Y7udhfh+Z-*o9$f0NZX;Sny|;zOBLn%piq6a4s+E4 zF-^G_UVP!HU|4?Md*jnlLAv5d0o|GLNoI~AOl L*rzs*fHs{!Z0$Mf literal 0 HcmV?d00001 diff --git a/bfs.py b/bfs.py index e69de29..3074435 100644 --- a/bfs.py +++ b/bfs.py @@ -0,0 +1,55 @@ +from house import is_house +import pygame + + +class Node: + def __init__(self, pos, direction, parent=None, action=None): + self.pos = pos + self.direction = direction + self.parent = parent + self.action = action + + +def successor(pos, direction, houses): + neighbours = [] + axis = 0 if direction in [0, 2] else 1 + move = 1 if direction in [0, 1] else -1 + + neighbours.append([pos, (direction - 1) % 4, pygame.K_a]) + neighbours.append([pos, (direction + 1) % 4, pygame.K_d]) + + if not axis: # x + new_pos = [pos[0] + (move * 40), pos[1]] + if not is_house(new_pos, houses): + neighbours.append([new_pos, direction, pygame.K_w]) + + else: # y + new_pos = [pos[0], pos[1] + (move * 40)] + if not is_house(new_pos, houses): + neighbours.append([new_pos, direction, pygame.K_w]) + return neighbours + + +def bfs(pos, direction, end_pos, houses): + visited = [] + queue = [] + actions = [] + queue.append(Node(pos, direction)) + + while queue: + curr_node = queue.pop(0) + print(curr_node.pos, curr_node.direction) + if not is_house(curr_node.pos, houses) and curr_node.pos == end_pos: + while curr_node.parent: + print(curr_node.pos, end_pos) + actions.append(curr_node.action) + curr_node = curr_node.parent + actions.append(curr_node.action) + return actions + + visited.append(curr_node) + for n_pos, n_direction, action in successor(curr_node.pos, curr_node.direction, houses): + neighbour_node = Node(n_pos, n_direction, curr_node, action) + if neighbour_node not in visited and neighbour_node not in queue: + queue.append(neighbour_node) + return actions diff --git a/main.py b/main.py index 23c1690..aa67b20 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ import pygame +from time import sleep -from text import msg_display from colors import gray from house import create_houses from truck import Truck @@ -12,13 +12,37 @@ from bfs import bfs pygame.init() -def update_images(gameDisplay, truck, trash, houses, score): +def game_keys(truck, trash, houses, auto=False): + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if auto: + sleep(.2) + if (event.key == pygame.K_w or event.key == pygame.K_UP): + if truck.test_crash(houses): + break + truck.move() + print('↑') + if truck.pos == trash.pos: + trash.new_pos(truck.pos, houses) + break + elif (event.key == pygame.K_a or event.key == pygame.K_LEFT): + print('←') + truck.rotate(-1) + truck.rotate_image(90) + break + elif (event.key == pygame.K_d or event.key == pygame.K_RIGHT): + print('→') + truck.rotate(1) + truck.rotate_image(-90) + break + + +def update_images(gameDisplay, truck, trash, houses): gameDisplay.fill(gray) for house in houses: gameDisplay.blit(pygame.image.load('./img/house.png'), house.pos) gameDisplay.blit(pygame.image.load('./img/trash.png'), trash.pos) gameDisplay.blit(truck.image, truck.pos) - msg_display(gameDisplay, f'Trash collected: {score}') pygame.display.update() @@ -33,12 +57,12 @@ def game_loop(): gameExit = False - score = 0 truck = Truck(game_w, game_h, grid_size) trash = Trash(game_w, game_h, grid_size) houses = create_houses(grid_size) - trash.new_pos(truck.pos, houses) + trash.pos = [(game_w // 2)-160, (game_h // 2)] + # trash.new_pos(truck.pos, houses) while not gameExit: for event in pygame.event.get(): @@ -50,29 +74,24 @@ def game_loop(): pygame.quit() quit() if (event.key == pygame.K_b): - bfs() - break - if (event.key == pygame.K_w or event.key == pygame.K_UP): - if truck.test_crash(houses): + actions = bfs(truck.pos, truck.dir_control, + trash.pos, houses) + if not actions: + print('Path couldn\'t be found') break - truck.move() - print('↑') - if truck.pos == trash.pos: - score += 1 - trash.new_pos(truck.pos, houses) - break - elif (event.key == pygame.K_a or event.key == pygame.K_LEFT): - print('←') - truck.rotate(-1) - truck.rotate_image(90) - break - elif (event.key == pygame.K_d or event.key == pygame.K_RIGHT): - print('→') - truck.rotate(1) - truck.rotate_image(-90) - break - update_images(gameDisplay, truck, trash, houses, score) + print('##################################################') + while actions: + action = actions.pop() + print(action) + pygame.event.post(pygame.event.Event( + pygame.KEYDOWN, {'key': action})) + game_keys(truck, trash, houses, True) + update_images(gameDisplay, truck, trash, houses) + else: + pygame.event.post(event) + game_keys(truck, trash, houses) + update_images(gameDisplay, truck, trash, houses) clock.tick(60) diff --git a/text.py b/text.py deleted file mode 100644 index 2ad8549..0000000 --- a/text.py +++ /dev/null @@ -1,16 +0,0 @@ -from colors import white -import pygame - - -def text_objects(text, font): - textSurface = font.render(text, True, white) - return textSurface, textSurface.get_rect() - - -def msg_display(gameDisplay, msg): - msg_size = 35 - pos = (1100, 16) - largeText = pygame.font.Font('freesansbold.ttf', msg_size) - TestSurf, TextRect = text_objects(msg, largeText) - TextRect.center = (pos) - gameDisplay.blit(TestSurf, TextRect)