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
zcmWIL<>g{vU|`sJJv2dvmx19ih=Yuo7#J8F7#J9e4Hy_0QW#Pga~Pr+QkbF`Q<$Te
zQW&C`Q&^%{Qdpx{Q`l12TNt9)QaDmLTNt9)Qy7C8G`U`a%<{X%SagfA;3Xpi1H(&@
zfyp2iNCt#?85kHi7#J9wLAKa1F)*Ys)-t9r)-t6q)-tCs*0Q89*0QEB*0QBA)v}i`
z)G(AVHZv8Ql`y3+H#0IalrX2TfanQ~RX0jlY8aXsYdK0-7qHcEEM%<Z%w(wLs^MI~
zzL3F%VFF|9idya(&Khn>hN1`v4HlhH%TvRh!kW!Afw4%dhNpx>lA(k%o2h7530DnI
z3AZFeGb5PA17f8y)qq4fBpDX)E@UWStYJ)H5@%>;6lbtufa>MTW-9st)<H-w6GCsE
z0Z}@b5jqO<YPeI_z^=XlwV4yl%foL{31bZl!W5`ZKCsSJ1a-0^bmr+0RLzD^T}aqf
z?2u3_%qxtj;aI@Gkb#k*hAW&Qn1O|%L?D}M0#lJ0BLfJQFr~1A;v5$DkqmiE5ez9D
z!3>(5iH*z*3|tBd3JO+<Md_uvsd*&|X_+~x3c3pUX$mD7sR~}f{(fK~h^nI0lG36)
z1%*U~l+5Ik%>2B>qDqD2{JfIH%shp}oE$JN$<I#BQ%KB9QOGPQRw&3X&IG9h8vwEj
zWGq6rda*)Ueo<~>i9&g1PL4uSs)7|<B}{8PNV$ToLN#0lWR6m@vXX+Wf<{q(xsF0|
zeokp_o~90p3OzkNIKLLo0_oMYQ*g^K0{bvKwbDvKJy}^@AyqHkN<lryP#r}nNO`h?
zZgNIqQDSmQYLP-_UP@+iVo9n(c}8Y(hC)eYL8?M#i9%+vLUmDoa<+o5oq~E1rWqh}
z2w|Oq#Ddf!un7fZnoyjaSzMeCF{7AFGm>&({!m8^HkkV}(-e@xqgbJ|0OaiC#Nt#1
zD^OS@rRL=4r7M)=D};h&3UU%FQ;QIh0W$|gqnnkJU!Gc|05S_~RA#XP!ZaVS9K<w?
zNK#hNRmdyNO-d~SS)7@YnpcvURtb*d;)2xV%(Tp81xV7&%!7!gmVlEvIJuT*mSiXt
zC+4PtBNV$+i%SxVN)*zH@^cjo^|-(euu82+PAw==@bq^rDgp(&LS`P=@gN(DQWX-5
zQWf&@!8u3)Yy~LwXXX`@mM9b?mSlj<C<2x6MJx;q3{~m@iN(bVnR#W2IhiR6@H|<P
zuTYX7pOl|il%k<or>Lm-^8f$;|8KE^!~GU3ILNBhLo!l}QbFl3F;5}0xVRLQLR0e;
zN{T8$0g_*kng@1=pQhj~uFT@hyyB9?yyVnd%*7=|w^$2`GV@Aqv7}aHmfT_islCOL
zRh*x9izO#NG36FZc4}quEtZhT0M}bALH^F(x0pf7nS=bpZ?QT1`-J-X6|plgFx+Ad
za13w_y2YBDlV6;Aiyay)n!LAIK;_CU#-Lk_0k;@~i$FD75i>{!WAQD<q$u{xyv&l!
z#GELW^u*lMTP&a)AH@cW!jj4;R&cbfWGGT#U|{%V>}(YiTAW%`9OIT*m6{xroS$1@
zY+ztyqFYdupOu<iqH7paoSImaoDq|oT9T2UqE}FPOQ<L{F(n>epyXs0mvDpXP&ZJm
zD$2r$1ev%PIT$$@S(rE&xtLg(_?S2t`IxvEc^D0tco>bCjhMI?`51MW_!#w=^_X>-
zI2hR&1sFLPi<B4`7?MH$0vQRypcrL^Rn~S43=E(OIfYS@p@tDeN`R_gCa@S2Sd2-M
z0W8K`!&JhU!dSyx!z96w!Ys|u%p}eb%%I7VsKba+T!S-MJUD<9bQM5hkzbq&O4cal
zA~>BP%6M=-B2p8y$OolcXzt2SQz$M;Er4VMa1vB6hUTo2d<Ae~gb6@0Nk}57LICHR
zjFOUqVk>?9^73-MqSTb6octtEgcs{2=jZCD7iFdt>u01^B&O%*73+f?U7DAYTBJ~%
z3a)Le6jJg_lX6lOlJoP6QZn-rOHzwL)dy6#JTnEFrF8AUnh`mx2ow>TOt+X5lZtOK
z=O$KYvP5wsg<TXkQkX<BrBp;QrBs5`8-!2<B~^ixOh}%IPf9H*Pfg7W1tlRiP+W6~
zFp4l0sWLDyXmS+sF)%O`34sVP5FrR6L_mZnhybM%uu6!@pfn9(f$iY1$<0qG%}KQb
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
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

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