A java PacMan game application for A.U.TH (data structures class)
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

290 linhas
7.6 KiB

  1. package gr.auth.ee.dsproject.pacman;
  2. import gr.auth.ee.dsproject.node.Node;
  3. /**
  4. * <p>
  5. * Title: DataStructures2011
  6. * </p>
  7. *
  8. * <p>
  9. * Description: Data Structures project: year 2011-2012
  10. * </p>
  11. *
  12. * <p>
  13. * Copyright: Copyright (c) 2011
  14. * </p>
  15. *
  16. * <p>
  17. * Company: A.U.Th.
  18. * </p>
  19. *
  20. * @author Michael T. Tsapanos
  21. * @version 1.0
  22. */
  23. public class Creature implements gr.auth.ee.dsproject.pacman.AbstractCreature
  24. {
  25. public String getName ()
  26. {
  27. return "Mine";
  28. }
  29. private int step = 1;
  30. private boolean amPrey;
  31. public Creature (boolean isPrey)
  32. {
  33. amPrey = isPrey;
  34. }
  35. public int calculateNextPacmanPosition (Room[][] Maze, int[] currPosition)
  36. {
  37. // TODO Fill This
  38. return 0;
  39. }
  40. void createSubTreePacman (int depth, Node parent, Room[][] Maze, int[] currPacmanPosition)
  41. {
  42. // TODO Fill This
  43. }
  44. void createSubTreeGhosts (int depth, Node parent, Room[][] Maze, int[][] currGhostsPosition)
  45. {
  46. // TODO Fill This
  47. }
  48. public int[] getPacPos (Room[][] Maze)
  49. {
  50. int[] pacmanPos = new int[2];
  51. for (int i = 0; i < PacmanUtilities.numberOfRows; i++) {
  52. for (int j = 0; j < PacmanUtilities.numberOfColumns; j++) {
  53. if (Maze[i][j].isPacman()) {
  54. pacmanPos[0] = i;
  55. pacmanPos[1] = j;
  56. return pacmanPos;
  57. }
  58. }
  59. }
  60. return pacmanPos;
  61. }
  62. public boolean[] comAvPos (Room[][] Maze, int[][] currentPos, int[] moves, int currentGhost)
  63. {
  64. boolean[] availablePositions = { true, true, true, true };
  65. int[][] newPos = new int[4][2];
  66. for (int i = 0; i < 4; i++) {
  67. if (Maze[currentPos[currentGhost][0]][currentPos[currentGhost][1]].walls[i] == 0) {
  68. availablePositions[i] = false;
  69. continue;
  70. }
  71. if (PacmanUtilities.flagColision(Maze, currentPos[currentGhost], i)) {
  72. availablePositions[i] = false;
  73. }
  74. else if (currentGhost == 0)
  75. continue;
  76. else {
  77. switch (i) {
  78. case Room.WEST:
  79. newPos[currentGhost][0] = currentPos[currentGhost][0];
  80. newPos[currentGhost][1] = currentPos[currentGhost][1] - 1;
  81. break;
  82. case Room.SOUTH:
  83. newPos[currentGhost][0] = currentPos[currentGhost][0] + 1;
  84. newPos[currentGhost][1] = currentPos[currentGhost][1];
  85. break;
  86. case Room.EAST:
  87. newPos[currentGhost][0] = currentPos[currentGhost][0];
  88. newPos[currentGhost][1] = currentPos[currentGhost][1] + 1;
  89. break;
  90. case Room.NORTH:
  91. newPos[currentGhost][0] = currentPos[currentGhost][0] - 1;
  92. newPos[currentGhost][1] = currentPos[currentGhost][1];
  93. }
  94. for (int j = (currentGhost - 1); j > -1; j--) {
  95. switch (moves[j]) {
  96. case Room.WEST:
  97. newPos[j][0] = currentPos[j][0];
  98. newPos[j][1] = currentPos[j][1] - 1;
  99. break;
  100. case Room.SOUTH:
  101. newPos[j][0] = currentPos[j][0] + 1;
  102. newPos[j][1] = currentPos[j][1];
  103. break;
  104. case Room.EAST:
  105. newPos[j][0] = currentPos[j][0];
  106. newPos[j][1] = currentPos[j][1] + 1;
  107. break;
  108. case Room.NORTH:
  109. newPos[j][0] = currentPos[j][0] - 1;
  110. newPos[j][1] = currentPos[j][1];
  111. // break;
  112. }
  113. if ((newPos[currentGhost][0] == newPos[j][0]) && (newPos[currentGhost][1] == newPos[j][1])) {
  114. availablePositions[i] = false;
  115. continue;
  116. }
  117. if ((newPos[currentGhost][0] == currentPos[j][0]) && (newPos[currentGhost][1] == currentPos[j][1]) && (newPos[j][0] == currentPos[currentGhost][0])
  118. && (newPos[j][1] == currentPos[currentGhost][1])) {
  119. availablePositions[i] = false;
  120. }
  121. }
  122. }
  123. }
  124. return availablePositions;
  125. }
  126. public int comBestPos (boolean[] availablePositions, int[] pacmanPosition, int[] currentPos)
  127. {
  128. int[] newVerticalDifference = new int[2];
  129. for (int i = 0; i < 2; i++)
  130. newVerticalDifference[i] = currentPos[i] - pacmanPosition[i];
  131. int[] distanceSquared = new int[4];
  132. for (int i = 0; i < 4; i++) {
  133. if (availablePositions[i] == true) {
  134. switch (i) {
  135. case Room.WEST:
  136. newVerticalDifference[1]--;
  137. break;
  138. case Room.SOUTH:
  139. newVerticalDifference[0]++;
  140. break;
  141. case Room.EAST:
  142. newVerticalDifference[1]++;
  143. break;
  144. case Room.NORTH:
  145. newVerticalDifference[0]--;
  146. break;
  147. }
  148. distanceSquared[i] = newVerticalDifference[0] * newVerticalDifference[0] + newVerticalDifference[1] * newVerticalDifference[1];
  149. } else
  150. distanceSquared[i] = PacmanUtilities.numberOfRows * PacmanUtilities.numberOfRows + PacmanUtilities.numberOfColumns * PacmanUtilities.numberOfColumns + 1;
  151. }
  152. int minDistance = distanceSquared[0];
  153. int minPosition = 0;
  154. for (int i = 1; i < 4; i++) {
  155. if (minDistance > distanceSquared[i]) {
  156. minDistance = distanceSquared[i];
  157. minPosition = i;
  158. }
  159. }
  160. return minPosition;
  161. }
  162. public int[] calculateNextGhostPosition (Room[][] Maze, int[][] currentPos)
  163. {
  164. int[] moves = new int[PacmanUtilities.numberOfGhosts];
  165. int[] pacmanPosition = new int[2];
  166. pacmanPosition = getPacPos(Maze);
  167. for (int i = 0; i < PacmanUtilities.numberOfGhosts; i++) {
  168. moves[i] = comBestPos(comAvPos(Maze, currentPos, moves, i), pacmanPosition, currentPos[i]);
  169. }
  170. return moves;
  171. }
  172. public boolean[] checkCollision (int[] moves, int[][] currentPos)
  173. {
  174. boolean[] collision = new boolean[PacmanUtilities.numberOfGhosts];
  175. int[][] newPos = new int[4][2];
  176. for (int i = 0; i < moves.length; i++) {
  177. if (moves[i] == 0) {
  178. if (currentPos[i][1] > 0) {
  179. newPos[i][0] = currentPos[i][0];
  180. newPos[i][1] = currentPos[i][1] - 1;
  181. } else {
  182. newPos[i][0] = currentPos[i][0];
  183. newPos[i][1] = PacmanUtilities.numberOfColumns - 1;
  184. }
  185. } else if (moves[i] == 1) {
  186. if (currentPos[i][0] < PacmanUtilities.numberOfRows - 1) {
  187. newPos[i][0] = currentPos[i][0] + 1;
  188. newPos[i][1] = currentPos[i][1];
  189. } else {
  190. newPos[i][0] = 0;
  191. newPos[i][1] = currentPos[i][1];
  192. }
  193. } else if (moves[i] == 2) {
  194. if (currentPos[i][1] < PacmanUtilities.numberOfColumns - 1) {
  195. newPos[i][0] = currentPos[i][0];
  196. newPos[i][1] = currentPos[i][1] + 1;
  197. } else {
  198. newPos[i][0] = currentPos[i][0];
  199. newPos[i][1] = 0;
  200. }
  201. } else {
  202. if (currentPos[i][0] > 0) {
  203. newPos[i][0] = currentPos[i][0] - 1;
  204. newPos[i][1] = currentPos[i][1];
  205. } else {
  206. newPos[i][0] = PacmanUtilities.numberOfRows - 1;
  207. newPos[i][1] = currentPos[i][1];
  208. }
  209. }
  210. collision[i] = false;
  211. }
  212. for (int k = 0; k < moves.length; k++) {
  213. }
  214. for (int i = 0; i < moves.length; i++) {
  215. for (int j = i + 1; j < moves.length; j++) {
  216. if (newPos[i][0] == newPos[j][0] && newPos[i][1] == newPos[j][1]) {
  217. collision[j] = true;
  218. }
  219. if (newPos[i][0] == currentPos[j][0] && newPos[i][1] == currentPos[j][1] && newPos[j][0] == currentPos[i][0] && newPos[j][1] == currentPos[i][1]) {
  220. collision[j] = true;
  221. }
  222. }
  223. }
  224. return collision;
  225. }
  226. }