From 60118bf1a7179ac5372f906a54f0482d2e37cd62 Mon Sep 17 00:00:00 2001 From: Christos Houtouridis Date: Mon, 15 Jan 2018 21:44:00 +0200 Subject: [PATCH] DEV: First try of a tree --- .../auth/ee/dsproject/pacman/Creature.class | Bin 5270 -> 6430 bytes src/gr/auth/ee/dsproject/node/Globals.java | 2 +- src/gr/auth/ee/dsproject/node/MinMaxTree.java | 6 +- .../auth/ee/dsproject/node/Node89978445.java | 13 +- src/gr/auth/ee/dsproject/pacman/Creature.java | 120 ++++++++++-------- 5 files changed, 84 insertions(+), 57 deletions(-) diff --git a/bin/gr/auth/ee/dsproject/pacman/Creature.class b/bin/gr/auth/ee/dsproject/pacman/Creature.class index 11597e03b51ed15bf786ad7001f383e0f20a6642..e53c04b11537d007f69247d04a7de25948d08558 100644 GIT binary patch delta 3010 zcmZuz3vg8B89m?Kd-rCS3nYOJ*@QrVkoSWmBuc`wghwzBknjkJ#U*S)AlX2Y4TPdA z2wGb$#S2z#wSZuJP!+HtBaT??*umD8nReR3v{XySv17;DnLaE+((~UCczQ^tpS5zBl;BTL5O`v40w~6%VtIxh5Mq+hqs5-E#t}__) zVkR;zOhlF-C)55w5_lkPYo}~FG6nK^{s#?8dc&5wpnAVy%UBSU(C-AzZel zqpRBiXb_-6DA-`30gbj-57{5N;v#WP;m%Pa6hYxIL&2Rj9h)hDnQ~Rz~1(4#A zUmH3tbb*?=D6YVlS(z1e-4+P76x43o8f@w=H_^ibjvx!M%R(>Wb`R&wK})20Drf45 zy+fZI@U|!=he`Nui&Y@JCar>ms*a{W+uA^9s}iNIcYDxLN04;8i*p%cez|=}pW{A& zhfO?WUuNKM;t~6E{hrAl9Kb;f-&JL7?4+7qO5VpU*f?yTG!Dp9c8>c(((@Mf;X#$& z7c4xA$CUMwg&*LVv$|vXhvbH-H6Y zZoiu-m-x*AR4N*Nx8Ed@GQ)55qk6sH$Q{6{b=k>&gF9SW(~tW7G2)9cBgcl$oMuRu z!>v@oV5i5Rf3fuEQq2oA5JG6Wzox6fh0CXNUnjCPYl6 znqXr!gXfwV=L;-TG1$VxaxSKSFIO5z<;?Tz186BT{boP5mBzSAJ&``l8IjPh`%Ryx zA3NSgcmO-2LMmPVU&{R+@p*hP$A;cj;^~ffMX+dZB-VQ=MGHmQibQN<`rDC45lXOw zvUXwxyKoiP8&q>K|775x996DyRJq1cr8|Y!k3I>e|m&W>v3KvJ`dvG5G zNn{r9cZ5r3S43!e@BnXH)FygrFHdboCNLE)s>+i5s;Xh7YMW5j65e13*^|5(vfp0d zEsEU7==alK1mo#58GGqsA1OYFbgs?f-W)vqm7XXcWmZ1i6FPh6TTHOVWEVT=Ttt?J zZxg5Pq&gnPEtThHxd}rOv>S{ks(&H&XWopGuvX@Fm70Arn3L<%i(L6d>Y?Wsy^inr z%>1We`3;}xs_T=h&H*1=jb}_#~JkD0$#vHyo6ujWn9B4e27=@8D7OLoE0}-mrV3a3C>9c z24orDkhM53O?Xq9@s@N&a6$IrZ8?C8av1N(G5k#4!6mtb_v9CNpL~C*S-7mltOCJthTiSL^T+v~?oadAr8z2iQQ{E_#sVGRDnhP;O9B%Fck99w_k6#IxR z`Z25WuaxW)wBTA0v|E7f3@gn|9p>9ydn;4*A7cq!S7{dE} z|E=f_)9s7|Tp3}CD-nl+8YNfotW!41I^s|@@EiP)mQFrN4l9G;&M;UZL1%MCF?BO& zHjX*g8SWof?D1nx6tx>=UyO0LFh-SJ>=1j)WIH%gG@Get=5ln(qLCQ(_N)TA5!vsMs{{iE+75q^Xs`jqo^M*+CPs?N)j)0vEY$$h?Vh3 zkXYpLSt=9kq1Z`FM}9Hx9L}gteWMxma4;(BI)7be4AWF2aV)e!Bn+eT6V1ywWjDqp zO89Iz?#~kOGhQ+*NkP0!g{z)W}S%lT2)qEdHIy#vaMRBa(|p zB@c%sAID@CPDvrlxd=a%V*FZWGgBqFE~WTH=HOE)!+)e)+%i`t$UI4q1u|6@O0F!C z!fZ+5)^fQ^s$`W^%Lb{DJ+e~v%4+$EtdV!QcA0xurQz|3lOl>M(=2}&;V-|(k668& z4szM4ULE6!O(o5c`DFi!W7TjnMAz1FsH!RAcBV)g;s+5QEojM4ESyw0DZ^)4nspN~ RlKurMhUdzwR8qrh{{xE3R-ym^ delta 2137 zcmaJ?d2AGQ6#m}q%ue@!mTjjOw3O1)8`}z{Emtdra+J2vax90iZ5Jr?fNnWdaMgg3 zgm?`CV!|OR9z+DfArevX0yPp(sA5nfK}n2%DdDQ$%mV*uwlnkQ{pS6?_rBlvUUw94 z$%#30>-f6>h9Rs&5oDM@%YXyz>PFydy#`&bCaXWm5-r13Iv1rrD2{F zEvve%vnkLP^5Py83S1K^YZ}HcsIO}fD03%S(Zycei(zK87H?iq#+rj1MKw|FovVVi zoh?Cr6kH{cDuJUtutpHo5^Qb_wRUz0ydA+c-SwTJ)^7V%S_OR?x&zJ2rUsTb2AbM} zI!bgDnq5k}+34&S>uX-w)m0y8ZVzkfDlwKCoCl(^P=#PI05dp|W?`v~Je4DTiA!~1=3hcO<}m;fIpVjyafi8_j)9u=5| zYE0)_1AmRoycP>F8~qrzh+1I2jEUvbvW9a*v8@p(gu-<{N>N6z3M8PMmdf2?FcPDn z5w8)WY3bY{JPl(I1sB1qFqXk?q|;MDp9huPG7XMiX64Z#I_}dkPN$1y@NFC+ixj?8 zu?T8{Rs%1MmmJ_tu}gK@nJu(49~N1>o4Fu7fk@nkS2feLb`!fChiy${Mk=jIm`wlw zA_V^f;r{_VQ&2+$u|#6-?3*QZ<|loNGh69fN>-MUtTyyVJNfBA20Af>zCx~*A!MdT zCsanLS1|%JZ0eotF^fG1MU{b>v{ai%AGDirS)|>7Ch^KO?k<)f%~jDk;x~6iCnwJ_ z^r73~P0|eA(YRN7^70L}*wBw*{-JN8FH86V7#jTdD& z_DB_8l4`snGqG2i@v1Ds>k=x)8}b@;TmSVaF9OPAER? zRQh9`l7UlZyDwqhZFMSHRBDZN#I#yS7LS-#(5A>>)FLdVK2j7nmhd|#(iGLEQWu9L z+Ehl_R1QJhEezJts>5$y^rbr3%%;R%4WDNC8S3^kB=MP!FObDb3viY#^%X_`4d=+W zB`%QBi+GM~Y{M_)>r1?b->@H-$k}Ba!|&wm51hso?sysBkuj?c zmlFv%e^<=s!*&Ihn9ox*Rv%hcvt6l1@OD}%t4+46(wN*qimH%F=kho$(Krd3OOaXD zL9Q>SrQB&1wCay>W(P1-i@xBPARvR~;qV zUZfNlT5fJ$J|9Q0GD*!hwBjRJUAJBnL*sntbb5==v%VfKJ7yl_)l&Bn8gKw8#$?!f9Zg>L=7%UHb_BLpP0IB&yg8MA$6J*ewI7;uIW}RD37{@wKGkI~jyuB^_5J6MxDO{3BW7 zlx&HW9Eq1a87TSu6-iN8TryII$rLG-X;LP0q+Hg@D0x)I%KK6&AJcc1YdunJ(=?9+ zvWPo0(XymZk children = new ArrayList (); + children = new ArrayList (); } /** @@ -88,7 +88,7 @@ public class Node89978445 currentGhostPos = new int [PacmanUtilities.numberOfGhosts][2]; flagPos = new int [PacmanUtilities.numberOfFlags][2]; currentFlagStatus = new boolean[PacmanUtilities.numberOfFlags]; - ArrayList children = new ArrayList (); + children = new ArrayList (); } /* @@ -134,6 +134,13 @@ public class Node89978445 return nodeEvaluation; } + public int[] getCurentPacmanPos () { + return nodeXY; + } + public int[][] getCurrentGhostPos () { + return currentGhostPos; + } + /* * ============= Helper API ============ */ diff --git a/src/gr/auth/ee/dsproject/pacman/Creature.java b/src/gr/auth/ee/dsproject/pacman/Creature.java index 670d9fc..780da22 100755 --- a/src/gr/auth/ee/dsproject/pacman/Creature.java +++ b/src/gr/auth/ee/dsproject/pacman/Creature.java @@ -47,58 +47,78 @@ public class Creature implements gr.auth.ee.dsproject.pacman.AbstractCreature /** * @brief * Create node for each one of the possible moves (0, 1, 2, 3) and - * evaluate these moves. After that feeds the valid ones to an ArrayList - * and select the best of them to return + * evaluate these moves. */ -// public int calculateNextPacmanPosition (Room[][] Maze, int[] currPosition) -// { -// Node89978445 node = new Node89978445 (); // make a dummy node -// MinMaxTree rt = new MinMaxTree (node); /*< -// * Plant a tree with dummy root -// * Null parent and no evaluation -// */ -// -// createSubTreePacman (0,node, Maze, currPosition); -// return 0; -// } - public int calculateNextPacmanPosition (Room[][] Maze, int[] currPosition) - { - Node89978445 cur = new Node89978445 (Maze, currPosition); - Node89978445 moveNode; - //ArrayList moveNodes = new ArrayList (); - double ev, max = Globals.NO_EVAL; - int decision = -1; - - int[] nextPosition = {-1, -1}; - - /* - * loop the possible moves and fill them to list - * mark the move with the maximum evaluation value - */ - for (int i=0 ; i<4 ; ++i) { - if ((nextPosition = Node89978445.pacmanValidMove(cur, i)) != Globals.FALSE_POS) { - moveNode = new Node89978445 (Maze, nextPosition); - ev = moveNode.getEvaluation(); - if (ev > max) { - max = ev; - decision = i; - } - } - } - return decision; - } - - void createSubTreePacman (int depth, Node89978445 parent, Room[][] Maze, int[] currPacmanPosition) - { - - // TODO Fill This - - } + public int calculateNextPacmanPosition (Room[][] Maze, int[] currPosition) + { + Node89978445 cur = new Node89978445 (Maze, currPosition); + MinMaxTree mmTree = new MinMaxTree (cur); /*< + * Plant a tree with dummy root + * Null parent and no evaluation + */ + + createSubTreePacman (0, cur, Maze, currPosition); //make the tree + // min-max + return 0; + } + + void createSubTreePacman (int depth, Node89978445 parent, Room[][] Maze, int[] curPacmanPosition) + { + if (++depth > Globals.MINMAXTREE_MAX_DEPTH) + return; + else { + Node89978445 newNode; + Room[][] newMaze; + int[] nextPosition = {-1, -1}; + + // scan possible valid moves + for (int move=0 ; move<4 ; ++move) { + if ((nextPosition = Node89978445.pacmanValidMove (parent, move)) != Globals.FALSE_POS) { + // Make a copy of the maze in order to simulate next move and move Pacman + newMaze = PacmanUtilities.copy (Maze); + PacmanUtilities.movePacman (newMaze, parent.getCurentPacmanPos(), nextPosition); + + // Create a node for the move in the new stated game maze + newNode = new Node89978445 (newMaze, nextPosition); + newNode.getEvaluation(); + MinMaxTree.insert (newNode, parent); // add node to the min-max tree + + // call the recursive ranch creator + createSubTreeGhosts (depth, newNode, newMaze, newNode.getCurrentGhostPos()); + } + } + } + } - void createSubTreeGhosts (int depth, Node89978445 parent, Room[][] Maze, int[][] currGhostsPosition) - { - // TODO Fill This - } + void createSubTreeGhosts (int depth, Node89978445 parent, Room[][] Maze, int[][] currGhostsPosition) + { + if (++depth > Globals.MINMAXTREE_MAX_DEPTH) + return; + else { + Node89978445 newNode; + Room[][] newMaze; + ArrayList ghostMoves; + + // Get all possible ghost moves + ghostMoves = PacmanUtilities.allGhostMoves(Maze, currGhostsPosition); + + // loop all ghost moves + int s = ghostMoves.size(); + for (int i=0 ; i