From a58d49e94d787b371afb08349ce0dcfd5cf395c2 Mon Sep 17 00:00:00 2001 From: s473561 Date: Sat, 6 May 2023 14:59:23 +0200 Subject: [PATCH] bfs works, bfs_main.py --- __pycache__/main.cpython-311.pyc | Bin 3416 -> 4705 bytes __pycache__/wozek.cpython-311.pyc | Bin 4018 -> 4376 bytes __pycache__/wyszukiwanie.cpython-311.pyc | Bin 6376 -> 6367 bytes bfs_main.py | 56 ++++++ main.py | 214 ++++++++--------------- wozek.py | 43 ++--- wyszukiwanie.py | 209 +++------------------- 7 files changed, 169 insertions(+), 353 deletions(-) create mode 100644 bfs_main.py diff --git a/__pycache__/main.cpython-311.pyc b/__pycache__/main.cpython-311.pyc index 175898b2d13fb4a838545905b09ea5ad3b77bae2..a18131a495483a9819cec4ca633a720a79097de3 100644 GIT binary patch literal 4705 zcmcIn-EZ606~B}yiTbi^%Zlx|c2sPxtvPX>Ze6o236RZ->)G&<`Xi{OhEPS?mGxnl zRN7c@0A(;RH4rcr@K8N;fFHUPLx3Rd3f&c{La0H_nv$Cx!><0P`+GP5xxNFD||4Dy(zpXF@$_V1R^jQ5<9vxF@`?d zVm7$jGWIMRV;O9-XB=5)%*hZN5t((DLG}=YN5%tTu#Gbw_uPimdKcJ-;P(;yk4nq~ zHeTat&u2)jcfrwN<8SlR)rvJ_!P#y@`}UvwxY})Efi^$g26yXS47A%ow74A->k-^g z_liNmleQsV@3^F|_BNGCvY+}bFJ>4;5lz&n#1&|Vl! zWfN6?$iLc`=h(6Lb08R`^3SEd-kIRB|JSprjdgAVWf& z3@>g&^$E#CZIr!MoS`J!WStHL6(AcE31!v*t=b*}=8=iR$pgb<79tMKDJLaS%xUbq znN(hL(7tKRU5(j-!LqWLS(VXm_}jOWKaVfVq9n(sqx19e>5b%_EDTGIFD@-l&t8lF zgqOvvDCed4Vj+JgS;!@LbMVRaMBIFUNbod>@oXXm5!ljLK}vim;fx8uUmk<1NDf%f z@8^CuS7CQO)um5Y_Le?dQC>PnA_O!MbgroX?=OWp#fj!S`}=aGxbzPa}75c zBY-qlbDM9PXVBaK&G+W1zRlI#^z9Pt+k`hW$fAyHuOanPcR!l%G771y^Uf&0jojT^}@L!44NEa1UXoJu+t- zLry_+6z#T%b_3dNncG9rR=K@^_F3lkQ?ym?E# z+HIM;m!hq52LbJ~%-u)PR=Gof4p`UpMA79zss+Xk>lJXos~+_grZtf636n zemHE%)8w6=d$xQl--#Wv+}oCsM-1D&bB5GBJP*S_F z>qqSRk3k_}N}*N6mij9|QWdClYJg`09T%&Pc}mAkS;sSnj$68p`>~GOua4PY$Hb^( zcGq#6(lMjzn2IA|2`Mz^=GIywD{2n$12{@)_BAoDvH7h{QDbi|&n{_pc}vz<@h+Uq zTyxR4r+;&6L9?gDEsdMwql>?~b|b1e=Xk2-w)o_GiQF2P&hg7P0MEZQJM-p}#@#g< z06HJNzN9&TYWaqQ-ITDK5_Vl}zEX+qE*M&GJvgBRC)ClgR&7^3IH?3DJFq4L#Tstn^*}@kL=3_v=yB-D z;Iq}I>H5W4<>G7yQIr1h=#$8^51!tuzc#PDHs8ej{m@C=T_so9Re62)YK?mtMV0e+ zXr6n!%WqT?4=$H3t7rO4(eg}bM)miWZ&mFNZkKMWX9iKHT0(sT9s_^yKJZq4UE|I* zxN{13?ttq;%^zo~u^Knt;Kmhh{2LB>R`yn|Ro<_@T)o+X^?y(8-?;C~aPV&#zKi#l zRi=8eny7K%1{YSi@DYPG?Gdjv?0?7WD=mNIEqhB|e07&9??1Rwx^fT-H$tO_gz*p1 zs=^#}_f>9w?Amoz;G(au+_ldQ)w!V>H{9Tc6>j+JSsSi53Dc9t@jR|go{#iNcv6yn zfYnd2$%!Af>4bzUS-OH1O=4^+m&!}OKm;d?c|N-#h%}{0m<=I6Y$OB;6T0Tb=44_s zpW1*APW=8ovOtMu7n%{U3pvP&JpUI$`$SX5x7=kQzLOEJO0&R)d0TcseQ0MGMkSsi zy;R~a(n}@2BE3{HsI>o7(yz4to)d4;x#PX>-vL|I9Vn0NyTf&Nc<*e@eZJv7Uv#RT z?(+G4&rsbnq`dS-&2y>Yxm0vLC(fO&eR8%=&MHH%*2q+YOethab@_L;_gw>Z*MKtk zqnc}?;hHG2>JhlVPWr2CjSM%)utJ6pS%#T}S7lV58HO1-BrWxljj+B_p>7{k?1L)H V6{qiC-??6-*P)%TXF*NF^e;=Ed+-1N literal 3416 zcmcgu-D}%c6u+W7*QKO_MwsMKY2p4T;T`5-F!oi?q`+BIC5I z$U;kNo`hHQQUuFrT*4>%5`NL2;6*+mh=McDYB&)P1BpJdk3uw3==J`V;R6s3TOCA^ zcLS|%DcF*_TiJ5}b3BB9vxtMBGt}ypPPL@&R`#CI8Sb(3S~s>O%UrLHGq+dS@%8G6 zBRzIbx464oWu#XJcFezv#8D+A^BXil>KOKH^yE&-)Eb=98VU0Q{Hd_*cY0GnCGp#8WyQs#@Fm2c1Cg|jz zWJcA56jzM7gsQ9?F(nEtK>lVr8P5z}OPY$N#+9U*+@9PbMl=1#a5a`n5>Sjxs#Q1; z$Q6738%wU2**-i3OOUApSmvR#RHCqh%+_^;UhlGZDAPkQ%_7q>1KNN-Y-{Y$Cb4#0 zvQ+QpmcahYC5zVEtXcZRY?v%lpmm&O7Eyuzir-xmD z|Fe$2gX~CV*A)k6=-E54InqI{ul-h;nIGY*<_iRJ*!x#spcXt&%n zp#847c?a#5TL3h6&Fy#4Zn-g_8QJf02LlcoyF~W^nsd$F@1Wgs4*=Tlnmg#A-Et2C z8oTBma?mevgZBkmx4OISjT3OQ&vf2)(oLzITsm)0#u(6@?z~+eY{@5+2nF#V&&vqH zF#N-(R&^4>Y!XRqB83_IZD@271e_{Nt0cXu1*mKi0&NntY~qeKi4HaiD>jK=#K$DkLD7A`$erz!XXE#w9qC9D0g_g{i{A{!)G^clnP2G&J$x!ov%>>raEj z1*sS;E<6~2IG$U2Dg+DXE5bxgm^c#Vs>0k)o}YzZ#ENjWCS1)eKH-FCDC7y%gToCp z>JL35)!srK2fw*~|9X+yU(K)Xtv<$sPM5FX=^CCcxK7+( zCr)p%YEm`zH;Cvn6cZd)R`f~I^*CQx7OSNsStk+75(pqBrA;*j&P=|%nmR;sZa$fF z5*#-geS~x;7|ny;3*QI8x~VB2>K{XwL?UAz>IOqmR2}g-=cywh=R9>3$T?3P;hghy zjf|90&##U?D!=MiM-%10`Zc_W!a47*a4)b62J8O*{KS!evg)4%fAP=O{IfZ4ogc{0 z9`R#Ueyn`vy$XM+#$U>DPmp)F?+AseC{!MstDuWDbg_&s*15oL_J})Ooi#>;5D!JnhxwA{7z7Fo@Cu?9{~e7{@pmL+oT@aFFi8{Bl-{R~a9 z{jZ&i{ z_Rm(vyI3=!guy8}2LP?As>vVDhjMsXsB65kbGB|(PM`DEj`z=aTZ-P6(&~+c%{R|a zo}Ua%1|F?>68>Xd?qL4#Y*l+vd~-(KczVWYD;jO3&b9YqH+l-$%`ZE)e&Td)#^@*- z9i`T;d$re&PaGfLKY=gzj`sp*?9cU&))#6E;os^D_0Pk(-Y;^RYcY9}e5h0wa-m#k z!HW!ECnTbNc;?Yy6? zdVQv`X8|ed5_nkLccgi1jT%@$p8^c{3ttDBL83j(#8@@UeSdwDmOFz;j$8pC5cMgItL&vx@; zs8iahP!Mzx+BO>?u8Kh80j32j;ejtu}BZmLDFZSlJ2d!5zI-nm4)&P z>4q*qdxg0cAJ(LJH&NBdW*4v2gn>{vLJGjqgs%Q@f>^*LHimr+xd5MzfCrE}6*h0{9t@qh&y; zqzW!=Vt^)|5BFS6kVN`@k8pU=RD)}&B(A{>omwxOAn zFj09>(o0+z#@b`C_ZsiWqL{Kw%=E5zep0h4Gw+m>uj2BvYwuov8F zUbF9?Hf>2LJ2%y_YA#+e7lU)4Hr@DOd|`aSv*1~(TONE}KYcpcyq4`+;a{k**i*x+ zvU5dtZj?_{Ee_tVPd9!jJF-XF$g1pKk=^UX6^r<;f8L++q(Zaaly|9cIrPT4c5Jhdx?uRN(R=8onYj%vEZ{MBZ~)G5eE$1<}=e8tM^nM*rbGk{ToOH zgO|a_P|d*J!zYN};)^6~wH)kaiBHmdRyTcbZ7DjMFS@qS-yjZp$mYZ{ZMS)f{OmG& k0_LG+|293S>jmN+LBg;j90g)CFE&u=k diff --git a/__pycache__/wyszukiwanie.cpython-311.pyc b/__pycache__/wyszukiwanie.cpython-311.pyc index c58228edb1d91161068eed282160bcec14281815..0f4e94f33c7afcd20d022e86ea78b9de8b21e1cd 100644 GIT binary patch delta 876 zcmZ`$O-S2d7*1?cO`9~SHmUY!vCMT$x3Y?M%xyZsRM>i$?iZX&Y=h2;b*Un_PK8~* ziO@=V$cC^Ugmo~OqZ{n#aR(WRY< zl!RdjIds46qTbe>v*vNA3Q9<$gDM>~El@1I#3+jm6CNj~1^Io$9UJ2X)^&Rc$LmpB zS`?(jREf2JvYg^hzg~W|Tog5~OXs>w#6q^$V8fBaa`W;b>BE_AObbNyK(s_U!xjsk zX^?weZ`*H4!eUCQgIh=e2xV(rguWk|hZ7K%@PSn8oV1imF3414Y=ubA3$x>Mut=Ot zl?iDfF*Uwe^HXI(syJwQrD@Vqq22P2rrTGqsKM&p_i+WZ5GjaT z(|YK#=IhaYJs@uQ&ldfvFA6Qfm5r~(6~9J=bRwh@p$g@eGww28u8*apML|l+Bh2}u zj~C@EbAx{bUn8A?u!rrwjYJz;L3jht1uRO delta 881 zcmZ`$O-vI(6yBk1yIXd<{o92?tF;0W5U>g&CQ53cRf4FM_y?pZZGk3)l5HCjAb_`# zkhElpS&fIrkWizCntJrW(F2EFvWHC*VlO6oTN6z@I&Jl0Wb*R8_rCe&&Ad0CyTbAO_f4-&`LyirSKR#?rlUKnutR0_V!di>%IPIrJF7jZ~@p*=3L^c#CAdBPd$dj{jUacBYS}Y`{C4q_sBaed5819yzf)nVUIL9 zC67+Y?6ks8L!*Y|PVtFk?|>wVtxoZ=WIo42yi8fP0}!Y+hh9QigjL%djzkt#_+q9vt@=A9Y>5u zVmzw5y8vXjH%n*fa+50uUXWSTf-N(?H7;J3DUU*VB+8>TqGDPzMw&Cs79$f5g&-Xg z;V3g4GzpKm!=YZB71J7q+`ljb?091i(a4<$#Yp2dFcbj*N&b)DtNf1>c6kO3;y31~ B7Z3md diff --git a/bfs_main.py b/bfs_main.py new file mode 100644 index 0000000..01139e5 --- /dev/null +++ b/bfs_main.py @@ -0,0 +1,56 @@ +import sys +import time +import pygame +import regal +import paczka +from wozek import Wozek +from wyszukiwanie import Stan, SearchSpace, Search + +pygame.init() +screen = pygame.display.set_mode((980, 980)) +miejsce = pygame.image.load('images/miejsce_paczek.png') + +pygame.display.set_caption("Inteligentny wozek") +icon = pygame.image.load('images/icon.png') +pygame.display.set_icon(icon) + +def main(): + + wozek = Wozek(0,0) + + grid_points = SearchSpace() + + goal_state = Stan(5, 2, 0) + + path = Search(grid_points).wyszukiwanie_bfs(wozek.state, goal_state) + + if path: + for p in path: + wozek._move(p) + screen.fill((51,51,51)) # removes object trail + screen.blit(miejsce, (430, 400)) + regal.Regal(1, 1, 2, 2) + regal.Regal(2, 1, 2, 3) + regal.Regal(3, 1, 3, 2) + regal.Regal(4, 1, 3, 3) + + regal.Regal(5, 1, 8, 2) + regal.Regal(6, 1, 8, 3) + regal.Regal(7, 1, 9, 2) + regal.Regal(8, 1, 9, 3) + + regal.Regal(9, 1, 2, 8) + regal.Regal(10, 1, 2, 9) + regal.Regal(11, 1, 3, 8) + regal.Regal(12, 1, 3, 9) + + regal.Regal(13, 1, 8, 8) + regal.Regal(14, 1, 8, 9) + regal.Regal(15, 1, 9, 8) + regal.Regal(16, 1, 9, 9) + wozek.draw_bfs() + pygame.display.flip() + time.sleep(1) + +if __name__ == "__main__": + main() diff --git a/main.py b/main.py index 453aece..64bf1e2 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,8 @@ import sys -import time import pygame import regal -import paczka +from paczka import Paczka from wozek import Wozek -from wyszukiwanie import Stan, SearchSpace, Search, GridCellType -from typing import Tuple, Dict - pygame.init() screen = pygame.display.set_mode((980, 980)) @@ -16,156 +12,84 @@ pygame.display.set_caption("Inteligentny wozek") icon = pygame.image.load('images/icon.png') pygame.display.set_icon(icon) -# def draw(self): -# screen.blit(self.image, (self.state.x, self.y)) +def draw(self): + screen.blit(self.image, (self.x, self.y)) + + def main(): + wozek = Wozek() - wozek = Wozek(0,0) + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + sys.exit(0) + if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: + sys.exit(0) - # for event in pygame.event.get(): - # if event.type == pygame.QUIT: - # sys.exit(0) - # if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: - # sys.exit(0) + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_DOWN: + wozek.y_change = 1 + if event.key == pygame.K_UP: + wozek.y_change = -1 + if event.key == pygame.K_RIGHT: + wozek.x_change = 1 + if event.key == pygame.K_LEFT: + wozek.x_change = -1 - grid_points = SearchSpace() - - goal_state = Stan(5, 2, 0) # for example - # perform BFS search - path = Search(grid_points).wyszukiwanie_bfs(wozek.state, goal_state) - - if path: - for p in path: - wozek._move(p) - screen.fill((51,51,51)) # removes object trail - screen.blit(miejsce, (430, 400)) - regal.Regal(1, 1, 2, 2) - regal.Regal(2, 1, 2, 3) - regal.Regal(3, 1, 3, 2) - regal.Regal(4, 1, 3, 3) - - regal.Regal(5, 1, 8, 2) - regal.Regal(6, 1, 8, 3) - regal.Regal(7, 1, 9, 2) - regal.Regal(8, 1, 9, 3) - - regal.Regal(9, 1, 2, 8) - regal.Regal(10, 1, 2, 9) - regal.Regal(11, 1, 3, 8) - regal.Regal(12, 1, 3, 9) - - regal.Regal(13, 1, 8, 8) - regal.Regal(14, 1, 8, 9) - regal.Regal(15, 1, 9, 8) - regal.Regal(16, 1, 9, 9) - wozek.draw() - pygame.display.flip() - time.sleep(1) - - # wozek._drive(path) - # print(path) - - # for action in path: - # x = wozek.state.x - # y = wozek.state.y - # direction = wozek.state.kierunek - - # print(x) - - # if action == "Left": - # wozek.state.kierunek = 3 if direction == 0 else direction - 1 - - # # always legal - # elif action == "Right": - - # # self._truck_direction(direction, action) - # wozek.state.kierunek = (direction + 1) % 4 - - # # check if its legal - # elif action == "Forward": - # t_x = x + 1 if direction == 1 else (x - 1 if direction == 3 else x) - # t_y = y - 1 if direction == 0 else (y + 1 if direction == 2 else y) - - # # if self.points_grid[t_y][t_x].is_available: - # wozek.state.x = t_x - # wozek.state.y = t_y - - - # screen.fill((51,51,51)) # removes object trail - # screen.blit(miejsce, (430, 400)) - - # regal.Regal(1, 1, 2, 2) - # regal.Regal(2, 1, 2, 3) - # regal.Regal(3, 1, 3, 2) - # regal.Regal(4, 1, 3, 3) - - # regal.Regal(5, 1, 8, 2) - # regal.Regal(6, 1, 8, 3) - # regal.Regal(7, 1, 9, 2) - # regal.Regal(8, 1, 9, 3) - - # regal.Regal(9, 1, 2, 8) - # regal.Regal(10, 1, 2, 9) - # regal.Regal(11, 1, 3, 8) - # regal.Regal(12, 1, 3, 9) - - # regal.Regal(13, 1, 8, 8) - # regal.Regal(14, 1, 8, 9) - # regal.Regal(15, 1, 9, 8) - # regal.Regal(16, 1, 9, 9) - # wozek.draw() - - # pygame.display.flip() - - # for p in path: - # print(p.x, p.y) - # print("Path found:", path) - # else: - # print("No path found.") - - # for state in path: - # pygame.time.delay(200) - # wozek.x = state.x - # wozek.y = state.y - # for event in pygame.event.get(): - # if event.type == pygame.QUIT: - # sys.exit(0) - # if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: - # sys.exit(0) - - - # # Drawing - # screen.fill((51,51,51)) # removes object trail - # screen.blit(miejsce, (430, 400)) - - # # idRegału, Długość regału podana w kratkach, Współrzędne od których ma być tworzony regał (wiersz,kolumna) - poziomo - # # Współrzędne od (1,1) do (10,10) - # regal.Regal(1, 1, 2, 2) - # regal.Regal(2, 1, 2, 3) - # regal.Regal(3, 1, 3, 2) - # regal.Regal(4, 1, 3, 3) + if event.type == pygame.KEYUP: + if event.key == pygame.K_DOWN or event.key == pygame.K_UP: + wozek.y_change = 0 + if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT: + wozek.x_change = 0 - # regal.Regal(5, 1, 8, 2) - # regal.Regal(6, 1, 8, 3) - # regal.Regal(7, 1, 9, 2) - # regal.Regal(8, 1, 9, 3) - # regal.Regal(9, 1, 2, 8) - # regal.Regal(10, 1, 2, 9) - # regal.Regal(11, 1, 3, 8) - # regal.Regal(12, 1, 3, 9) + wozek.x += wozek.x_change + wozek.y += wozek.y_change - # regal.Regal(13, 1, 8, 8) - # regal.Regal(14, 1, 8, 9) - # regal.Regal(15, 1, 9, 8) - # regal.Regal(16, 1, 9, 9) + if wozek.x <= 0: + wozek.x = 0 + elif wozek.x >= 916: + wozek.x = 916 + if wozek.y <= 0: + wozek.y = 0 + elif wozek.x >= 916: + wozek.x = 916 - # wozek.draw() + # Drawing + screen.fill((51,51,51)) # removes object trail + screen.blit(miejsce, (430, 400)) - # pygame.display.flip() # updating frames + # idRegału, Długość regału podana w kratkach, Współrzędne od których ma być tworzony regał (wiersz,kolumna) - poziomo + # Współrzędne od (1,1) do (10,10) + regal.Regal(1, 1, 2, 2) + regal.Regal(2, 1, 2, 3) + regal.Regal(3, 1, 3, 2) + regal.Regal(4, 1, 3, 3) + + regal.Regal(5, 1, 8, 2) + regal.Regal(6, 1, 8, 3) + regal.Regal(7, 1, 9, 2) + regal.Regal(8, 1, 9, 3) + + regal.Regal(9, 1, 2, 8) + regal.Regal(10, 1, 2, 9) + regal.Regal(11, 1, 3, 8) + regal.Regal(12, 1, 3, 9) + + regal.Regal(13, 1, 8, 8) + regal.Regal(14, 1, 8, 9) + regal.Regal(15, 1, 9, 8) + regal.Regal(16, 1, 9, 9) + + draw(wozek) + if wozek.ln == 0: + for x in packageList.list: + draw(x) + #demo_paczka.narysuj(430,400,screen) + + pygame.display.flip() # updating frames if __name__ == "__main__": - main() - + main() \ No newline at end of file diff --git a/wozek.py b/wozek.py index 7caaac4..bb3029c 100644 --- a/wozek.py +++ b/wozek.py @@ -12,8 +12,8 @@ class Wozek(): def __init__(self, y, x): # self.x = 55 # self.y = 55 - # self.x_change = 0 - # self.y_change = 0 + self.x_change = 0 + self.y_change = 0 self.height = 64 self.width = 64 self.image = pygame.image.load("images/pusty_wozek.png") @@ -26,6 +26,11 @@ class Wozek(): def draw(self): from main import screen + # screen.blit(self.image, (self.x, self.y)) + #screen.blit(self.image, (self.obecnyStan.x, self.obecnyStan.y)) + screen.blit(self.image, (self.state.x, self.state.y)) + def draw_bfs(self): + from main import screen # screen.blit(self.image, (self.x, self.y)) #screen.blit(self.image, (self.obecnyStan.x, self.obecnyStan.y)) screen.blit(self.image, (self.state.x*98, self.state.y*98)) @@ -61,8 +66,8 @@ class Wozek(): # from wyszukiwanie import Stan # # self.obecnyStan = Stan(55, 55, 3) # self.obecnyStan = Stan(1, 1, 3) - # def _drive(self, actions): + # def _drive(self, actions): # # for action in actions.reverse(): # for action in actions: # self._move(action) @@ -71,37 +76,25 @@ class Wozek(): # # self.screen.fill((51,51,51)) # removes object trail # # self.screen.blit(self.miejsce, (430, 400)) # self.draw() - # pygame.display.flip() def _move(self, action): x = self.state.x y = self.state.y - direction = self.state.kierunek + kierunek = self.state.kierunek - # always legal - if action == "Left": + if action == "Lewo": + self.state.kierunek = 3 if kierunek == 0 else kierunek - 1 - # self._truck_direction(direction, action) - self.state.kierunek = 3 if direction == 0 else direction - 1 - - # always legal - elif action == "Right": - # self._truck_direction(direction, action) - self.state.kierunek = (direction + 1) % 4 - - # check if its legal - elif action == "Forward": - t_x = x + 1 if direction == 1 else (x - 1 if direction == 3 else x) - t_y = y - 1 if direction == 0 else (y + 1 if direction == 2 else y) - - # if self.points_grid[t_y][t_x].is_available: - self.state.x = t_x - self.state.y = t_y - # else: - # print("[ MOVE LOG ] - You can't move in that direction!") + elif action == "Prawo": + self.state.kierunek = (kierunek + 1) % 4 + elif action == "Do przodu": + new_x = x + 1 if kierunek == 1 else (x - 1 if kierunek == 3 else x) + new_y = y - 1 if kierunek == 0 else (y + 1 if kierunek == 2 else y) + self.state.x = new_x + self.state.y = new_y # def ustaw_wozek_w_kierunku(self, kierunek): # TODO diff --git a/wyszukiwanie.py b/wyszukiwanie.py index a0676e2..79a0df3 100644 --- a/wyszukiwanie.py +++ b/wyszukiwanie.py @@ -3,7 +3,7 @@ from enum import Enum from typing import Tuple, Dict class GridCellType(Enum): - NOTHING = 0 + FREE = 0 REGAL = 1 # dodać oznaczenie na miejsce dla paczek @@ -16,7 +16,7 @@ class SearchSpace: def _init_grid(self) -> None: for i in range (0,10): for j in range(0,10): - self.grid[(i, j)] = GridCellType.NOTHING + self.grid[(i, j)] = GridCellType.FREE for r, c in [(2,2), (2,3), (3,2), (3,3), (8,2), (8,3), (9,2), (9,3), (2,8), (2,9), (3,8), (3,9), (8,8), (8,9), (9,8), (9,9)]: self.grid[(r,c)] = GridCellType.REGAL @@ -29,14 +29,14 @@ class Stan: class Wezel: - def __init__(self, stan: Stan, action = None, parent = None): + def __init__(self, stan: Stan, akcja = None, parent = None): self.stan = stan - self.action = action + self.akcja = akcja self.parent = parent class Search: - def __init__(self, points_grid: SearchSpace): - self.points_grid = points_grid + def __init__(self, search_grid: SearchSpace): + self.search_grid = search_grid def wyszukiwanie_bfs(self, stan_poczatkowy: Stan, stan_docelowy: Stan): pierwszy_wezel = Wezel(stan_poczatkowy) @@ -52,9 +52,9 @@ class Search: odwiedzone.append(wezel.stan) - for action, stan in self.nastepnik(wezel): + for akcja, stan in self.nastepnik(wezel): if wezel not in fringe and stan not in odwiedzone: - x_node = Wezel(stan, action, wezel) + x_node = Wezel(stan, akcja, wezel) fringe.append(x_node) return False @@ -69,23 +69,17 @@ class Search: # gora -> lewo -> dol -> prawo | obrot w lewo # 0 gora 1 prawo 2 dol 3 lewo state = wezel.stan - right_state = Stan( state.x, state.y,(state.kierunek + 1) % 4) - right_node = ["Right", right_state] + stan_prawego = Stan(state.x, state.y,(state.kierunek + 1) % 4) + ruch_w_prawo = ["Prawo", stan_prawego] - # 90 degree left state - cost of turn is 1 - left_state = Stan (state.x, state.y,3 if state.kierunek == 0 else state.kierunek - 1) + stan_lewego = Stan(state.x, state.y, 3 if state.kierunek == 0 else state.kierunek - 1) + ruch_w_lewo = ["Lewo", stan_lewego] - # storing temporarily node as list - left_node = ["Left", left_state] - - # always two nodes are possible because we can turn in both sides - nodes = [right_node, left_node] + nodes = [ruch_w_prawo, ruch_w_lewo] y = state.x x = state.y - # obrot_w_prawo = Stan(x, y, (wezel.stan.kierunek + 1) % 4) - # obrot_w_lewo = Stan(x, y, (wezel.stan.kierunek - 1) % 4) if wezel.stan.kierunek == 0: y -= 1 @@ -96,187 +90,36 @@ class Search: elif wezel.stan.kierunek == 3: x -= 1 - place = None if 0 <= y < 98 and 0 <= x < 98: - place = self.points_grid.grid[(y,x)] + place = self.search_grid.grid[(x,y)] - if place is not None and place is GridCellType.NOTHING: - ruch_w_przod = Stan(y, x, wezel.stan.kierunek) - forward_node = ["Forward", ruch_w_przod] - nodes.append(forward_node) - - # sprawdzenie czy nie wyjdzie poza plansze - # if 0 <= x <= 916 and 0 <= y <= 916: - # wezly.append(ruch_w_przod) + if place is not None and place is GridCellType.FREE: + stan_w_przod = Stan(y, x, wezel.stan.kierunek) + ruch_w_przod = ["Do przodu", stan_w_przod] + nodes.append(ruch_w_przod) return nodes def get_actions(self, wezel: Wezel): - actions = [] + akcje = [] moves_forward = 0 turns = 0 parent = wezel while True: - action = parent.action + akcja = parent.akcja parent = parent.parent - if action is None: + + if akcja is None: break - if action == "Forward": + if akcja == "Forward": moves_forward = moves_forward + 1 else: turns = turns + 1 - actions.append(action) + akcje.append(akcja) + akcje.reverse() - actions.reverse() - - return actions - - - - - - - - - - -# class Kierunek(Enum): -# POLNOC = 0 -# POLUDNIE = 1 -# ZACHOD = 2 -# WSCHOD = 3 -# def kierunekNaLewo(self): -# if self == Kierunek.POLNOC: -# return Kierunek.ZACHOD -# elif self == Kierunek.POLUDNIE: -# return Kierunek.WSCHOD -# elif self == Kierunek.ZACHOD: -# return Kierunek.POLUDNIE -# elif self == Kierunek.WSCHOD: -# return Kierunek.POLNOC - -# def kierunekNaPrawo(self): -# if self == Kierunek.POLNOC: -# return Kierunek.WSCHOD -# elif self == Kierunek.POLUDNIE: -# return Kierunek.ZACHOD -# elif self == Kierunek.ZACHOD: -# return Kierunek.POLNOC -# elif self == Kierunek.WSCHOD: -# return Kierunek.POLUDNIE - -# class Akcja(Enum): -# OBROT_W_LEWO = 0 -# OBROT_W_PRAWO = 1 -# KROK_W_PRZOD = 2 - -# class Stan: -# def __init__(self, kierunek: Kierunek, x, y): -# self.x = x -# self.y = y -# self.kierunek = kierunek - -# def skopiuj(self): -# return Stan(self.x, self.y, self.kierunek) - -# class Nastepnik: -# def __init__(self, akcja: Akcja or None, stan: Stan, poprzednik): -# self.akcja = akcja -# self.stan = stan -# self._poprzednik = poprzednik - -# def getPoprzednik(self): -# return self._poprzednik - -# def setPoprzednik(self, x): -# raise Exception - -# poprzednik = property(getPoprzednik, setPoprzednik) - -# def skopiuj(self): -# return Nastepnik(self.akcja, self.stan.skopiuj(), self.poprzednik) - -# def goaltest(stan: Stan, cel: Stan): -# if stan.x != cel.x: -# return False -# elif stan.y != cel.y: -# return False -# else: -# return True - -# def stos_akcji(stan_koncowy: Nastepnik): -# stos = deque() -# while stan_koncowy.poprzednik is not None: -# stos.append(stan_koncowy.akcja) -# stan_koncowy = stan_koncowy.poprzednik -# return stos - -# def stan_w_liscie_nastepnikow(stan: Stan, lista_nastepnikow): -# for i in lista_nastepnikow: -# if i.stan.kierunek != stan.kierunek: -# continue -# elif i.stan.x != stan.x: -# continue -# elif i.stan.y != stan.y: -# continue -# else: -# return True -# return False - -# def nastepnik_kroku_w_przod(nastepnik: Nastepnik): -# akcja = Akcja.KROK_W_PRZOD -# stan = Stan(nastepnik.stan.kierunek, nastepnik.stan.x, nastepnik.stan.y) -# if stan.kierunek == Kierunek.POLNOC: -# stan.x -= 1 -# elif stan.kierunek == Kierunek.POLUDNIE: -# stan.x += 1 -# elif stan.kierunek == Kierunek.ZACHOD: -# stan.y -= 1 -# elif stan.kierunek == Kierunek.WSCHOD: -# stan.y += 1 -# return Nastepnik(akcja, stan, nastepnik) - -# def nastepnik_obrotu_w_lewo(nastepnik: Nastepnik): -# akcja = Akcja.OBROT_W_LEWO -# stan = Stan(nastepnik.stan.kierunek.kierunekNaLewo(), nastepnik.stan.x, nastepnik.stan.y) -# return Nastepnik(akcja, stan, nastepnik) -# #Nastepnik(Akcja.OBROT_W_LEWO, Stan(nastepnik.stan.kierunek.kierunekNaLewo(), nastepnik.stan.poleStartoweGorne), nastepnik) -# # - -# def nastepnik_obrotu_w_prawo(nastepnik: Nastepnik): -# akcja = Akcja.OBROT_W_PRAWO -# stan = Stan(nastepnik.stan.kierunek.kierunekNaPrawo(),nastepnik.stan.x, nastepnik.stan.y) -# return Nastepnik(akcja, stan, nastepnik) - -# def succ(nastepnik: Nastepnik): -# wynik = [] -# pom = nastepnik.skopiuj() -# #wynik.append(nastepnik_obrotu_w_lewo(pom)) -# wynik.append(nastepnik_obrotu_w_lewo(pom)) -# pom = nastepnik.skopiuj() -# wynik.append(nastepnik_obrotu_w_prawo(pom)) -# pom = nastepnik.skopiuj() - -# wynik.append(nastepnik_kroku_w_przod(pom)) -# return wynik - -# def graphsearch(istate: Stan, cel: Stan): -# fringe = deque() -# explored = [] -# fringe.append(Nastepnik(None, istate, None)) -# while fringe: -# # for i in fringe: -# # print("F",i.stan.kierunek,i.stan.poleStartoweGorne.wiersz,i.stan.poleStartoweGorne.kolumna,end=" ") -# # print() -# element: Nastepnik = fringe.popleft() -# if goaltest(element.stan, cel): -# return stos_akcji(element) -# explored.append(element) -# for nastepnik in succ(element): -# if not stan_w_liscie_nastepnikow(nastepnik, fringe) and not stan_w_liscie_nastepnikow(nastepnik, explored): -# fringe.append(nastepnik) -# return False \ No newline at end of file + return akcje \ No newline at end of file