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