From c9de424a9cf1df1fdeb622bb26433b0ff2b2f28a Mon Sep 17 00:00:00 2001 From: Christopher Bohn <bohn@unl.edu> Date: Thu, 3 Oct 2024 16:50:38 -0500 Subject: [PATCH] Reformatted for 2024 formatting convention --- .../edu/unl/cse/soft160/pacman/Constants.java | 84 +- .../edu/unl/cse/soft160/pacman/Ghost.java | 478 ++++----- .../edu/unl/cse/soft160/pacman/Image.java | 318 +++--- .../edu/unl/cse/soft160/pacman/Interface.java | 234 ++--- .../java/edu/unl/cse/soft160/pacman/Maze.java | 562 +++++----- .../edu/unl/cse/soft160/pacman/PacMan.java | 992 +++++++++--------- .../edu/unl/cse/soft160/pacman/PowerDot.java | 168 +-- .../edu/unl/cse/soft160/pacman/Speed.java | 62 +- .../edu/unl/cse/soft160/pacman/Utility.java | 44 +- 9 files changed, 1471 insertions(+), 1471 deletions(-) diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Constants.java b/src/main/java/edu/unl/cse/soft160/pacman/Constants.java index 7a63eec..cd08ed8 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Constants.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Constants.java @@ -23,50 +23,50 @@ package edu.unl.cse.soft160.pacman; * the tables are used to speed up computation */ public class Constants { - // for direction computation - public static final int[] DIRECTION_X_COMPONENTS = {1, 0, -1, 0}; - public static final int[] DIRECTION_Y_COMPONENTS = {0, -1, 0, 1}; - public static final int[] iDirection = {-1, // 0: - 1, // 1: x=0, y=-1 - -1, // 2: - -1, // 3: - 2, // 4: x=-1, y=0 - -1, // 5: - 0, // 6: x=1, y=0 - -1, // 7 - -1, // 8 - 3 // 9: x=0, y=1 - }; + // for direction computation + public static final int[] DIRECTION_X_COMPONENTS = {1, 0, -1, 0}; + public static final int[] DIRECTION_Y_COMPONENTS = {0, -1, 0, 1}; + public static final int[] iDirection = {-1, // 0: + 1, // 1: x=0, y=-1 + -1, // 2: + -1, // 3: + 2, // 4: x=-1, y=0 + -1, // 5: + 0, // 6: x=1, y=0 + -1, // 7 + -1, // 8 + 3 // 9: x=0, y=1 + }; - // backward direction - public static final int[] iBack = {2, 3, 0, 1}; + // backward direction + public static final int[] iBack = {2, 3, 0, 1}; - // direction code - public enum Direction { - EAST, - NORTH, - WEST, - SOUTH, - } + // direction code + public enum Direction { + EAST, + NORTH, + WEST, + SOUTH, + } - // the maze definition string - public static final String[] MazeDefine = { - "XXXXXXXXXXXXXXXXXXXXX", // 1 - "X.........X.........X", // 2 - "XOXXX.XXX.X.XXX.XXXOX", // 3 - "X......X..X.........X", // 4 - "XXX.XX.X.XXX.XX.X.X.X", // 5 - "X....X..........X.X.X", // 6 - "X.XX.X.XXXXX-X.XX.X.X", // 7 - "X.XX.X.X X......X", // 8 - "X.XX...X X.XXXX.X", // 9 - "X.XX.X.XXXXXXX.XXXX.X", // 10 - "X....X.... .........X", // 11 - "XXX.XX.XXXXXXX.X.X.XX", // 12 - "X.........X....X....X", // 13 - "XOXXXXXXX.X.XXXXXXXOX", // 14 - "X...................X", // 15 - "XXXXXXXXXXXXXXXXXXXXX", // 16 - }; + // the maze definition string + public static final String[] MazeDefine = { + "XXXXXXXXXXXXXXXXXXXXX", // 1 + "X.........X.........X", // 2 + "XOXXX.XXX.X.XXX.XXXOX", // 3 + "X......X..X.........X", // 4 + "XXX.XX.X.XXX.XX.X.X.X", // 5 + "X....X..........X.X.X", // 6 + "X.XX.X.XXXXX-X.XX.X.X", // 7 + "X.XX.X.X X......X", // 8 + "X.XX...X X.XXXX.X", // 9 + "X.XX.X.XXXXXXX.XXXX.X", // 10 + "X....X.... .........X", // 11 + "XXX.XX.XXXXXXX.X.X.XX", // 12 + "X.........X....X....X", // 13 + "XOXXXXXXX.X.XXXXXXXOX", // 14 + "X...................X", // 15 + "XXXXXXXXXXXXXXXXXXXXX", // 16 + }; } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Ghost.java b/src/main/java/edu/unl/cse/soft160/pacman/Ghost.java index ded6a58..f93a03f 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Ghost.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Ghost.java @@ -23,262 +23,262 @@ import static edu.unl.cse.soft160.pacman.Constants.Direction; import java.awt.*; public class Ghost { - public enum Status { - CAGED, HUNTING, EDIBLE, EATEN, - }; + public enum Status { + CAGED, HUNTING, EDIBLE, EATEN, + }; - private final int[] STEPS = { 7, 7, 1, 1 }; // indexed by status - private final int[] FRAMES = { 8, 8, 2, 1 }; // indexed by status + private final int[] STEPS = { 7, 7, 1, 1 }; // indexed by status + private final int[] FRAMES = { 8, 8, 2, 1 }; // indexed by status - private final int MAXIMUM_EDIBILITY_DURATION = 600; // frames - private int edibilityDuration; // frames + private final int MAXIMUM_EDIBILITY_DURATION = 600; // frames + private int edibilityDuration; // frames - private Speed speed = new Speed(); + private Speed speed = new Speed(); - private Status status; - private int edibilityRemaining; - private boolean blinking; - private Direction direction; - private int x, y; + private Status status; + private int edibilityRemaining; + private boolean blinking; + private Direction direction; + private int x, y; - // the applet this object is associated to - private Window applet; - private Graphics graphics; + // the applet this object is associated to + private Window applet; + private Graphics graphics; - // the maze the ghosts knows - private Maze maze; + // the maze the ghosts knows + private Maze maze; - // the ghost images - java.awt.Image imageGhost; - java.awt.Image imageEdible; - java.awt.Image imageEye; + // the ghost images + java.awt.Image imageGhost; + java.awt.Image imageEdible; + java.awt.Image imageEye; - Ghost(Window applet, Graphics graphics, Maze maze, Color color) { - this.applet = applet; - this.graphics = graphics; - this.maze = maze; + Ghost(Window applet, Graphics graphics, Maze maze, Color color) { + this.applet = applet; + this.graphics = graphics; + this.maze = maze; - imageGhost = applet.createImage(18, 18); - Image.drawGhost(imageGhost, 0, color); - imageEdible = applet.createImage(18, 18); - Image.drawGhost(imageEdible, 1, Color.white); - imageEye = applet.createImage(18, 18); - Image.drawGhost(imageEye, 2, Color.lightGray); - } + imageGhost = applet.createImage(18, 18); + Image.drawGhost(imageGhost, 0, color); + imageEdible = applet.createImage(18, 18); + Image.drawGhost(imageEdible, 1, Color.white); + imageEye = applet.createImage(18, 18); + Image.drawGhost(imageEye, 2, Color.lightGray); + } - public void start(int initialPosition, int round) { - x = (8 + initialPosition + (initialPosition >= 2 ? 1 : 0)) * 16; - y = 8 * 16; - direction = Direction.NORTH; - status = Status.CAGED; - edibilityDuration = MAXIMUM_EDIBILITY_DURATION / ((round + 1) / 2); - speed.start(STEPS[status.ordinal()], FRAMES[status.ordinal()]); - } + public void start(int initialPosition, int round) { + x = (8 + initialPosition + (initialPosition >= 2 ? 1 : 0)) * 16; + y = 8 * 16; + direction = Direction.NORTH; + status = Status.CAGED; + edibilityDuration = MAXIMUM_EDIBILITY_DURATION / ((round + 1) / 2); + speed.start(STEPS[status.ordinal()], FRAMES[status.ordinal()]); + } - public void draw() { - maze.DrawDot(x / 16, y / 16); - maze.DrawDot(x / 16 + (x % 16 > 0 ? 1 : 0), y / 16 + (y % 16 > 0 ? 1 : 0)); - if (status == Status.EDIBLE && blinking && edibilityRemaining % 32 < 16) { - graphics.drawImage(imageGhost, x - 1, y - 1, applet); - } else if (status == Status.HUNTING || status == Status.CAGED) { - graphics.drawImage(imageGhost, x - 1, y - 1, applet); - } else if (status == Status.EDIBLE) { - graphics.drawImage(imageEdible, x - 1, y - 1, applet); - } else { - graphics.drawImage(imageEye, x - 1, y - 1, applet); - } - } + public void draw() { + maze.DrawDot(x / 16, y / 16); + maze.DrawDot(x / 16 + (x % 16 > 0 ? 1 : 0), y / 16 + (y % 16 > 0 ? 1 : 0)); + if (status == Status.EDIBLE && blinking && edibilityRemaining % 32 < 16) { + graphics.drawImage(imageGhost, x - 1, y - 1, applet); + } else if (status == Status.HUNTING || status == Status.CAGED) { + graphics.drawImage(imageGhost, x - 1, y - 1, applet); + } else if (status == Status.EDIBLE) { + graphics.drawImage(imageEdible, x - 1, y - 1, applet); + } else { + graphics.drawImage(imageEye, x - 1, y - 1, applet); + } + } - public static Direction turn(Status status, int gridX, int gridY, Direction direction, int playerGridX, int playerGridY, - Direction playerDirection, boolean eastBlocked, boolean northBlocked, boolean westBlocked, boolean southBlocked) { - int reverse = (direction.ordinal() + 2) % 4; - int dx = playerGridX - gridX; - int dy = playerGridY - gridY; - boolean[] blocked = { eastBlocked, northBlocked, westBlocked, southBlocked }; - Direction candidate; - candidate = Direction.EAST; - int eastScore = 0; - if (status == Status.CAGED && candidate == playerDirection) { - eastScore = 1; - } else { - int towardsPlayer = Math.max( - dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], - 0); - if (status == Status.HUNTING) { - eastScore += towardsPlayer; - } else { - eastScore -= towardsPlayer; - } - } - if (status != Status.EDIBLE && candidate == playerDirection) { - eastScore += 10; - } - if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { - eastScore = Integer.MIN_VALUE; - } - candidate = Direction.NORTH; - int northScore = 0; - if (status == Status.CAGED && candidate == playerDirection) { - northScore = 1; - } else { - int towardsPlayer = Math.max( - dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], - 0); - if (status == Status.HUNTING) { - northScore += towardsPlayer; - } else { - northScore -= towardsPlayer; - } - } - if (status != Status.EDIBLE && candidate == playerDirection) { - northScore += 10; - } - if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { - northScore = Integer.MIN_VALUE; - } - candidate = Direction.WEST; - int westScore = 0; - if (status == Status.CAGED && candidate == playerDirection) { - westScore = 1; - } else { - int towardsPlayer = Math.max( - dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], - 0); - if (status == Status.HUNTING) { - westScore += towardsPlayer; - } else { - westScore -= towardsPlayer; - } - } - if (status != Status.EDIBLE && candidate == playerDirection) { - westScore += 10; - } - if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { - westScore = Integer.MIN_VALUE; - } - candidate = Direction.SOUTH; - int southScore = 0; - if (status == Status.CAGED && candidate == playerDirection) { - southScore = 1; - } else { - int towardsPlayer = Math.max( - dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], - 0); - if (status == Status.HUNTING) { - southScore += towardsPlayer; - } else { - southScore -= towardsPlayer; - } - } - if (status != Status.EDIBLE && candidate == playerDirection) { - southScore += 10; - } - if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { - southScore = Integer.MIN_VALUE; - } - if (status == Status.CAGED) { - ++northScore; - } - Direction result = direction; - int score = Integer.MIN_VALUE; - if (eastScore > score) { - result = Direction.EAST; - score = eastScore; - } - if (northScore > score) { - result = Direction.NORTH; - score = northScore; - } - if (westScore > score) { - result = Direction.WEST; - score = westScore; - } - if (southScore > score) { - result = Direction.SOUTH; - score = southScore; - } - return result; - } + public static Direction turn(Status status, int gridX, int gridY, Direction direction, int playerGridX, int playerGridY, + Direction playerDirection, boolean eastBlocked, boolean northBlocked, boolean westBlocked, boolean southBlocked) { + int reverse = (direction.ordinal() + 2) % 4; + int dx = playerGridX - gridX; + int dy = playerGridY - gridY; + boolean[] blocked = { eastBlocked, northBlocked, westBlocked, southBlocked }; + Direction candidate; + candidate = Direction.EAST; + int eastScore = 0; + if (status == Status.CAGED && candidate == playerDirection) { + eastScore = 1; + } else { + int towardsPlayer = Math.max( + dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], + 0); + if (status == Status.HUNTING) { + eastScore += towardsPlayer; + } else { + eastScore -= towardsPlayer; + } + } + if (status != Status.EDIBLE && candidate == playerDirection) { + eastScore += 10; + } + if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { + eastScore = Integer.MIN_VALUE; + } + candidate = Direction.NORTH; + int northScore = 0; + if (status == Status.CAGED && candidate == playerDirection) { + northScore = 1; + } else { + int towardsPlayer = Math.max( + dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], + 0); + if (status == Status.HUNTING) { + northScore += towardsPlayer; + } else { + northScore -= towardsPlayer; + } + } + if (status != Status.EDIBLE && candidate == playerDirection) { + northScore += 10; + } + if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { + northScore = Integer.MIN_VALUE; + } + candidate = Direction.WEST; + int westScore = 0; + if (status == Status.CAGED && candidate == playerDirection) { + westScore = 1; + } else { + int towardsPlayer = Math.max( + dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], + 0); + if (status == Status.HUNTING) { + westScore += towardsPlayer; + } else { + westScore -= towardsPlayer; + } + } + if (status != Status.EDIBLE && candidate == playerDirection) { + westScore += 10; + } + if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { + westScore = Integer.MIN_VALUE; + } + candidate = Direction.SOUTH; + int southScore = 0; + if (status == Status.CAGED && candidate == playerDirection) { + southScore = 1; + } else { + int towardsPlayer = Math.max( + dx * Constants.DIRECTION_X_COMPONENTS[candidate.ordinal()] + dy * Constants.DIRECTION_Y_COMPONENTS[candidate.ordinal()], + 0); + if (status == Status.HUNTING) { + southScore += towardsPlayer; + } else { + southScore -= towardsPlayer; + } + } + if (status != Status.EDIBLE && candidate == playerDirection) { + southScore += 10; + } + if (candidate.ordinal() == reverse || blocked[candidate.ordinal()]) { + southScore = Integer.MIN_VALUE; + } + if (status == Status.CAGED) { + ++northScore; + } + Direction result = direction; + int score = Integer.MIN_VALUE; + if (eastScore > score) { + result = Direction.EAST; + score = eastScore; + } + if (northScore > score) { + result = Direction.NORTH; + score = northScore; + } + if (westScore > score) { + result = Direction.WEST; + score = westScore; + } + if (southScore > score) { + result = Direction.SOUTH; + score = southScore; + } + return result; + } - private boolean isDoor(int gridX, int gridY) { - int square = maze.grid[gridY][gridX]; - return square == Maze.DOOR; - } + private boolean isDoor(int gridX, int gridY) { + int square = maze.grid[gridY][gridX]; + return square == Maze.DOOR; + } - private boolean isBlocked(int gridX, int gridY) { - int square = maze.grid[gridY][gridX]; - return square == Maze.WALL || square == Maze.DOOR && status != Status.CAGED; - } + private boolean isBlocked(int gridX, int gridY) { + int square = maze.grid[gridY][gridX]; + return square == Maze.WALL || square == Maze.DOOR && status != Status.CAGED; + } - private void move(int playerX, int playerY, Direction playerDirection) { - if (x % 16 == 0 && y % 16 == 0) { - int gridX = x / 16; - int gridY = y / 16; - if (status == Status.CAGED && isDoor(gridX, gridY)) { - status = Status.HUNTING; - } - direction = turn(status, gridX, gridY, direction, playerX / 16, playerY / 16, playerDirection, - isBlocked(gridX + 1, gridY), isBlocked(gridX, gridY - 1), isBlocked(gridX - 1, gridY), - isBlocked(gridX, gridY + 1)); - } - int travelRate = (status == Status.EATEN) ? 2 : 1; - x += travelRate * Constants.DIRECTION_X_COMPONENTS[direction.ordinal()]; - y += travelRate * Constants.DIRECTION_Y_COMPONENTS[direction.ordinal()]; + private void move(int playerX, int playerY, Direction playerDirection) { + if (x % 16 == 0 && y % 16 == 0) { + int gridX = x / 16; + int gridY = y / 16; + if (status == Status.CAGED && isDoor(gridX, gridY)) { + status = Status.HUNTING; + } + direction = turn(status, gridX, gridY, direction, playerX / 16, playerY / 16, playerDirection, + isBlocked(gridX + 1, gridY), isBlocked(gridX, gridY - 1), isBlocked(gridX - 1, gridY), + isBlocked(gridX, gridY + 1)); + } + int travelRate = (status == Status.EATEN) ? 2 : 1; + x += travelRate * Constants.DIRECTION_X_COMPONENTS[direction.ordinal()]; + y += travelRate * Constants.DIRECTION_Y_COMPONENTS[direction.ordinal()]; - } + } - public void tick(int playerX, int playerY, int playerDirection) { - if (status == Status.EDIBLE || status == Status.EATEN) { - --edibilityRemaining; - if (edibilityRemaining == 0) { - status = Status.HUNTING; - } - } - if (status == Status.EDIBLE) { - blinking = edibilityRemaining < edibilityDuration / 3; - } - if (speed.isMove() && (status != Status.EDIBLE || edibilityRemaining % 2 == 0)) { - move(playerX, playerY, Direction.values()[playerDirection]); - } - } + public void tick(int playerX, int playerY, int playerDirection) { + if (status == Status.EDIBLE || status == Status.EATEN) { + --edibilityRemaining; + if (edibilityRemaining == 0) { + status = Status.HUNTING; + } + } + if (status == Status.EDIBLE) { + blinking = edibilityRemaining < edibilityDuration / 3; + } + if (speed.isMove() && (status != Status.EDIBLE || edibilityRemaining % 2 == 0)) { + move(playerX, playerY, Direction.values()[playerDirection]); + } + } - public void makeEdible() { - if (status == Status.EDIBLE || status == Status.HUNTING) { - status = Status.EDIBLE; - edibilityRemaining = edibilityDuration; - blinking = false; - // reverse - if (x % 16 != 0 || y % 16 != 0) { - direction = Direction.values()[Constants.iBack[direction.ordinal()]]; - // a special condition: - // when ghost is leaving home, it can not go back - // while becoming edible - int square; - square = maze.grid[y / 16 + Constants.DIRECTION_Y_COMPONENTS[direction.ordinal()]][x / 16 - + Constants.DIRECTION_X_COMPONENTS[direction.ordinal()]]; - if (square == Maze.DOOR) - direction = Direction.values()[Constants.iBack[direction.ordinal()]]; - } - } - } + public void makeEdible() { + if (status == Status.EDIBLE || status == Status.HUNTING) { + status = Status.EDIBLE; + edibilityRemaining = edibilityDuration; + blinking = false; + // reverse + if (x % 16 != 0 || y % 16 != 0) { + direction = Direction.values()[Constants.iBack[direction.ordinal()]]; + // a special condition: + // when ghost is leaving home, it can not go back + // while becoming edible + int square; + square = maze.grid[y / 16 + Constants.DIRECTION_Y_COMPONENTS[direction.ordinal()]][x / 16 + + Constants.DIRECTION_X_COMPONENTS[direction.ordinal()]]; + if (square == Maze.DOOR) + direction = Direction.values()[Constants.iBack[direction.ordinal()]]; + } + } + } - // return 1 if caught the pac! - // return 2 if being caught by pac - public int testCollision(int playerX, int playerY) { - if (x <= playerX + 2 && x >= playerX - 2 && y <= playerY + 2 && y >= playerY - 2) { - switch (status) { - case HUNTING: - return 1; - case EDIBLE: - status = Status.EATEN; - x = x / 4 * 4; - y = y / 4 * 4; - return 2; - default: - break; - } - } - // nothing - return 0; - } + // return 1 if caught the pac! + // return 2 if being caught by pac + public int testCollision(int playerX, int playerY) { + if (x <= playerX + 2 && x >= playerX - 2 && y <= playerY + 2 && y >= playerY - 2) { + switch (status) { + case HUNTING: + return 1; + case EDIBLE: + status = Status.EATEN; + x = x / 4 * 4; + y = y / 4 * 4; + return 2; + default: + break; + } + } + // nothing + return 0; + } } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Image.java b/src/main/java/edu/unl/cse/soft160/pacman/Image.java index ff0bb6a..37dca01 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Image.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Image.java @@ -22,171 +22,171 @@ package edu.unl.cse.soft160.pacman; import java.awt.*; public class Image { - public static void drawDot(java.awt.Image img) { - Graphics g = img.getGraphics(); - g.setColor(Color.yellow); - g.drawRect(0, 0, 2, 2); - g.dispose(); - } + public static void drawDot(java.awt.Image img) { + Graphics g = img.getGraphics(); + g.setColor(Color.yellow); + g.drawRect(0, 0, 2, 2); + g.dispose(); + } - public static void drawPowerDot(java.awt.Image img) { - Graphics g = img.getGraphics(); - g.setColor(Color.black); - g.fillRect(0, 0, 16, 16); - g.setColor(Color.yellow); - int iCounter = 0; - short mask = 0x01; - for (int i = 0; i < 16; i++) - for (int j = 0; j < 16; j++) { - if ((power_bits[iCounter] & mask) != 0) - g.fillRect(j, i, 1, 1); - mask <<= 1; - if ((mask & 0xff) == 0) { - mask = 0x01; - iCounter++; - } - } - g.dispose(); - } + public static void drawPowerDot(java.awt.Image img) { + Graphics g = img.getGraphics(); + g.setColor(Color.black); + g.fillRect(0, 0, 16, 16); + g.setColor(Color.yellow); + int iCounter = 0; + short mask = 0x01; + for (int i = 0; i < 16; i++) + for (int j = 0; j < 16; j++) { + if ((power_bits[iCounter] & mask) != 0) + g.fillRect(j, i, 1, 1); + mask <<= 1; + if ((mask & 0xff) == 0) { + mask = 0x01; + iCounter++; + } + } + g.dispose(); + } - public static void drawPac(java.awt.Image img, int dir, int step) { - Graphics g = img.getGraphics(); - g.setColor(Color.black); - g.fillRect(0, 0, 18, 18); - g.setColor(Color.yellow); - int iCounter = 0; - short mask = 0x01; - for (int i = 0; i < 16; i++) - for (int j = 0; j < 16; j++) { - if ((pac_bits[dir][step][iCounter] & mask) != 0) - g.fillRect(j + 1, i + 1, 1, 1); - mask <<= 1; - if ((mask & 0xff) == 0) { - mask = 0x01; - iCounter++; - } - } - g.dispose(); - } + public static void drawPac(java.awt.Image img, int dir, int step) { + Graphics g = img.getGraphics(); + g.setColor(Color.black); + g.fillRect(0, 0, 18, 18); + g.setColor(Color.yellow); + int iCounter = 0; + short mask = 0x01; + for (int i = 0; i < 16; i++) + for (int j = 0; j < 16; j++) { + if ((pac_bits[dir][step][iCounter] & mask) != 0) + g.fillRect(j + 1, i + 1, 1, 1); + mask <<= 1; + if ((mask & 0xff) == 0) { + mask = 0x01; + iCounter++; + } + } + g.dispose(); + } - public static void drawGhost(java.awt.Image img, int number, Color color) { - Graphics g = img.getGraphics(); - g.setColor(Color.black); - g.fillRect(0, 0, 18, 18); - g.setColor(color); - int iCounter = 0; - short mask = 0x01; - for (int i = 0; i < 16; i++) - for (int j = 0; j < 16; j++) { - if ((ghost_bits[number][iCounter] & mask) != 0) - g.fillRect(j + 1, i + 1, 1, 1); - mask <<= 1; - if ((mask & 0xff) == 0) { - mask = 0x01; - iCounter++; - } - } - g.dispose(); - } + public static void drawGhost(java.awt.Image img, int number, Color color) { + Graphics g = img.getGraphics(); + g.setColor(Color.black); + g.fillRect(0, 0, 18, 18); + g.setColor(color); + int iCounter = 0; + short mask = 0x01; + for (int i = 0; i < 16; i++) + for (int j = 0; j < 16; j++) { + if ((ghost_bits[number][iCounter] & mask) != 0) + g.fillRect(j + 1, i + 1, 1, 1); + mask <<= 1; + if ((mask & 0xff) == 0) { + mask = 0x01; + iCounter++; + } + } + g.dispose(); + } - // ////////////////////////////////////////////////////////////////////////////// - // image arrays - // ////////////////////////////////////////////////////////////////////////////// + // ////////////////////////////////////////////////////////////////////////////// + // image arrays + // ////////////////////////////////////////////////////////////////////////////// - static final short[][][] pac_bits = { // [4][4][32] - // right - { - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x0f, 0xfe, 0x07, 0xfe, - 0x03, 0xff, 0x01, 0xff, 0x00, 0x7f, 0x00, 0x7f, - 0x00, 0xff, 0x00, 0xff, 0x01, 0xfe, 0x03, 0xfe, - 0x07, 0xfc, 0x0f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x3f, 0xff, 0x0f, 0xff, 0x03, 0xff, 0x00, 0xff, - 0x00, 0xff, 0x03, 0xff, 0x0f, 0xfe, 0x3f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0x1f, 0xff, 0x01, 0xff, - 0x01, 0xff, 0x1f, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07},}, - // up - { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, - 0x60, 0x0f, 0xf0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0x00, 0x00, 0x08, 0x10, 0x1c, 0x38, 0x1e, 0x78, 0x3e, - 0x7c, 0x3f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0x20, 0x04, 0x38, 0x1c, 0x3c, 0x3c, 0x7e, 0x7e, 0x7e, - 0x7e, 0x7f, 0xfe, 0x7f, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}}, - // left - { - {0xe0, 0x07, 0xf8, 0x1f, 0xf0, 0x3f, 0xe0, 0x7f, 0xc0, - 0x7f, 0x80, 0xff, 0x00, 0xff, 0x00, 0xfe, 0x00, - 0xfe, 0x00, 0xff, 0x80, 0xff, 0xc0, 0x7f, 0xe0, - 0x7f, 0xf0, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfc, - 0x7f, 0xf0, 0xff, 0xc0, 0xff, 0x00, 0xff, 0x00, - 0xff, 0xc0, 0xff, 0xf0, 0xff, 0xfc, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xf8, 0xff, 0x80, 0xff, 0x80, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}}, - // down - { - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, - 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x06, 0x60, 0x02, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, 0x3e, 0x7c, 0x1e, - 0x78, 0x1c, 0x38, 0x08, 0x10, 0x00, 0x00}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xfe, 0x7f, 0xfe, 0x7e, 0x7e, 0x7e, - 0x7e, 0x3c, 0x3c, 0x38, 0x1c, 0x20, 0x04}, - {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}}}; + static final short[][][] pac_bits = { // [4][4][32] + // right + { + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x0f, 0xfe, 0x07, 0xfe, + 0x03, 0xff, 0x01, 0xff, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0xff, 0x00, 0xff, 0x01, 0xfe, 0x03, 0xfe, + 0x07, 0xfc, 0x0f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x3f, 0xff, 0x0f, 0xff, 0x03, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x03, 0xff, 0x0f, 0xfe, 0x3f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0x1f, 0xff, 0x01, 0xff, + 0x01, 0xff, 0x1f, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07},}, + // up + { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, + 0x60, 0x0f, 0xf0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0x00, 0x00, 0x08, 0x10, 0x1c, 0x38, 0x1e, 0x78, 0x3e, + 0x7c, 0x3f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0x20, 0x04, 0x38, 0x1c, 0x3c, 0x3c, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0xfe, 0x7f, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}}, + // left + { + {0xe0, 0x07, 0xf8, 0x1f, 0xf0, 0x3f, 0xe0, 0x7f, 0xc0, + 0x7f, 0x80, 0xff, 0x00, 0xff, 0x00, 0xfe, 0x00, + 0xfe, 0x00, 0xff, 0x80, 0xff, 0xc0, 0x7f, 0xe0, + 0x7f, 0xf0, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfc, + 0x7f, 0xf0, 0xff, 0xc0, 0xff, 0x00, 0xff, 0x00, + 0xff, 0xc0, 0xff, 0xf0, 0xff, 0xfc, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xf8, 0xff, 0x80, 0xff, 0x80, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}}, + // down + { + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, + 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x06, 0x60, 0x02, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, 0x3e, 0x7c, 0x1e, + 0x78, 0x1c, 0x38, 0x08, 0x10, 0x00, 0x00}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfe, 0x7f, 0xfe, 0x7e, 0x7e, 0x7e, + 0x7e, 0x3c, 0x3c, 0x38, 0x1c, 0x20, 0x04}, + {0xe0, 0x07, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xe0, 0x07}}}; - static final short[][] ghost_bits = { // [3][32] - {0xe0, 0x07, 0xf8, 0x1f, 0xcc, 0x33, 0xbc, 0x3d, 0xfe, 0x7f, 0xde, - 0x7b, 0x8e, 0x71, 0x9e, 0x79, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, - 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0x76, 0x6e, 0x76, 0x6e, 0x24, - 0x24}, - {0xe0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x04, 0x20, 0x32, 0x4c, 0x4a, - 0x52, 0x8a, 0x51, 0x8a, 0x51, 0x72, 0x4e, 0x02, 0x40, 0x02, - 0x40, 0x02, 0x40, 0x8a, 0x51, 0x56, 0x6a, 0x52, 0x4a, 0x24, - 0x24}, - // blind - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x48, - 0x12, 0x88, 0x11, 0x88, 0x11, 0x70, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00}}; + static final short[][] ghost_bits = { // [3][32] + {0xe0, 0x07, 0xf8, 0x1f, 0xcc, 0x33, 0xbc, 0x3d, 0xfe, 0x7f, 0xde, + 0x7b, 0x8e, 0x71, 0x9e, 0x79, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, + 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0x76, 0x6e, 0x76, 0x6e, 0x24, + 0x24}, + {0xe0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x04, 0x20, 0x32, 0x4c, 0x4a, + 0x52, 0x8a, 0x51, 0x8a, 0x51, 0x72, 0x4e, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x8a, 0x51, 0x56, 0x6a, 0x52, 0x4a, 0x24, + 0x24}, + // blind + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x48, + 0x12, 0x88, 0x11, 0x88, 0x11, 0x70, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00}}; - static final short[] power_bits = - // [32] - // show - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, - 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x0f, 0xe0, - 0x07, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + static final short[] power_bits = + // [32] + // show + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, + 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x0f, 0xe0, + 0x07, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Interface.java b/src/main/java/edu/unl/cse/soft160/pacman/Interface.java index ae92602..937331f 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Interface.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Interface.java @@ -22,121 +22,121 @@ package edu.unl.cse.soft160.pacman; import java.awt.*; public class Interface { - // frames to wait after eaten a dot - final int DOT_WAIT = 4; - - int iDotWait; - - // current position - int iX, iY; - // current direction - int iDir; - - // the applet this object is associated to - Window applet; - Graphics graphics; - - // the pac image - java.awt.Image[][] imagePac; - - // the knowledge of the maze - Maze maze; - - // the knowledge of the power dots - PowerDot powerDot; - - Interface(Window a, Graphics g, Maze m, PowerDot p) { - applet = a; - graphics = g; - maze = m; - powerDot = p; - - // initialize pac and pac image - imagePac = new java.awt.Image[4][4]; - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) { - imagePac[i][j] = applet.createImage(18, 18); - Image.drawPac(imagePac[i][j], i, j); - } - } - - public void start() { - iX = 10 * 16; - iY = 10 * 16; - iDir = 1; // downward, illegal and won't move - iDotWait = 0; - } - - public void draw() { - maze.DrawDot(iX / 16, iY / 16); - maze.DrawDot(iX / 16 + (iX % 16 > 0 ? 1 : 0), iY / 16 - + (iY % 16 > 0 ? 1 : 0)); - - int iImageStep = (iX % 16 + iY % 16) / 2; // determine shape of PAc - if (iImageStep < 4) - iImageStep = 3 - iImageStep; - else - iImageStep -= 4; - graphics.drawImage(imagePac[iDir][iImageStep], iX - 1, iY - 1, applet); - } - - // return 1 if eat a dot - // return 2 if eat power dot - public int move(int iNextDir) { - int eaten = 0; - - // iNextDir=cAuto.GetNextDir(); - - if (iNextDir != -1 && iNextDir != iDir) // not set or same - // change direction - { - if (iX % 16 != 0 || iY % 16 != 0) { - // only check go back - if (iNextDir % 2 == iDir % 2) - iDir = iNextDir; - } else // need to see whether ahead block is OK - { - if (mazeOK( - iX / 16 + Constants.DIRECTION_X_COMPONENTS[iNextDir], - iY / 16 + Constants.DIRECTION_Y_COMPONENTS[iNextDir])) { - iDir = iNextDir; - iNextDir = -1; - } - } - } - if (iX % 16 == 0 && iY % 16 == 0) { - - // see whether has eaten something - switch (maze.grid[iY / 16][iX / 16]) { - case Maze.DOT : - eaten = 1; - maze.grid[iY / 16][iX / 16] = Maze.BLANK; // eat dot - maze.iTotalDotcount--; - iDotWait = DOT_WAIT; - break; - case Maze.POWER_DOT : - eaten = 2; - powerDot.eat(iX / 16, iY / 16); - maze.grid[iY / 16][iX / 16] = Maze.BLANK; - break; - } - - if (maze.grid[iY / 16 + Constants.DIRECTION_Y_COMPONENTS[iDir]][iX - / 16 + Constants.DIRECTION_X_COMPONENTS[iDir]] == 1) { - return (eaten); // not valid move - } - } - if (iDotWait == 0) { - iX += Constants.DIRECTION_X_COMPONENTS[iDir]; - iY += Constants.DIRECTION_Y_COMPONENTS[iDir]; - } else - iDotWait--; - return (eaten); - } - - boolean mazeOK(int iRow, int icol) { - if ((maze.grid[icol][iRow] & (Maze.WALL | Maze.DOOR)) == 0) - return (true); - return (false); - } + // frames to wait after eaten a dot + final int DOT_WAIT = 4; + + int iDotWait; + + // current position + int iX, iY; + // current direction + int iDir; + + // the applet this object is associated to + Window applet; + Graphics graphics; + + // the pac image + java.awt.Image[][] imagePac; + + // the knowledge of the maze + Maze maze; + + // the knowledge of the power dots + PowerDot powerDot; + + Interface(Window a, Graphics g, Maze m, PowerDot p) { + applet = a; + graphics = g; + maze = m; + powerDot = p; + + // initialize pac and pac image + imagePac = new java.awt.Image[4][4]; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) { + imagePac[i][j] = applet.createImage(18, 18); + Image.drawPac(imagePac[i][j], i, j); + } + } + + public void start() { + iX = 10 * 16; + iY = 10 * 16; + iDir = 1; // downward, illegal and won't move + iDotWait = 0; + } + + public void draw() { + maze.DrawDot(iX / 16, iY / 16); + maze.DrawDot(iX / 16 + (iX % 16 > 0 ? 1 : 0), iY / 16 + + (iY % 16 > 0 ? 1 : 0)); + + int iImageStep = (iX % 16 + iY % 16) / 2; // determine shape of PAc + if (iImageStep < 4) + iImageStep = 3 - iImageStep; + else + iImageStep -= 4; + graphics.drawImage(imagePac[iDir][iImageStep], iX - 1, iY - 1, applet); + } + + // return 1 if eat a dot + // return 2 if eat power dot + public int move(int iNextDir) { + int eaten = 0; + + // iNextDir=cAuto.GetNextDir(); + + if (iNextDir != -1 && iNextDir != iDir) // not set or same + // change direction + { + if (iX % 16 != 0 || iY % 16 != 0) { + // only check go back + if (iNextDir % 2 == iDir % 2) + iDir = iNextDir; + } else // need to see whether ahead block is OK + { + if (mazeOK( + iX / 16 + Constants.DIRECTION_X_COMPONENTS[iNextDir], + iY / 16 + Constants.DIRECTION_Y_COMPONENTS[iNextDir])) { + iDir = iNextDir; + iNextDir = -1; + } + } + } + if (iX % 16 == 0 && iY % 16 == 0) { + + // see whether has eaten something + switch (maze.grid[iY / 16][iX / 16]) { + case Maze.DOT : + eaten = 1; + maze.grid[iY / 16][iX / 16] = Maze.BLANK; // eat dot + maze.iTotalDotcount--; + iDotWait = DOT_WAIT; + break; + case Maze.POWER_DOT : + eaten = 2; + powerDot.eat(iX / 16, iY / 16); + maze.grid[iY / 16][iX / 16] = Maze.BLANK; + break; + } + + if (maze.grid[iY / 16 + Constants.DIRECTION_Y_COMPONENTS[iDir]][iX + / 16 + Constants.DIRECTION_X_COMPONENTS[iDir]] == 1) { + return (eaten); // not valid move + } + } + if (iDotWait == 0) { + iX += Constants.DIRECTION_X_COMPONENTS[iDir]; + iY += Constants.DIRECTION_Y_COMPONENTS[iDir]; + } else + iDotWait--; + return (eaten); + } + + boolean mazeOK(int iRow, int icol) { + if ((maze.grid[icol][iRow] & (Maze.WALL | Maze.DOOR)) == 0) + return (true); + return (false); + } } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Maze.java b/src/main/java/edu/unl/cse/soft160/pacman/Maze.java index ead2a6a..09d1dcf 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Maze.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Maze.java @@ -24,286 +24,286 @@ import java.awt.*; /* define the maze */ public class Maze { - // constant definitions - static final int BLANK = 0; - static final int WALL = 1; - static final int DOOR = 2; - static final int DOT = 4; - static final int POWER_DOT = 8; - - static final int HEIGHT = 16; - static final int WIDTH = 21; - - static final int height = HEIGHT * 16; - static final int width = WIDTH * 16; - - // the applet the object associate with - Window applet; - // the graphics it will be using - Graphics graphics; - - // the maze image - java.awt.Image imageMaze; - - // the dot image - java.awt.Image imageDot; - - // total dots left - int iTotalDotcount; - - // the status of maze - int[][] grid; - - // initialize the maze - Maze(Window a, Graphics g) { - // setup associations - applet = a; - graphics = g; - - imageMaze = applet.createImage(width, height); - imageDot = applet.createImage(2, 2); - - // create data - grid = new int[HEIGHT][WIDTH]; - } - - public void start() { - int i, j, k; - iTotalDotcount = 0; - for (i = 0; i < HEIGHT; i++) - for (j = 0; j < WIDTH; j++) { - switch (Constants.MazeDefine[i].charAt(j)) { - case ' ' : - k = BLANK; - break; - case 'X' : - k = WALL; - break; - case '.' : - k = DOT; - iTotalDotcount++; - break; - case 'O' : - k = POWER_DOT; - break; - case '-' : - k = DOOR; - break; - default : - k = DOT; - iTotalDotcount++; - break; - } - grid[i][j] = k; - } - // create initial maze image - createImage(); - } - - public void draw() { - graphics.drawImage(imageMaze, 0, 0, applet); - drawDots(); - } - - void drawDots() // on the offscreen - { - int i, j; - - for (i = 0; i < HEIGHT; i++) - for (j = 0; j < WIDTH; j++) { - if (grid[i][j] == DOT) - graphics.drawImage(imageDot, j * 16 + 7, i * 16 + 7, applet); - } - } - - void createImage() { - // create the image of a dot - Image.drawDot(imageDot); - - // create the image of the maze - Graphics gmaze = imageMaze.getGraphics(); - - // background - gmaze.setColor(Color.black); - gmaze.fillRect(0, 0, width, height); - - DrawWall(gmaze); - } - - public void DrawDot(int icol, int iRow) { - if (grid[iRow][icol] == DOT) - graphics.drawImage(imageDot, icol * 16 + 7, iRow * 16 + 7, applet); - } - - void DrawWall(Graphics g) { - int i, j; - int iDir; - - g.setColor(Color.green); - - for (i = 0; i < HEIGHT; i++) { - for (j = 0; j < WIDTH; j++) { - for (iDir = Direction.EAST.ordinal(); iDir <= Direction.SOUTH.ordinal(); iDir++) { - if (grid[i][j] == DOOR) { - g.drawLine(j * 16, i * 16 + 8, j * 16 + 16, i * 16 + 8); - continue; - } - if (grid[i][j] != WALL) - continue; - switch (Direction.values()[iDir]) { - case NORTH : - if (i == 0) - break; - if (grid[i - 1][j] == WALL) - break; - DrawBoundary(g, j, i - 1, Direction.SOUTH.ordinal()); - break; - case EAST : - if (j == WIDTH - 1) - break; - if (grid[i][j + 1] == WALL) - break; - DrawBoundary(g, j + 1, i, Direction.WEST.ordinal()); - break; - case SOUTH : - if (i == HEIGHT - 1) - break; - if (grid[i + 1][j] == WALL) - break; - DrawBoundary(g, j, i + 1, Direction.NORTH.ordinal()); - break; - case WEST : - if (j == 0) - break; - if (grid[i][j - 1] == WALL) - break; - DrawBoundary(g, j - 1, i, Direction.EAST.ordinal()); - break; - default : - } - } - } - } - } - - void DrawBoundary(Graphics g, int col, int row, int iDir) { - int x, y; - - x = col * 16; - y = row * 16; - - switch (Direction.values()[iDir]) { - case WEST : - // draw lower half segment - if (grid[row + 1][col] != WALL) - // down empty - if (grid[row + 1][col - 1] != WALL) - // left-down empty - { - g.drawArc(x - 8 - 6, y + 8 - 6, 12, 12, 270, 100); - } else { - g.drawLine(x - 2, y + 8, x - 2, y + 16); - } - else { - g.drawLine(x - 2, y + 8, x - 2, y + 17); - g.drawLine(x - 2, y + 17, x + 7, y + 17); - } - - // Draw upper half segment - if (grid[row - 1][col] != WALL) - // upper empty - if (grid[row - 1][col - 1] != WALL) - // upper-left empty - { - g.drawArc(x - 8 - 6, y + 7 - 6, 12, 12, 0, 100); - } else { - g.drawLine(x - 2, y, x - 2, y + 7); - } - else { - g.drawLine(x - 2, y - 2, x - 2, y + 7); - g.drawLine(x - 2, y - 2, x + 7, y - 2); - } - break; - - case EAST : - // draw lower half segment - if (grid[row + 1][col] != WALL) - // down empty - if (grid[row + 1][col + 1] != WALL) - // down-right empty - { - g.drawArc(x + 16 + 7 - 6, y + 8 - 6, 12, 12, 180, 100); - } else { - g.drawLine(x + 17, y + 8, x + 17, y + 15); - } - else { - g.drawLine(x + 8, y + 17, x + 17, y + 17); - g.drawLine(x + 17, y + 8, x + 17, y + 17); - } - // Draw upper half segment - if (grid[row - 1][col] != WALL) - // upper empty - if (grid[row - 1][col + 1] != WALL) - // upper-right empty - { - g.drawArc(x + 16 + 7 - 6, y + 7 - 6, 12, 12, 90, 100); - } else { - g.drawLine(x + 17, y, x + 17, y + 7); - } - else { - g.drawLine(x + 8, y - 2, x + 17, y - 2); - g.drawLine(x + 17, y - 2, x + 17, y + 7); - } - break; - - case NORTH : - // draw left half segment - if (grid[row][col - 1] != WALL) - // left empty - if (grid[row - 1][col - 1] != WALL) - // left-upper empty - { - g.drawArc(x + 7 - 6, y - 8 - 6, 12, 12, 180, 100); - } else { - g.drawLine(x, y - 2, x + 7, y - 2); - } - - // Draw right half segment - if (grid[row][col + 1] != WALL) - // right empty - if (grid[row - 1][col + 1] != WALL) - // right-upper empty - { - g.drawArc(x + 8 - 6, y - 8 - 6, 12, 12, 270, 100); - } else { - g.drawLine(x + 8, y - 2, x + 16, y - 2); - } - break; - - case SOUTH : - // draw left half segment - if (grid[row][col - 1] != WALL) - // left empty - if (grid[row + 1][col - 1] != WALL) - // left-down empty - { - g.drawArc(x + 7 - 6, y + 16 + 7 - 6, 12, 12, 90, 100); - } else { - g.drawLine(x, y + 17, x + 7, y + 17); - } - - // Draw right half segment - if (grid[row][col + 1] != WALL) - // right empty - if (grid[row + 1][col + 1] != WALL) - // right-down empty - { - g.drawArc(x + 8 - 6, y + 16 + 7 - 6, 12, 12, 0, 100); - } else { - g.drawLine(x + 8, y + 17, x + 15, y + 17); - } - break; - } - } + // constant definitions + static final int BLANK = 0; + static final int WALL = 1; + static final int DOOR = 2; + static final int DOT = 4; + static final int POWER_DOT = 8; + + static final int HEIGHT = 16; + static final int WIDTH = 21; + + static final int height = HEIGHT * 16; + static final int width = WIDTH * 16; + + // the applet the object associate with + Window applet; + // the graphics it will be using + Graphics graphics; + + // the maze image + java.awt.Image imageMaze; + + // the dot image + java.awt.Image imageDot; + + // total dots left + int iTotalDotcount; + + // the status of maze + int[][] grid; + + // initialize the maze + Maze(Window a, Graphics g) { + // setup associations + applet = a; + graphics = g; + + imageMaze = applet.createImage(width, height); + imageDot = applet.createImage(2, 2); + + // create data + grid = new int[HEIGHT][WIDTH]; + } + + public void start() { + int i, j, k; + iTotalDotcount = 0; + for (i = 0; i < HEIGHT; i++) + for (j = 0; j < WIDTH; j++) { + switch (Constants.MazeDefine[i].charAt(j)) { + case ' ' : + k = BLANK; + break; + case 'X' : + k = WALL; + break; + case '.' : + k = DOT; + iTotalDotcount++; + break; + case 'O' : + k = POWER_DOT; + break; + case '-' : + k = DOOR; + break; + default : + k = DOT; + iTotalDotcount++; + break; + } + grid[i][j] = k; + } + // create initial maze image + createImage(); + } + + public void draw() { + graphics.drawImage(imageMaze, 0, 0, applet); + drawDots(); + } + + void drawDots() // on the offscreen + { + int i, j; + + for (i = 0; i < HEIGHT; i++) + for (j = 0; j < WIDTH; j++) { + if (grid[i][j] == DOT) + graphics.drawImage(imageDot, j * 16 + 7, i * 16 + 7, applet); + } + } + + void createImage() { + // create the image of a dot + Image.drawDot(imageDot); + + // create the image of the maze + Graphics gmaze = imageMaze.getGraphics(); + + // background + gmaze.setColor(Color.black); + gmaze.fillRect(0, 0, width, height); + + DrawWall(gmaze); + } + + public void DrawDot(int icol, int iRow) { + if (grid[iRow][icol] == DOT) + graphics.drawImage(imageDot, icol * 16 + 7, iRow * 16 + 7, applet); + } + + void DrawWall(Graphics g) { + int i, j; + int iDir; + + g.setColor(Color.green); + + for (i = 0; i < HEIGHT; i++) { + for (j = 0; j < WIDTH; j++) { + for (iDir = Direction.EAST.ordinal(); iDir <= Direction.SOUTH.ordinal(); iDir++) { + if (grid[i][j] == DOOR) { + g.drawLine(j * 16, i * 16 + 8, j * 16 + 16, i * 16 + 8); + continue; + } + if (grid[i][j] != WALL) + continue; + switch (Direction.values()[iDir]) { + case NORTH : + if (i == 0) + break; + if (grid[i - 1][j] == WALL) + break; + DrawBoundary(g, j, i - 1, Direction.SOUTH.ordinal()); + break; + case EAST : + if (j == WIDTH - 1) + break; + if (grid[i][j + 1] == WALL) + break; + DrawBoundary(g, j + 1, i, Direction.WEST.ordinal()); + break; + case SOUTH : + if (i == HEIGHT - 1) + break; + if (grid[i + 1][j] == WALL) + break; + DrawBoundary(g, j, i + 1, Direction.NORTH.ordinal()); + break; + case WEST : + if (j == 0) + break; + if (grid[i][j - 1] == WALL) + break; + DrawBoundary(g, j - 1, i, Direction.EAST.ordinal()); + break; + default : + } + } + } + } + } + + void DrawBoundary(Graphics g, int col, int row, int iDir) { + int x, y; + + x = col * 16; + y = row * 16; + + switch (Direction.values()[iDir]) { + case WEST : + // draw lower half segment + if (grid[row + 1][col] != WALL) + // down empty + if (grid[row + 1][col - 1] != WALL) + // left-down empty + { + g.drawArc(x - 8 - 6, y + 8 - 6, 12, 12, 270, 100); + } else { + g.drawLine(x - 2, y + 8, x - 2, y + 16); + } + else { + g.drawLine(x - 2, y + 8, x - 2, y + 17); + g.drawLine(x - 2, y + 17, x + 7, y + 17); + } + + // Draw upper half segment + if (grid[row - 1][col] != WALL) + // upper empty + if (grid[row - 1][col - 1] != WALL) + // upper-left empty + { + g.drawArc(x - 8 - 6, y + 7 - 6, 12, 12, 0, 100); + } else { + g.drawLine(x - 2, y, x - 2, y + 7); + } + else { + g.drawLine(x - 2, y - 2, x - 2, y + 7); + g.drawLine(x - 2, y - 2, x + 7, y - 2); + } + break; + + case EAST : + // draw lower half segment + if (grid[row + 1][col] != WALL) + // down empty + if (grid[row + 1][col + 1] != WALL) + // down-right empty + { + g.drawArc(x + 16 + 7 - 6, y + 8 - 6, 12, 12, 180, 100); + } else { + g.drawLine(x + 17, y + 8, x + 17, y + 15); + } + else { + g.drawLine(x + 8, y + 17, x + 17, y + 17); + g.drawLine(x + 17, y + 8, x + 17, y + 17); + } + // Draw upper half segment + if (grid[row - 1][col] != WALL) + // upper empty + if (grid[row - 1][col + 1] != WALL) + // upper-right empty + { + g.drawArc(x + 16 + 7 - 6, y + 7 - 6, 12, 12, 90, 100); + } else { + g.drawLine(x + 17, y, x + 17, y + 7); + } + else { + g.drawLine(x + 8, y - 2, x + 17, y - 2); + g.drawLine(x + 17, y - 2, x + 17, y + 7); + } + break; + + case NORTH : + // draw left half segment + if (grid[row][col - 1] != WALL) + // left empty + if (grid[row - 1][col - 1] != WALL) + // left-upper empty + { + g.drawArc(x + 7 - 6, y - 8 - 6, 12, 12, 180, 100); + } else { + g.drawLine(x, y - 2, x + 7, y - 2); + } + + // Draw right half segment + if (grid[row][col + 1] != WALL) + // right empty + if (grid[row - 1][col + 1] != WALL) + // right-upper empty + { + g.drawArc(x + 8 - 6, y - 8 - 6, 12, 12, 270, 100); + } else { + g.drawLine(x + 8, y - 2, x + 16, y - 2); + } + break; + + case SOUTH : + // draw left half segment + if (grid[row][col - 1] != WALL) + // left empty + if (grid[row + 1][col - 1] != WALL) + // left-down empty + { + g.drawArc(x + 7 - 6, y + 16 + 7 - 6, 12, 12, 90, 100); + } else { + g.drawLine(x, y + 17, x + 7, y + 17); + } + + // Draw right half segment + if (grid[row][col + 1] != WALL) + // right empty + if (grid[row + 1][col + 1] != WALL) + // right-down empty + { + g.drawArc(x + 8 - 6, y + 16 + 7 - 6, 12, 12, 0, 100); + } else { + g.drawLine(x + 8, y + 17, x + 15, y + 17); + } + break; + } + } } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/PacMan.java b/src/main/java/edu/unl/cse/soft160/pacman/PacMan.java index 224b4ee..30b5b47 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/PacMan.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/PacMan.java @@ -27,508 +27,508 @@ import java.awt.event.*; * the main class of the pacman game */ public class PacMan extends Frame - implements - Runnable, - KeyListener, - WindowListener { - private static final long serialVersionUID = 3582431359568375379L; - // the timer - Thread timer; - int timerPeriod = 12; // in miliseconds - - // the timer will increment this variable to signal a frame - int signalMove = 0; - - // for graphics - final int canvasWidth = 368; - final int canvasHeight = 288 + 1; - - // the canvas starting point within the frame - int topOffset; - int leftOffset; - - // the draw point of maze within the canvas - final int iMazeX = 16; - final int iMazeY = 16; - - // the off screen canvas for the maze - java.awt.Image offScreen; - Graphics offScreenG; - - // the objects - Maze maze; - Interface pac; - PowerDot powerDot; - Ghost[] ghosts; - - // game counters - final int PAcLIVE = 3; - int pacRemain; - int changePacRemain; // to signal redraw remaining pac - - // score - int score; - int hiScore; - int scoreGhost; // score of eat ghost, doubles every time - int changeScore; // signal score change - int changeHiScore; // signal change of hi score - - // score images - java.awt.Image imgScore; - Graphics imgScoreG; - java.awt.Image imgHiScore; - Graphics imgHiScoreG; - - // game status - final int INITIMAGE = 100; // need to wait before paint anything - final int STARTWAIT = 0; // wait before running - final int RUNNING = 1; - final int DEADWAIT = 2; // wait after dead - final int SUSPENDED = 3; // suspended during game - int gameState; - - final int WAITCOUNT = 100; // 100 frames for wait states - int wait; // the counter - - // rounds - int round; // the round of current game; - - // whether it is played in a new maze - boolean newMaze; - - // the direction specified by key - int pacKeyDir; - int key = 0; - final int NONE = 0; - final int SUSPEND = 1; // stop/start - final int BOSS = 2; // boss - - // ////////////////////////////////////////////// - // initialize the object - // only called once at the beginning - // ////////////////////////////////////////////// - public PacMan() { - super("PacMan"); - - // init variables - hiScore = 0; - - gameState = INITIMAGE; - - initGUI(); - - addWindowListener(this); - - addKeyListener(this); - - setSize(canvasWidth, canvasHeight); - - setVisible(true); - } - - void initGUI() { - addNotify(); // for updated inset information - } - - public void initImages() { - // initialize off screen drawing canvas - offScreen = createImage(Maze.width, Maze.height); - if (offScreen == null) - System.out.println("createImage failed"); - offScreenG = offScreen.getGraphics(); - - // initialize maze object - maze = new Maze(this, offScreenG); - - // initialize ghosts object - // 4 ghosts - ghosts = new Ghost[4]; - for (int i = 0; i < 4; i++) { - Color color; - if (i == 0) - color = Color.red; - else if (i == 1) - color = Color.blue; - else if (i == 2) - color = Color.white; - else - color = Color.orange; - ghosts[i] = new Ghost(this, offScreenG, maze, color); - } - - // initialize power dot object - powerDot = new PowerDot(this, offScreenG, ghosts); - - // initialize pac object - pac = new Interface(this, offScreenG, maze, powerDot); - - // initialize the score images - imgScore = createImage(150, 16); - imgScoreG = imgScore.getGraphics(); - imgHiScore = createImage(150, 16); - imgHiScoreG = imgHiScore.getGraphics(); + implements + Runnable, + KeyListener, + WindowListener { + private static final long serialVersionUID = 3582431359568375379L; + // the timer + Thread timer; + int timerPeriod = 12; // in miliseconds + + // the timer will increment this variable to signal a frame + int signalMove = 0; + + // for graphics + final int canvasWidth = 368; + final int canvasHeight = 288 + 1; + + // the canvas starting point within the frame + int topOffset; + int leftOffset; + + // the draw point of maze within the canvas + final int iMazeX = 16; + final int iMazeY = 16; + + // the off screen canvas for the maze + java.awt.Image offScreen; + Graphics offScreenG; + + // the objects + Maze maze; + Interface pac; + PowerDot powerDot; + Ghost[] ghosts; + + // game counters + final int PAcLIVE = 3; + int pacRemain; + int changePacRemain; // to signal redraw remaining pac + + // score + int score; + int hiScore; + int scoreGhost; // score of eat ghost, doubles every time + int changeScore; // signal score change + int changeHiScore; // signal change of hi score + + // score images + java.awt.Image imgScore; + Graphics imgScoreG; + java.awt.Image imgHiScore; + Graphics imgHiScoreG; + + // game status + final int INITIMAGE = 100; // need to wait before paint anything + final int STARTWAIT = 0; // wait before running + final int RUNNING = 1; + final int DEADWAIT = 2; // wait after dead + final int SUSPENDED = 3; // suspended during game + int gameState; + + final int WAITCOUNT = 100; // 100 frames for wait states + int wait; // the counter + + // rounds + int round; // the round of current game; + + // whether it is played in a new maze + boolean newMaze; + + // the direction specified by key + int pacKeyDir; + int key = 0; + final int NONE = 0; + final int SUSPEND = 1; // stop/start + final int BOSS = 2; // boss + + // ////////////////////////////////////////////// + // initialize the object + // only called once at the beginning + // ////////////////////////////////////////////// + public PacMan() { + super("PacMan"); + + // init variables + hiScore = 0; + + gameState = INITIMAGE; + + initGUI(); + + addWindowListener(this); + + addKeyListener(this); + + setSize(canvasWidth, canvasHeight); + + setVisible(true); + } + + void initGUI() { + addNotify(); // for updated inset information + } + + public void initImages() { + // initialize off screen drawing canvas + offScreen = createImage(Maze.width, Maze.height); + if (offScreen == null) + System.out.println("createImage failed"); + offScreenG = offScreen.getGraphics(); + + // initialize maze object + maze = new Maze(this, offScreenG); + + // initialize ghosts object + // 4 ghosts + ghosts = new Ghost[4]; + for (int i = 0; i < 4; i++) { + Color color; + if (i == 0) + color = Color.red; + else if (i == 1) + color = Color.blue; + else if (i == 2) + color = Color.white; + else + color = Color.orange; + ghosts[i] = new Ghost(this, offScreenG, maze, color); + } + + // initialize power dot object + powerDot = new PowerDot(this, offScreenG, ghosts); + + // initialize pac object + pac = new Interface(this, offScreenG, maze, powerDot); + + // initialize the score images + imgScore = createImage(150, 16); + imgScoreG = imgScore.getGraphics(); + imgHiScore = createImage(150, 16); + imgHiScoreG = imgHiScore.getGraphics(); - imgHiScoreG.setColor(Color.black); - imgHiScoreG.fillRect(0, 0, 150, 16); - imgHiScoreG.setColor(Color.red); - imgHiScoreG.setFont(new Font("Helvetica", Font.BOLD, 12)); - imgHiScoreG.drawString("HI SCORE", 0, 14); + imgHiScoreG.setColor(Color.black); + imgHiScoreG.fillRect(0, 0, 150, 16); + imgHiScoreG.setColor(Color.red); + imgHiScoreG.setFont(new Font("Helvetica", Font.BOLD, 12)); + imgHiScoreG.drawString("HI SCORE", 0, 14); - imgScoreG.setColor(Color.black); - imgScoreG.fillRect(0, 0, 150, 16); - imgScoreG.setColor(Color.green); - imgScoreG.setFont(new Font("Helvetica", Font.BOLD, 12)); - imgScoreG.drawString("SCORE", 0, 14); - } + imgScoreG.setColor(Color.black); + imgScoreG.fillRect(0, 0, 150, 16); + imgScoreG.setColor(Color.green); + imgScoreG.setFont(new Font("Helvetica", Font.BOLD, 12)); + imgScoreG.drawString("SCORE", 0, 14); + } - void startTimer() { - // start the timer - timer = new Thread(this); - timer.start(); - } + void startTimer() { + // start the timer + timer = new Thread(this); + timer.start(); + } - void startGame() { - pacRemain = PAcLIVE; - changePacRemain = 1; + void startGame() { + pacRemain = PAcLIVE; + changePacRemain = 1; - score = 0; - changeScore = 1; + score = 0; + changeScore = 1; - newMaze = true; + newMaze = true; - round = 1; - - startRound(); - } - - void startRound() { - // new round for maze? - if (newMaze == true) { - maze.start(); - powerDot.start(); - newMaze = false; - } + round = 1; + + startRound(); + } + + void startRound() { + // new round for maze? + if (newMaze == true) { + maze.start(); + powerDot.start(); + newMaze = false; + } - maze.draw(); // draw maze in off screen buffer - - pac.start(); - pacKeyDir = Direction.SOUTH.ordinal(); - for (int i = 0; i < 4; i++) - ghosts[i].start(i, round); - - gameState = STARTWAIT; - wait = WAITCOUNT; - } - - // ///////////////////////////////////////// - // paint everything - // ///////////////////////////////////////// - public void paint(Graphics g) { - if (gameState == INITIMAGE) { - // System.out.println("first paint(...)..."); - - // init images, must be done after show() because of Graphics - initImages(); - - // set the proper size of canvas - Insets insets = getInsets(); - - topOffset = insets.top; - leftOffset = insets.left; - - setSize(canvasWidth + insets.left + insets.right, canvasHeight - + insets.top + insets.bottom); - - setResizable(false); - - // now we can start timer - startGame(); - - startTimer(); - - } - - g.setColor(Color.black); - g.fillRect(leftOffset, topOffset, canvasWidth, canvasHeight); - - changeScore = 1; - changeHiScore = 1; - changePacRemain = 1; - - paintUpdate(g); - } - - void paintUpdate(Graphics g) { - // updating the frame - - powerDot.draw(); - - for (int i = 0; i < 4; i++) - ghosts[i].draw(); - - pac.draw(); - - // display the offscreen - g.drawImage(offScreen, iMazeX + leftOffset, iMazeY + topOffset, this); - - // display extra information - if (changeHiScore == 1) { - imgHiScoreG.setColor(Color.black); - imgHiScoreG.fillRect(70, 0, 80, 16); - imgHiScoreG.setColor(Color.red); - imgHiScoreG.drawString(Integer.toString(hiScore), 70, 14); - g.drawImage(imgHiScore, 8 + leftOffset, 0 + topOffset, this); - - changeHiScore = 0; - } - - if (changeScore == 1) { - imgScoreG.setColor(Color.black); - imgScoreG.fillRect(70, 0, 80, 16); - imgScoreG.setColor(Color.green); - imgScoreG.drawString(Integer.toString(score), 70, 14); - g.drawImage(imgScore, 158 + leftOffset, 0 + topOffset, this); - - changeScore = 0; - } - - // update pac life info - if (changePacRemain == 1) { - int i; - for (i = 1; i < pacRemain; i++) { - g.drawImage(pac.imagePac[0][0], 16 * i + leftOffset, - canvasHeight - 18 + topOffset, this); - } - g.drawImage(powerDot.imageBlank, 16 * i + leftOffset, canvasHeight - - 17 + topOffset, this); - - changePacRemain = 0; - } - } - - // ////////////////////////////////////////////////////////// - // controls moves - // this is the routine running at the background of drawings - // ////////////////////////////////////////////////////////// - void move() { - int k; - - int oldScore = score; - - for (int i = 0; i < 4; i++) - ghosts[i].tick(pac.iX, pac.iY, pac.iDir); - - k = pac.move(pacKeyDir); - - if (k == 1) // eaten a dot - { - changeScore = 1; - score += 10 * ((round + 1) / 2); - } else if (k == 2) // eaten a powerDot - { - scoreGhost = 200; - } - - if (maze.iTotalDotcount == 0) { - gameState = DEADWAIT; - wait = WAITCOUNT; - newMaze = true; - round++; - return; - } - - for (int i = 0; i < 4; i++) { - k = ghosts[i].testCollision(pac.iX, pac.iY); - if (k == 1) // kill pac - { - pacRemain--; - changePacRemain = 1; - gameState = DEADWAIT; // stop the game - wait = WAITCOUNT; - return; - } else if (k == 2) // caught by pac - { - score += scoreGhost * ((round + 1) / 2); - changeScore = 1; - scoreGhost *= 2; - } - } - - if (score > hiScore) { - hiScore = score; - changeHiScore = 1; - } - - if (changeScore == 1) { - if (score / 10000 - oldScore / 10000 > 0) { - pacRemain++; // bonus - changePacRemain = 1; - } - } - } - - // ///////////////////////////////////////// - // this is the routine draw each frames - // ///////////////////////////////////////// - public void update(Graphics g) { - // System.out.println("update called"); - if (gameState == INITIMAGE) - return; - - // seperate the timer from update - if (signalMove != 0) { - signalMove = 0; - - if (wait != 0) { - wait--; - return; - } - - switch (gameState) { - case STARTWAIT : - gameState = RUNNING; - break; - case RUNNING : - if (key == SUSPEND) - gameState = SUSPENDED; - else - move(); - break; - case DEADWAIT : - if (pacRemain > 0) - startRound(); - else - startGame(); - gameState = STARTWAIT; - wait = WAITCOUNT; - pacKeyDir = Direction.SOUTH.ordinal(); - break; - case SUSPENDED : - if (key == SUSPEND) - gameState = RUNNING; - break; - } - key = NONE; - } - - paintUpdate(g); - } - - // ///////////////////////////////////// - // process key input - // ///////////////////////////////////// - public void keyPressed(KeyEvent e) { - switch (e.getKeyCode()) { - case KeyEvent.VK_RIGHT : - case KeyEvent.VK_L : - pacKeyDir = Direction.EAST.ordinal(); - break; - case KeyEvent.VK_UP : - pacKeyDir = Direction.NORTH.ordinal(); - break; - case KeyEvent.VK_LEFT : - pacKeyDir = Direction.WEST.ordinal(); - break; - case KeyEvent.VK_DOWN : - pacKeyDir = Direction.SOUTH.ordinal(); - break; - case KeyEvent.VK_S : - key = SUSPEND; - break; - case KeyEvent.VK_B : - key = BOSS; - break; - } - } - - public void keyTyped(KeyEvent e) { - } - public void keyReleased(KeyEvent e) { - } - - // ///////////////////////////////////////////////// - // handles window event - // ///////////////////////////////////////////////// - public void windowOpened(WindowEvent e) { - } - - public void windowClosing(WindowEvent e) { - dispose(); - } - - public void windowClosed(WindowEvent e) { - } - - public void windowIconified(WindowEvent e) { - } - - public void windowDeiconified(WindowEvent e) { - } - - public void windowActivated(WindowEvent e) { - } - - public void windowDeactivated(WindowEvent e) { - } - - // /////////////////////////////////////////////// - // the timer - // /////////////////////////////////////////////// - public void run() { - while (true) { - try { - Thread.sleep(timerPeriod); - } catch (InterruptedException e) { - return; - } - - signalMove++; - repaint(); - } - } - - // for applet the check state - boolean finalized = false; - - public void dispose() { - // kill the thread - timer.interrupt(); - - // the off screen canvas - // java.awt.Image offScreen=null; - offScreenG.dispose(); - offScreenG = null; - - // the objects - maze = null; - pac = null; - powerDot = null; - for (int i = 0; i < 4; i++) - ghosts[i] = null; - ghosts = null; - - // score images - imgScore = null; - imgHiScore = null; - imgScoreG.dispose(); - imgScoreG = null; - imgHiScoreG.dispose(); - imgHiScoreG = null; - - super.dispose(); - - finalized = true; - } - - public boolean isFinalized() { - return finalized; - } - - public void setFinalized(boolean finalized) { - this.finalized = finalized; - } - - public static void main(String... arguments) { - new PacMan(); - } + maze.draw(); // draw maze in off screen buffer + + pac.start(); + pacKeyDir = Direction.SOUTH.ordinal(); + for (int i = 0; i < 4; i++) + ghosts[i].start(i, round); + + gameState = STARTWAIT; + wait = WAITCOUNT; + } + + // ///////////////////////////////////////// + // paint everything + // ///////////////////////////////////////// + public void paint(Graphics g) { + if (gameState == INITIMAGE) { + // System.out.println("first paint(...)..."); + + // init images, must be done after show() because of Graphics + initImages(); + + // set the proper size of canvas + Insets insets = getInsets(); + + topOffset = insets.top; + leftOffset = insets.left; + + setSize(canvasWidth + insets.left + insets.right, canvasHeight + + insets.top + insets.bottom); + + setResizable(false); + + // now we can start timer + startGame(); + + startTimer(); + + } + + g.setColor(Color.black); + g.fillRect(leftOffset, topOffset, canvasWidth, canvasHeight); + + changeScore = 1; + changeHiScore = 1; + changePacRemain = 1; + + paintUpdate(g); + } + + void paintUpdate(Graphics g) { + // updating the frame + + powerDot.draw(); + + for (int i = 0; i < 4; i++) + ghosts[i].draw(); + + pac.draw(); + + // display the offscreen + g.drawImage(offScreen, iMazeX + leftOffset, iMazeY + topOffset, this); + + // display extra information + if (changeHiScore == 1) { + imgHiScoreG.setColor(Color.black); + imgHiScoreG.fillRect(70, 0, 80, 16); + imgHiScoreG.setColor(Color.red); + imgHiScoreG.drawString(Integer.toString(hiScore), 70, 14); + g.drawImage(imgHiScore, 8 + leftOffset, 0 + topOffset, this); + + changeHiScore = 0; + } + + if (changeScore == 1) { + imgScoreG.setColor(Color.black); + imgScoreG.fillRect(70, 0, 80, 16); + imgScoreG.setColor(Color.green); + imgScoreG.drawString(Integer.toString(score), 70, 14); + g.drawImage(imgScore, 158 + leftOffset, 0 + topOffset, this); + + changeScore = 0; + } + + // update pac life info + if (changePacRemain == 1) { + int i; + for (i = 1; i < pacRemain; i++) { + g.drawImage(pac.imagePac[0][0], 16 * i + leftOffset, + canvasHeight - 18 + topOffset, this); + } + g.drawImage(powerDot.imageBlank, 16 * i + leftOffset, canvasHeight + - 17 + topOffset, this); + + changePacRemain = 0; + } + } + + // ////////////////////////////////////////////////////////// + // controls moves + // this is the routine running at the background of drawings + // ////////////////////////////////////////////////////////// + void move() { + int k; + + int oldScore = score; + + for (int i = 0; i < 4; i++) + ghosts[i].tick(pac.iX, pac.iY, pac.iDir); + + k = pac.move(pacKeyDir); + + if (k == 1) // eaten a dot + { + changeScore = 1; + score += 10 * ((round + 1) / 2); + } else if (k == 2) // eaten a powerDot + { + scoreGhost = 200; + } + + if (maze.iTotalDotcount == 0) { + gameState = DEADWAIT; + wait = WAITCOUNT; + newMaze = true; + round++; + return; + } + + for (int i = 0; i < 4; i++) { + k = ghosts[i].testCollision(pac.iX, pac.iY); + if (k == 1) // kill pac + { + pacRemain--; + changePacRemain = 1; + gameState = DEADWAIT; // stop the game + wait = WAITCOUNT; + return; + } else if (k == 2) // caught by pac + { + score += scoreGhost * ((round + 1) / 2); + changeScore = 1; + scoreGhost *= 2; + } + } + + if (score > hiScore) { + hiScore = score; + changeHiScore = 1; + } + + if (changeScore == 1) { + if (score / 10000 - oldScore / 10000 > 0) { + pacRemain++; // bonus + changePacRemain = 1; + } + } + } + + // ///////////////////////////////////////// + // this is the routine draw each frames + // ///////////////////////////////////////// + public void update(Graphics g) { + // System.out.println("update called"); + if (gameState == INITIMAGE) + return; + + // seperate the timer from update + if (signalMove != 0) { + signalMove = 0; + + if (wait != 0) { + wait--; + return; + } + + switch (gameState) { + case STARTWAIT : + gameState = RUNNING; + break; + case RUNNING : + if (key == SUSPEND) + gameState = SUSPENDED; + else + move(); + break; + case DEADWAIT : + if (pacRemain > 0) + startRound(); + else + startGame(); + gameState = STARTWAIT; + wait = WAITCOUNT; + pacKeyDir = Direction.SOUTH.ordinal(); + break; + case SUSPENDED : + if (key == SUSPEND) + gameState = RUNNING; + break; + } + key = NONE; + } + + paintUpdate(g); + } + + // ///////////////////////////////////// + // process key input + // ///////////////////////////////////// + public void keyPressed(KeyEvent e) { + switch (e.getKeyCode()) { + case KeyEvent.VK_RIGHT : + case KeyEvent.VK_L : + pacKeyDir = Direction.EAST.ordinal(); + break; + case KeyEvent.VK_UP : + pacKeyDir = Direction.NORTH.ordinal(); + break; + case KeyEvent.VK_LEFT : + pacKeyDir = Direction.WEST.ordinal(); + break; + case KeyEvent.VK_DOWN : + pacKeyDir = Direction.SOUTH.ordinal(); + break; + case KeyEvent.VK_S : + key = SUSPEND; + break; + case KeyEvent.VK_B : + key = BOSS; + break; + } + } + + public void keyTyped(KeyEvent e) { + } + public void keyReleased(KeyEvent e) { + } + + // ///////////////////////////////////////////////// + // handles window event + // ///////////////////////////////////////////////// + public void windowOpened(WindowEvent e) { + } + + public void windowClosing(WindowEvent e) { + dispose(); + } + + public void windowClosed(WindowEvent e) { + } + + public void windowIconified(WindowEvent e) { + } + + public void windowDeiconified(WindowEvent e) { + } + + public void windowActivated(WindowEvent e) { + } + + public void windowDeactivated(WindowEvent e) { + } + + // /////////////////////////////////////////////// + // the timer + // /////////////////////////////////////////////// + public void run() { + while (true) { + try { + Thread.sleep(timerPeriod); + } catch (InterruptedException e) { + return; + } + + signalMove++; + repaint(); + } + } + + // for applet the check state + boolean finalized = false; + + public void dispose() { + // kill the thread + timer.interrupt(); + + // the off screen canvas + // java.awt.Image offScreen=null; + offScreenG.dispose(); + offScreenG = null; + + // the objects + maze = null; + pac = null; + powerDot = null; + for (int i = 0; i < 4; i++) + ghosts[i] = null; + ghosts = null; + + // score images + imgScore = null; + imgHiScore = null; + imgScoreG.dispose(); + imgScoreG = null; + imgHiScoreG.dispose(); + imgHiScoreG = null; + + super.dispose(); + + finalized = true; + } + + public boolean isFinalized() { + return finalized; + } + + public void setFinalized(boolean finalized) { + this.finalized = finalized; + } + + public static void main(String... arguments) { + new PacMan(); + } } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/PowerDot.java b/src/main/java/edu/unl/cse/soft160/pacman/PowerDot.java index 7693925..79d1b2b 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/PowerDot.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/PowerDot.java @@ -22,88 +22,88 @@ package edu.unl.cse.soft160.pacman; import java.awt.*; public class PowerDot { - final int iX[] = {1, 19, 1, 19}; - final int iY[] = {2, 2, 13, 13}; - - final int iShowCount = 32; - final int iHideCount = 16; - - int frameCount; - int showStatus; - - int iValid[]; - - // the applet this object is associated to - Window applet; - Graphics graphics; - - // the ghosts it controls - Ghost[] ghosts; - - // the power dot image - java.awt.Image imagePowerDot; - - // the blank image - java.awt.Image imageBlank; - - PowerDot(Window a, Graphics g, Ghost[] gh) { - applet = a; - graphics = g; - ghosts = gh; - - // initialize power dot and image - iValid = new int[4]; - - imagePowerDot = applet.createImage(16, 16); - Image.drawPowerDot(imagePowerDot); - - imageBlank = applet.createImage(16, 16); - Graphics imageG = imageBlank.getGraphics(); - imageG.setColor(Color.black); - imageG.fillRect(0, 0, 16, 16); - - frameCount = iShowCount; - showStatus = 1; // show - } - - public void start() { - // all power dots available - for (int i = 0; i < 4; i++) - iValid[i] = 1; - } - - void clear(int dot) { - graphics.drawImage(imageBlank, iX[dot] * 16, iY[dot] * 16, applet); - } - - void eat(int iCol, int iRow) { - for (int i = 0; i < 4; i++) { - if (iX[i] == iCol && iY[i] == iRow) { - iValid[i] = 0; - clear(i); - } - } - for (int i = 0; i < 4; i++) - ghosts[i].makeEdible(); - } - - public void draw() { - frameCount--; - if (frameCount == 0) { - if (showStatus == 1) { - showStatus = 0; - frameCount = iHideCount; - } else { - showStatus = 1; - frameCount = iShowCount; - } - } - for (int i = 0; i < 4; i++) { - if (iValid[i] == 1 && showStatus == 1) - graphics.drawImage(imagePowerDot, iX[i] * 16, iY[i] * 16, - applet); - else - graphics.drawImage(imageBlank, iX[i] * 16, iY[i] * 16, applet); - } - } + final int iX[] = {1, 19, 1, 19}; + final int iY[] = {2, 2, 13, 13}; + + final int iShowCount = 32; + final int iHideCount = 16; + + int frameCount; + int showStatus; + + int iValid[]; + + // the applet this object is associated to + Window applet; + Graphics graphics; + + // the ghosts it controls + Ghost[] ghosts; + + // the power dot image + java.awt.Image imagePowerDot; + + // the blank image + java.awt.Image imageBlank; + + PowerDot(Window a, Graphics g, Ghost[] gh) { + applet = a; + graphics = g; + ghosts = gh; + + // initialize power dot and image + iValid = new int[4]; + + imagePowerDot = applet.createImage(16, 16); + Image.drawPowerDot(imagePowerDot); + + imageBlank = applet.createImage(16, 16); + Graphics imageG = imageBlank.getGraphics(); + imageG.setColor(Color.black); + imageG.fillRect(0, 0, 16, 16); + + frameCount = iShowCount; + showStatus = 1; // show + } + + public void start() { + // all power dots available + for (int i = 0; i < 4; i++) + iValid[i] = 1; + } + + void clear(int dot) { + graphics.drawImage(imageBlank, iX[dot] * 16, iY[dot] * 16, applet); + } + + void eat(int iCol, int iRow) { + for (int i = 0; i < 4; i++) { + if (iX[i] == iCol && iY[i] == iRow) { + iValid[i] = 0; + clear(i); + } + } + for (int i = 0; i < 4; i++) + ghosts[i].makeEdible(); + } + + public void draw() { + frameCount--; + if (frameCount == 0) { + if (showStatus == 1) { + showStatus = 0; + frameCount = iHideCount; + } else { + showStatus = 1; + frameCount = iShowCount; + } + } + for (int i = 0; i < 4; i++) { + if (iValid[i] == 1 && showStatus == 1) + graphics.drawImage(imagePowerDot, iX[i] * 16, iY[i] * 16, + applet); + else + graphics.drawImage(imageBlank, iX[i] * 16, iY[i] * 16, applet); + } + } } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Speed.java b/src/main/java/edu/unl/cse/soft160/pacman/Speed.java index 514a725..d5358cc 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Speed.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Speed.java @@ -26,45 +26,45 @@ package edu.unl.cse.soft160.pacman; * reset counters call isMove per frame to see if step are to be taken */ public class Speed { - // move steps per frames - int steps; - int frames; + // move steps per frames + int steps; + int frames; - int frameCount; - int stepCount; + int frameCount; + int stepCount; - float frameStepRatio; + float frameStepRatio; - Speed() { - start(1, 1); - } + Speed() { + start(1, 1); + } - public void start(int s, int f) throws Error { - if (f < s) - throw new Error("Speed.init(...): frame must >= step"); + public void start(int s, int f) throws Error { + if (f < s) + throw new Error("Speed.init(...): frame must >= step"); - steps = s; - frames = f; - frameStepRatio = (float) frames / (float) steps; + steps = s; + frames = f; + frameStepRatio = (float) frames / (float) steps; - stepCount = steps; - frameCount = frames; - } + stepCount = steps; + frameCount = frames; + } - public boolean isMove() { - frameCount--; + public boolean isMove() { + frameCount--; - float ratio = (float) frameCount / (float) stepCount; + float ratio = (float) frameCount / (float) stepCount; - if (frameCount == 0) - frameCount = frames; + if (frameCount == 0) + frameCount = frames; - if (ratio < frameStepRatio) { - stepCount--; - if (stepCount == 0) - stepCount = steps; - return true; - } - return false; - } + if (ratio < frameStepRatio) { + stepCount--; + if (stepCount == 0) + stepCount = steps; + return true; + } + return false; + } } diff --git a/src/main/java/edu/unl/cse/soft160/pacman/Utility.java b/src/main/java/edu/unl/cse/soft160/pacman/Utility.java index 69f7d2d..c70ebb8 100644 --- a/src/main/java/edu/unl/cse/soft160/pacman/Utility.java +++ b/src/main/java/edu/unl/cse/soft160/pacman/Utility.java @@ -23,28 +23,28 @@ package edu.unl.cse.soft160.pacman; * provide some global public utility functions */ public class Utility { - public static int RandDo(int iOdds) - // see if it happens within a probability of 1/odds - { - if (Math.random() * iOdds < 1) - return (1); - return (0); - } + public static int RandDo(int iOdds) + // see if it happens within a probability of 1/odds + { + if (Math.random() * iOdds < 1) + return (1); + return (0); + } - // return a random number within [0..iTotal) - public static int RandSelect(int iTotal) { - double a; - a = Math.random(); - a = a * iTotal; - return ((int) a); - } + // return a random number within [0..iTotal) + public static int RandSelect(int iTotal) { + double a; + a = Math.random(); + a = a * iTotal; + return ((int) a); + } - public static int IntSign(int iD) { - if (iD == 0) - return (0); - if (iD > 0) - return (1); - else - return (-1); - } + public static int IntSign(int iD) { + if (iD == 0) + return (0); + if (iD > 0) + return (1); + else + return (-1); + } } -- GitLab