From aef97378441fd9807b4de71e07a49935bdbc2b96 Mon Sep 17 00:00:00 2001 From: Xuan Trinh <xuan.trinh@student.unimelb.edu.au> Date: Sun, 21 Mar 2021 15:26:57 +1100 Subject: [PATCH] In movement logic: add the constraint to ensure new move need to be in the board. handling details are added to the method comment - XUAN TRINH2021 3 21 --- search/__pycache__/method.cpython-38.pyc | Bin 0 -> 2693 bytes .../__pycache__/movement_logic.cpython-38.pyc | Bin 0 -> 3903 bytes search/movement_logic.py | 133 +++++++++++++----- 3 files changed, 95 insertions(+), 38 deletions(-) create mode 100644 search/__pycache__/method.cpython-38.pyc create mode 100644 search/__pycache__/movement_logic.cpython-38.pyc diff --git a/search/__pycache__/method.cpython-38.pyc b/search/__pycache__/method.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e38a9f00b59c12ca1756d8f39293229d8a97b76 GIT binary patch literal 2693 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 R6$-^5lQ@{+iIbVb3jo%)q!0iA literal 0 HcmV?d00001 diff --git a/search/__pycache__/movement_logic.cpython-38.pyc b/search/__pycache__/movement_logic.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..624608e075463829c30dedab89a6cbc99f4338d0 GIT binary patch literal 3903 zcmWIL<>g{vU|@K$FDxNYnt|alh=Yuo7#J8F7#J9eI~W)kQW&BbQW&EcQ<$QdQkYX% zS{S03Q&>~jS{R~OQrJ^CS{R~OQ#ez&S{S0(Qn*uiS{S0(Q+QMOS{R}@QW&E+Q<$Q- zQuw2|Qv{-TQUs%TQ-q@UQiM}PS{S1EQ$$n5S{R}PQp8gvS{R}PQzTQQS{R~)QlwL4 zS{R~)Q)E-*S{R~4QsjdfG!+s*Gcqu6StS;wm*%GCl_(_V=NF}9<|US-D(EUCDwLEK z<fJMj=jW9qX67jvDdd&rCZ!fBXcXxv6l!u=6{VJx7Udyp%1=`$$w*Zw$<I#BQ%FoJ zNi72N6O&6a^Yaukixrada|?1(OH#Rt^2-%$6^gi$^K(jb^Av0q3c0v~b23v>6`+c9 z^3yYut+*7R0Agf*UQVS#Vp0ys3WZ{@@{)Y86(yM<!HmQbg~Xy%s6$gz6sipsbnO(( zYPsMBDMJl}QhK`Tx_a?o5{Hr+1qEXTg&G9~69t7DtZKlzA!a~GY^rJ$6buy<YQX-e zQBW|#VHn&s5R*V8Hq#WqE;0p^W;l#eP*6ZI4Pg$~OGX9;hL@m3nG9mVQYuJ*nSp`9 z8I)4h7#J987>cB77)lr<8EP0x7$q4}7$q3em}(jGI7*mOn3@?G8EP1V8CEj;6@iTT zCE%J{P*RDMAXYNpVlK)rzr_ZL=3A@<MVWaeE19CW5GgH+JukI9z97GNB|{M?6aBJw zwu%WYPAw{qam%bqO^yMj8Dj$jBNN?%qWrAX<Pu%OnBvsLqU4O2-2AdsP{NG|rxv|} z%3ECER1u$(npPqK@&yOTZ;ULAV$2+jMLY})45WHk9E*pGK!H@m%D})-#0erm&IY@^ zh?{|d;TAW<4Mmyh86`>>j^M@X2t82wz*x&z!%(CI3HcNzaaiaxA%#9OEc7*5{2+FN zqM(Qc<Q|+Z<Au1av;Z7HIv}@!+|Izr!pOoX1qvcQyskq{6Df=^mtm#}0zt$FcL+F? z%t0<ei7I}Q+#vxCA(Gv}4{=9Iet8}^NE|U7B7oN+T98a42aPI5m_tB8L$YH8kQ@UJ z7H?$NfTKqcly5<)?<FXrUxFg~B^$_vpsWi@>L3h~2VrnFZew6zC}F5!s9|hos%5HS zDq+lKDv~Q<Dq*f+Xl86?3}&cdDq+cHDl#fzEn!0vW6x$Pax38|VMP+-%w{TzDq$|+ zKoaB1W-7`n;Vxl96648cDrzcWE8&KTr7#3DtYq}l<h>=Do>~%Ll$w)Rl3A7t%J!L{ zy5Sa!kE>fq5h$?1x%3umkf*yxND(L*6oGQgEsoHDc!(G%iQZxl4TuM6xy9+?AMOWc z7J&li78jTgR=JY-7Av^Cy~S7&#Zi!747LiASwP7il3V$U%QN%R<4f}6L3K#HVLd3& zr9k1x$i>9L$b$tJDUuiD$U(#m4sw<f7FZC~FqN=^gPaW`8lp-#P=Xv34S6M8C0s~) zxxqosQ^Eri0|j}J7y|=?CU22As8j%zhv2|1k_2%<p;`p;CnS)iL1LhwEs_DTz%d~U zVu3=nNDjmThZ&dv7jtL<XEc?FfCCkW$+SwVY#4zA3OM9Ihon_zM7peDDuJX`ZbUlA z9&q5G0aYN7&;y4Gwje|cJt6|mcr_6Lr;MKBK!FI)<OSeNUcv~9dr(F%5-MQ|W+-8R zWOA^GN(l>C1e~40B4#CQU=en>E{_rpum~qyB&vi9ECSBRU|l&SJi!bpjKK_=Oo`#3 z)+4APg=j&7^P7S$xJ_1^nv<GblA5BBo|v1eke>vqyA?`6ZM4i{g@U5g;?z8lY*M8{ zW=XLEEPpEG=P4xRCl;kBR4Zr{<(KOyKpGF4weSWE$Vvr;3NQt+DlsK1F&Wf?MY0O4 z9M(ux0J{ibN18%~0<08L0JR}OO;)fDu&HoD*G{3dI5RIDtQ}lFE2Lx=r9v9CiN#=H zxTz_rY2YG84~szx3JR%u=?b8Ri4M4M*HM5~!ypDkNKY@dBpIw3R8;bST0V(Iso;VM zl5@d%7@X|Dc^I51!8sRPP=a$aIOl>>AvleK@~|dTkvu2^D}V@a1_l$LTnsK64uTRO z$Y=&mK1LR1Obk|ql5bIxAIMxt4OqhnYAj|m<%4QOMoESmMo_acn<<z<ld)<Y*k?#- zB{L`0P(c^mDabEQRme|6jc~AXcuXjOif1E2%3<+cQdF9%keQ~ClwXnoG8oh?0rfc& z^HQMc3EWZ0O)N>yNG(=KN-Zf*O$GIFK(-WvZPsKe0#&U=?4UA~DT);&V+f&)&?=E4 z6$S=|N1#vy>0n?JVC4G`7DH)mf*NQb46c_!^*6kv0UM{uc#8#O2bcpPKrwVnC^;iF zIXk{Qvm_%kFCLsVUW2RxMF9h25vWb(rzv`iJw84qKRG@g;b=&b0jCylLII}{aPk1B z3{Zqa3NvsD0w*4Dx&b8_a1~bsDz1w_MGrUufPDnE58^s-A_5a&cXHU|=BJeAq}qY} kSggUoz`!EJ!pOqH!NtMF!3`$4K<!K@R^<=_Lq!fw04rA$q5uE@ literal 0 HcmV?d00001 diff --git a/search/movement_logic.py b/search/movement_logic.py index 267eb46..4a5ccc9 100644 --- a/search/movement_logic.py +++ b/search/movement_logic.py @@ -1,6 +1,9 @@ """ :argument coordinate - a tuple contain 2 number (r, q) :return coordinate of the token after the action is complete + if the new position is out of the board: + return the token' + s position instead. row = r column = q @@ -16,16 +19,17 @@ Slide action logic: # '-._.-'-._.-' # """ -row = 1 -column = 2 +row = 0 +column = 1 # 1 def slide_left(coordinate): - new_pos = () if coordinate: - new_pos.append(coordinate[row]) - new_pos.append(coordinate[column] - 1) + new_pos = (coordinate[row], coordinate[column] - 1) + + if not check_within_board(new_pos): + return coordinate else: print("Empty coordinate") return new_pos @@ -33,10 +37,12 @@ def slide_left(coordinate): # 2 def slide_right(coordinate): - new_pos = () if coordinate: - new_pos.append(coordinate[row]) - new_pos.append(coordinate[column] + 1) + new_pos = (coordinate[row], coordinate[column] + 1) + + if not check_within_board(new_pos): + return coordinate + else: print("Empty coordinate") return new_pos @@ -46,8 +52,11 @@ def slide_right(coordinate): def slide_up_left(coordinate): new_pos = () if coordinate: - new_pos.append(coordinate[row] + 1) - new_pos.append(coordinate[column] - 1) + new_pos = (coordinate[row] + 1, coordinate[column] - 1) + + if not check_within_board(new_pos): + return coordinate + else: print("Empty coordinate") return new_pos @@ -55,10 +64,12 @@ def slide_up_left(coordinate): # 4 def slide_up_right(coordinate): - new_pos = () if coordinate: - new_pos.append(coordinate[row] + 1) - new_pos.append(coordinate[column]) + new_pos = (coordinate[row] + 1, coordinate[column]) + + if not check_within_board(new_pos): + return coordinate + else: print("Empty coordinate") return new_pos @@ -66,10 +77,12 @@ def slide_up_right(coordinate): # 5 def slide_down_left(coordinate): - new_pos = () if coordinate: - new_pos.append(coordinate[row] - 1) - new_pos.append(coordinate[column]) + new_pos = (coordinate[row] - 1, coordinate[column]) + + if not check_within_board(new_pos): + return coordinate + else: print("Empty coordinate") return new_pos @@ -77,10 +90,12 @@ def slide_down_left(coordinate): # 6 def slide_down_right(coordinate): - new_pos = () if coordinate: - new_pos.append(coordinate[row] - 1) - new_pos.append(coordinate[column] + 1) + new_pos = (coordinate[row] - 1, coordinate[column] + 1) + + if not check_within_board(new_pos): + return coordinate + else: print("Empty coordinate") return new_pos @@ -93,10 +108,12 @@ UP_LEFT = 3 UP_RIGHT = 4 DOWN_LEFT = 5 DOWN_RIGHT = 6 +OUT_OF_BOARD = 0 """ :argument token - the selected game object that is presented by its position on board { (row, column)} x - the adjacent game object -:return new position after the action is complete +:return new position after the action is complete + if the new position is out of the board return the token's position instead Swing action logic: x is the another token that current token swing from @@ -132,67 +149,88 @@ Swing action logic: def swing_to_tile_1(token, x): position = get_relative_position(token, x) + if position == LEFT: - return slide_down_left(slide_left(token)) + new_postion = slide_down_left(slide_left(token)) if position == RIGHT: - return slide_up_right(slide_right(token)) + new_postion = slide_up_right(slide_right(token)) if position == UP_RIGHT: - return slide_up_left(slide_up_right(token)) + new_postion = slide_up_left(slide_up_right(token)) if position == UP_LEFT: - return slide_left(slide_up_left(token)) + new_postion = slide_left(slide_up_left(token)) if position == DOWN_LEFT: - return slide_down_right(slide_down_left(token)) + new_postion = slide_down_right(slide_down_left(token)) if position == DOWN_RIGHT: - return slide_right(slide_down_right(token)) + new_postion = slide_right(slide_down_right(token)) + + #if the position of the token after the action complete is out of board, return the token position in + #stead + if compare_tile(new_postion, x): + return token + + return new_postion def swing_to_tile_2(token, x): position = get_relative_position(token, x) if position == LEFT: - return slide_left(slide_left(token)) + new_postion = slide_left(slide_left(token)) if position == RIGHT: - return slide_right(slide_right(token)) + new_postion = slide_right(slide_right(token)) if position == UP_RIGHT: - return slide_up_right(slide_up_right(token)) + new_postion = slide_up_right(slide_up_right(token)) if position == UP_LEFT: - return slide_up_left(slide_up_left(token)) + new_postion = slide_up_left(slide_up_left(token)) if position == DOWN_LEFT: - return slide_down_left(slide_down_left(token)) + new_postion = slide_down_left(slide_down_left(token)) if position == DOWN_RIGHT: - return slide_down_right(slide_down_right(token)) + new_postion = slide_down_right(slide_down_right(token)) + + # if the position of the token after the action complete is out of board, return the token position in + # stead + if compare_tile(new_postion, x): + return token + return new_postion def swing_to_tile_3(token, x): position = get_relative_position(token, x) if position == LEFT: - return slide_up_left(slide_left(token)) + new_postion = slide_up_left(slide_left(token)) if position == RIGHT: - return slide_down_right(slide_right(token)) + new_postion = slide_down_right(slide_right(token)) if position == UP_RIGHT: - return slide_right(slide_up_right(token)) + new_postion = slide_right(slide_up_right(token)) if position == UP_LEFT: - return slide_up_right(slide_up_left(token)) + new_postion = slide_up_right(slide_up_left(token)) if position == DOWN_LEFT: - return slide_left(slide_down_left(token)) + new_postion = slide_left(slide_down_left(token)) if position == DOWN_RIGHT: - return slide_down_left(slide_down_right(token)) + new_postion = slide_down_left(slide_down_right(token)) + + # if the position of the token after the action complete is out of board, return the token position in + # stead + if compare_tile(new_postion, x): + return token + + return new_postion def get_relative_position(token, x): @@ -236,3 +274,22 @@ def compare_tile(tile1, tile2): """ return tile1[row] == tile2[row] \ and tile1[column] == tile2[column] + + +def check_within_board(tile): + """ + ensure that the tile is exist within the board + :param tile: coordinate of the tile + :return: true if the tile exist within the board, else false + """ + if tile[row] < -4 or tile[row] > 4: + return False + if tile[column] < -4 or tile[column] > 4: + return False + + if tile[column] in [-4, -3, -2, -1] and tile[row] < -4 - tile[column]: + return False + + if tile[column] in [4, 3, 2, 1] and tile[row] > 4 - tile[column]: + return False + return True -- GitLab