From 870dffb4833d5807b713ff35a90a0ee16aaadb63 Mon Sep 17 00:00:00 2001
From: Xuan Trinh <xuan.trinh@student.unimelb.edu.au>
Date: Fri, 26 Mar 2021 16:17:28 +1100
Subject: [PATCH] =?UTF-8?q?First,=20i=20change=20the=20name=20bfore=20i=20?=
 =?UTF-8?q?realised=20that=20all=20normal=20case=20naming=20are=20conventi?=
 =?UTF-8?q?on{}=1B[Dmy=20fauft=20for=20this=1B[C},=20secondly=20adding=20c?=
 =?UTF-8?q?onstant=20to=20eliminate=20magic=20number,=20thrid=20found=20a?=
 =?UTF-8?q?=20bug.=1B[D=1B[D=1B[D=1B[D=1B[D=1B[D=1B[D=1B[D=1B[D=1B[D=1B[D?=
 =?UTF-8?q?=1B[D=1B[D=1Bird=1B[C=1B[C=1B[C=1B[C=1B[C=1B[C=1B[C=1B[C=1B[C?=
 =?UTF-8?q?=1B[C=1B[C=1B[C=1B[C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .idea/inspectionProfiles/Project_Default.xml  |  13 ++
 search/__pycache__/main.cpython-38.pyc        | Bin 1976 -> 3563 bytes
 .../__pycache__/movement_logic.cpython-38.pyc | Bin 4590 -> 5120 bytes
 search/main.py                                | 199 ++++++++++--------
 search/test.py                                |   1 +
 5 files changed, 131 insertions(+), 82 deletions(-)
 create mode 100644 .idea/inspectionProfiles/Project_Default.xml
 create mode 100644 search/test.py

diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..db25fb7
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,13 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <option name="ignoredErrors">
+        <list>
+          <option value="N806" />
+          <option value="N803" />
+        </list>
+      </option>
+    </inspection_tool>
+  </profile>
+</component>
\ No newline at end of file
diff --git a/search/__pycache__/main.cpython-38.pyc b/search/__pycache__/main.cpython-38.pyc
index 84aa148a1abe1e015af49a4114970573a6d5286e..616e48299948de696d98b0d9e0253aa967bc760b 100644
GIT binary patch
literal 3563
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

delta 1254
zcmaDYy@Q`Gl$V!_fq{Wxf=@)kdA^B!GK_H(wPoFMS)y2SS)*8U*`nAO88R87*i$*0
z8KO8-SW;M97^1jR*izVA7^1jSc~Us$Fs5*(aJ8^R@uqO6@TBn0VT$5QVG3r@<eRwV
z%H&=~jmbwCyO~}xP7Y+MG!ZK(%1=%$E{@O4%Ph%E%!$uW%1TWxxy6-|nOstknVOth
ztjScw#=yXEizOwoBylA}k?`ctOg4;SlMR?fSs6JPi$o`TF<aNiFxRrwvevStu-3BI
zFuE|r7SwXoaHOzFGNiC)GZh8Yu%vK^Gt{!AaF#ICurxD@Gt{!@nL$->Wiu5O)v$t9
zu%>XAFx0R@RfyEEfkoL;cuE***dU@c94Q=<3^g1nypjxQOeKsp>^Aibg<2^rFh|rd
zVL0Fd+yU%39PkP504}T!;KS#DdK-qqRW-~m46!n`oFz;Pm}@w}ZsdfxaUmlk!vw}c
zg%pNh22FmyTdbu81*t{1Sab5rK~z#sesZ=Za}gs00|SD%1!3P}EGS|HMF3;KEyki-
zj6t^;gI_X%1&TFUZZQ{^6cq{9gZP}qsU={eif=I|rle?c6$vpgFhmJK;}#N~V4Kmz
zz|M%`g{p%X5yg^Mnp*%Si@;=Y6i0SyWqDC%Noo`;*sLN6kb8wegc6t(0Wk#_7#K7e
z7#NBzKna<ZgOP)ggNcigW%5Th5k|(zAJ`ztMqn}*yL$Z`1_p*2h6M}@8EP477{N4S
z4MPf}Btr^QHdB#Z4I`M%oXu3Elfn|r0Ohl0GZoE9VGCx+i-M{KsmMW+jY3ilG6|wu
z2dWyZzlJfT9%fMol5&tyVC5-{!3>)0evlZE0r^b<M1UfrND9P~2YHpTNE}2lMX`Yc
zB@s#|6@h~UOn}1W7C%@zJ~=-pC$l&+KQEMlfuX)w1r$i2AY$ZU<Y8oC<Y8pP!eU`8
zQUzNAcFW6u|NsBjWP17k|NsBsq@l@FBnxs6$a$Llx7g$3Q}UDJ<BK>zf}rvwin};9
zu_!r1ue2mHrwEjIikLxig)AUa5R`bBi&IOAlt5fj5CMwCTg;hxC18uAxQi2W3vyE9
yLB#@+#}K~bu*uC&Da}c>1Et|&F$M+(77h+Z4ptEs7DhHE4q*-*J~<{vrhfoJS|>LE

diff --git a/search/__pycache__/movement_logic.cpython-38.pyc b/search/__pycache__/movement_logic.cpython-38.pyc
index ea2011bd4267979726c999e2ad4197c2eb26874c..73f5474c9ead21cb9510b416712b3b8c3be0f9bc 100644
GIT binary patch
delta 552
zcmaE-+@Qf1%FD~ez`(#D;2n|hQDq{Z4C9oE+Pyp}iY*LLVkt_&44TRt_h<?*MooSu
zU|FBc1X2sdEDQ_`tPBhc&I}9;#dZt~3?&RT3@MC~3^j}(Qi7qGv6cxe#sn5)l4Jmj
zG1oAaFs3lpFxN0iFr+X`Gc+@aGXyhevLxy-GB9u{C@3gcB^ITZ=BDPAD1;Uiq!z`O
z<Y%YmDd<ja=93de$ob@#!{jD6@+nNdz{gpik*bhanwykbq>!JcP+XE)ppaISpQ}&`
zGDf{v0b)=|zCsR2FHC?7Y-va$$P%#fjFOUqVk>?9^73-MqSTb6ocyHp#N5<kz2y8{
z{q&;Dlw$pi)QZIP{Jdg)u-?+Vl++@H;?(-&lFa-(D}|K&(xjYJh2;GFqLj?M#FErv
zg|z%4sBn2^N=XJ-o30(0Dq>_{U?>8GZILho1A`{hE#}0e;#<tQi4~eGQQSyj5XFt;
z=_sa@iYTU($|7!%b}*sK!@$6BOCTk)xFj(zIW;~hwWK^XHBXz7fuWcU6mMK2j3P`$
udJGH<ewyNwl>}?pK<py!$q!kD`8jNI^HWN5Qtd$QDb|^MP*9hNLj(Xlpp{Jk

delta 76
zcmZqBc&E%4%FD~ez`($uemX4SqtZk^8OEN8+Py5n44R4?k7x=o-kSVQz>?WdQ*5%X
ga1A5(<VH4Oeh!=5{FKt1R69ln28Lp-$rpun0Vh`!@&Et;

diff --git a/search/main.py b/search/main.py
index 5a06783..4c8316d 100644
--- a/search/main.py
+++ b/search/main.py
@@ -15,12 +15,23 @@ import json
 from search.movement_logic import *
 from search.util import print_board, print_slide, print_swing
 
+# Constant's definition.
+TYPE = 0
+ROW = 1
+COLUMN = 2
+
+A_WIN = 1
+B_WIN = 2
+DRAW = 0
+
+MAX_DISTANCE = 99
+
 # Why don't we just make the pieces and blocks global then?
 # No need to ever pass them around
-dictpieces = {}
-setblocks = set()
+dictPieces = {}
+setBlocks = set()
+dictTargets = {}
 
-dicttargets = {}
 
 def main():
     try:
@@ -31,7 +42,7 @@ def main():
         sys.exit(1)
 
     parse_input(data)
-    print(dictpieces)
+    print(dictPieces)
 
     # So basically it is heavily implied to treat the game as a state-based search problem.
     # We are also told in question 3 of the design report to discuss the time and space
@@ -48,9 +59,6 @@ def main():
 
     # Algorithm start
 
-
-
-
     # TODO:
     # Find and print a solution to the board configuration described
     # by `data`.
@@ -58,103 +66,130 @@ def main():
     # `print_board` helper function? (See the `util.py` source code for
     # usage information).
 
+
 def parse_input(data):
+    """
+     data is a dictionary with keys "upper", "lower" and "block"
+     pieces in dictionary, blocks in set, we can use if position in setblocks
+
+    parse data into either dictPieces or setBlocks
+    :param data: Dictionary obtain after read from JSON file using JSON module.
+    :return: NULL
+    """
     # We can put the code to read the file NOT in the try/except statement because
     # if the file couldn't be read the process would end anyway
-    # data is a dictionary with keys "upper", "lower" and "block"
-    # pieces in dictionary, blocks in set, we can use if position in setblocks
-    initialpiecesupper = data["upper"]
-    initialpieceslower = data["lower"]
-    initialblocks = data["block"]
 
+    initialPiecesUpper = data["upper"]
+    initialPiecesLower = data["lower"]
+    initialBlocks = data["block"]
+
+    keyWrite = ""
+
+    # Parse the Upper's player token
     nump, numr, nums = 0, 0, 0
-    keywrite = ""
-    for piece in initialpiecesupper:
-        if piece[0] == "p":
+    for piece in initialPiecesUpper:
+        if piece[TYPE] == "p":
             nump = nump + 1
-            keywrite = "P" + str(nump)
-        elif piece[0] == "r":
+            keyWrite = "P" + str(nump)
+        elif piece[TYPE] == "r":
             numr = numr + 1
-            keywrite = "R" + str(numr)
+            keyWrite = "R" + str(numr)
         else:
             nums = nums + 1
-            keywrite = "S" + str(nums)
-        dictpieces[keywrite] = (piece[1], piece[2])
+            keyWrite = "S" + str(nums)
+        dictPieces[keyWrite] = (piece[ROW], piece[COLUMN])
+
+    # parse the Lower player's token
     nump, numr, nums = 0, 0, 0
-    for piece in initialpieceslower:
-        if piece[0] == "p":
+    for piece in initialPiecesLower:
+        if piece[TYPE] == "p":
             nump = nump + 1
-            keywrite = "p" + str(nump)
-        elif piece[0] == "r":
+            keyWrite = "p" + str(nump)
+        elif piece[TYPE] == "r":
             numr = numr + 1
-            keywrite = "r" + str(numr)
+            keyWrite = "r" + str(numr)
         else:
             nums = nums + 1
-            keywrite = "s" + str(nums)
-        dictpieces[keywrite] = (piece[1], piece[2])
-    for block in initialblocks:
-        setblocks.add((block[1], block[2]))
-
-
-# Our upper pieces are R, P and S, lower pieces are r, p and s
-# We will convert both to lower case letters and check each case
-# Would be nice to use comparator but can't have r>s>p>r using it
-# Return 1 if piecea wins, 2 if pieceb wins and 0 if neither win
-# Only look at first character of string
-def piece_collision(piecea, pieceb) -> int:
-    piecea = piecea[0].lower()
-    pieceb = pieceb[0].lower()
-    if piecea == "r":
-        if pieceb == "s":
-            return 1
-        elif pieceb == "p":
-            return 2
-    elif piecea == "s":
-        if pieceb == "p":
-            return 1
-        elif pieceb == "r":
-            return 2
-    elif piecea == "p":
-        if pieceb == "r":
-            return 1
-        elif pieceb == "s":
-            return 2
-    return 0
-
-# Input is the key of the piece to find a target for
-# This function changes the value of the key given in the
-# target dictionary to the closest enemy piece it can beat
+            keyWrite = "s" + str(nums)
+        dictPieces[keyWrite] = (piece[ROW], piece[COLUMN])
+
+    # parse the block object
+    for block in initialBlocks:
+        setBlocks.add((block[ROW], block[COLUMN]))
+
+
+def piece_collision(pieceA, pieceB) -> int:
+    """
+     Our upper pieces are R, P and S, lower pieces are r, p and s
+     We will convert both to lower case letters and check each case
+     Would be nice to use comparator but can't have r>s>p>r using it
+
+     Return A_WIN if pieceA wins, B_WIN if pieceB wins and DRAW if neither win
+     Only look at first character of string
+
+    :param pieceA: type of the token in {'R','P','S','r','p','s'}
+    :param pieceB: type of the token in {'R','P','S','r','p','s'}
+    :return: A_WIN, B_WIN or DRAW
+    """
+    pieceA = pieceA[TYPE].lower()
+    pieceB = pieceB[TYPE].lower()
+    if pieceA == "r":
+        if pieceB == "s":
+            return A_WIN
+        elif pieceB == "p":
+            return B_WIN
+
+    elif pieceA == "s":
+        if pieceB == "p":
+            return A_WIN
+        elif pieceB == "r":
+            return B_WIN
+
+    elif pieceA == "p":
+        if pieceB == "r":
+            return A_WIN
+        elif pieceB == "s":
+            return B_WIN
+
+    return DRAW
+
+
 def find_target(piece_key):
-    currentpos = dictpieces[piece_key]
+    """
+    This function changes the value of the key given in the
+    target dictionary to the closest enemy piece it can beat
+
+    :param piece_key: key of the piece to find a target for. We should only work with upper player's pieces
+    :return: null
+    """
+    currentPos = dictPieces[piece_key]
     # Set the target
     target = ""
-    if piece_key[0] == "R":
+    if piece_key[TYPE] == "R":
         target = "s"
-    elif piece_key[0] == "S":
+    elif piece_key[TYPE] == "S":
         target = "p"
-    elif piece_key[0] == "P":
+    elif piece_key[TYPE] == "P":
         target = "r"
-    # If we haven't set a target by now, we're dealing with the wrong kind of piece
+    # If we haven't set a target by now, we're dealing with the lower player pieces
     else:
         return
-    #Now we check which target is closest
-    #Start with dummy information
-    targetpiece = ""
-    targetdist = 99
-    for key in dictpieces:
-        if key[0] == target:
-            distance = distance_between(dictpieces[piece_key],dictpieces[key])
-            if distance < targetdist:
-                targetpiece = key
-                targetdist = distance
+    # Now we check which target is closest
+    # Start with dummy information
+    targetPiece = ""
+    targetDist = MAX_DISTANCE
+    for key in dictPieces:
+        # XUAN: unfortunately i believe this logical operation will always be FALSE
+        # e.g: 'r' != 'r1'
+        if key[TYPE] == target:
+            distance = distance_between(dictPieces[piece_key], dictPieces[key])
+            if distance < targetDist:
+                targetPiece = key
+                targetDist = distance
     # Now add target to dictionary
-    if targetdist == 99:
-        dicttargets[piece_key] = ()
+    if targetDist == MAX_DISTANCE:
+        dictTargets[piece_key] = ()
     else:
-        dicttargets[piece_key] = dictpieces[key]
+        # Xuan: does this 'variable' has any value? since it is out side its scope.
+        dictTargets[piece_key] = dictPieces[key]
     return
-
-
-
-
-
diff --git a/search/test.py b/search/test.py
new file mode 100644
index 0000000..1fa07dd
--- /dev/null
+++ b/search/test.py
@@ -0,0 +1 @@
+print('r' == 'r1')
\ No newline at end of file
-- 
GitLab