====== Chase's Pack Person Game ======
[[https://mathorama.com/apcs2/PacMaze.jar|PacMaze.jar]]
[[https://mathorama.com/apcs/pmwiki.php?n=Main.MoveAMonsterApplication|Move Monster]]
[[https://mathorama.com/apcs/pmwiki.php?n=Main.MakeMaze|MazeMaker]]
[[https://mathorama.com/apcs/pmwiki.php?n=Main.Frogger|Frogger]]
{{::level1.png?400|}}
{{::pacman.gif|packman.gif}}
{{ ::packman.jar | Executable Jar file that tests the Cell, Level, and PackMan classes}}
import java.awt.*;
public class Cell
{
public static final int NORTH=0, SOUTH=1, EAST=2, WEST=3;
public static final int GAP = 5;
private boolean[] canExit;// NSEW true if an exit
private boolean visited;
private int x, y, size;
public Cell (int x, int y , int size)
{
this.x = x;
this.y = y;
this.size = size;
canExit = new boolean[4];
visited = false;
setAllExits(true);
}
public boolean canExit(int dir){
return canExit[dir];
}
public void noExit(int dir) {
canExit[dir] = false;
}
public void exit(int dir) {
canExit[dir] = true;
}
public void setAllExits(boolean b){
for(int i = 0; i < canExit.length; i++)
canExit[i] = b;
}
public int getX(){
return x+size/2; //center
}
public int getY(){
return y+size/2;
}
public boolean beenVisited(){
return visited;
}
public void setVisited(boolean v)
{
visited = v;
}
public boolean contains(int x0, int y0){
return (x0 >= x) && (x0 <= x + size) &&
(y0 >= y) && (y0 <= y + size);
}
public void draw(Graphics g)
{
g.setColor(Color.BLACK);
g.fillRect(x, y, size, size);
if( !visited){
g.setColor(Color.YELLOW);
g.fillRect(x+size/2, y+size/2, GAP,GAP);
}
g.setColor(Color.MAGENTA.darker());
if(!canExit[NORTH]){
g.fillRect(x, y, size, GAP);
}
if(!canExit[SOUTH]){
g.fillRect(x, y+size-GAP, size, GAP);
}
if(!canExit[EAST]){
g.fillRect(x+size-GAP, y, GAP, size);
}
if(!canExit[WEST]){
g.fillRect(x, y, GAP, size);
}
}
public String toString(){
String result="";
result += "("+x +", "+y+") Exits: ";
if(canExit[Cell.NORTH])
result += "N ";
if(canExit[Cell.SOUTH])
result += "S ";
if(canExit[Cell.EAST])
result += "E ";
if(canExit[Cell.WEST])
result += "W ";
return result;
}
}
import java.awt.*;
public class Level
{
private Cell[][] grid;
private int rows, cols, top, left, size;
public Level(int rows, int cols, int top, int left, int size)
{
this.rows = rows;
this.cols = cols;
this.top = top;
this.left = left;
this.size = size;
grid = new Cell[rows][cols];
for(int r=0; r
import java.awt.*;
public class PackMan
{
// instance variables - replace the example below with your own
private int x, y, size, direction;
private Level lev;
private Cell myCell;
private boolean isOpen;
public static final int SPEED = 10;
/**
* Constructor for objects of class PackMan
*/
public PackMan(Level lev, int row, int col)
{
this.lev = lev;
this.size = lev.getSize()-10;
this.x = lev.getXbyCol(col);
this.y = lev.getYbyRow(row);
this.myCell = lev.getCell(x,y);
isOpen = false;
direction = Cell.SOUTH;
lev.getCell(x, y).setVisited(true);
}
public void setDirection(int dir)
{
direction = dir;
}
public void changeMouth()
{
isOpen = !isOpen;
}
public void move(){
int nextX = this.x;
int nextY = this.y;
if (direction == Cell.NORTH)
nextY = y - SPEED;
else if (direction == Cell.SOUTH)
nextY = y + SPEED;
else if (direction == Cell.EAST)
nextX = x + SPEED;
else if (direction == Cell.WEST)
nextX = x - SPEED;
Cell nextCell = lev.getCell(nextX, nextY);
if (myCell.canExit(direction))
{
this.x = nextX;
this.y = nextY;
this.myCell.setVisited(true);
}
if (myCell != nextCell){
myCell = nextCell;
this.x = myCell.getX();
this.y = myCell.getY();
}
}
public Cell getCell(){ return myCell; }
public int getDirection() {return direction;}
public void draw(Graphics g)
{
g.setColor(Color.YELLOW);
int x0 = x - size/2;
int y0 = y - size/2;
if( isOpen )
g.fillOval(x0,y0,size,size);
else if (direction == Cell.EAST)
{
g.fillArc(x0,y0,size,size, 45,270 );
}else if (direction == Cell.NORTH)
{
g.fillArc(x0,y0,size,size, 135,270 );
}else if (direction == Cell.WEST)
{
g.fillArc(x0,y0,size,size, 225,270 );
}else if (direction == Cell.SOUTH)
{
g.fillArc(x0,y0,size,size, -45,270 );
}
}
public String toString(){
String result = "Pacman: ("+x+", "+y+") facing ";
if(direction == Cell.NORTH)
result += "N ";
if(direction == Cell.SOUTH)
result += "S ";
if(direction == Cell.EAST)
result += "E ";
if(direction == Cell.WEST)
result += "W ";
result += myCell.toString()+ " can ";
if (!myCell.canExit(direction))
result += "NOT ";
result += "exit.";
return result;
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
public class LevelTester extends JPanel implements KeyListener, ActionListener, MouseListener
{
public static int WIDTH=800;
public static int HEIGHT=600;
public static final int NORTH=0, SOUTH=1, EAST=2, WEST=3;
private PackMan pm;
private Level lev1;
private Timer chewTimer, moveTimer;
private String message, message2;
private int moveCnt;
public LevelTester(){
int size =50;
lev1 = new Level(3, 7, 100, size, size);
lev1.noExit(0,1,SOUTH);
lev1.noExit(0,2,SOUTH);
lev1.noExit(0,5,SOUTH);
lev1.noExit(1,0,EAST);
lev1.noExit(1,1,WEST);
lev1.noExit(1,1,NORTH);
lev1.noExit(1,2,NORTH);
lev1.noExit(1,2,SOUTH);
lev1.noExit(1,3,EAST);
lev1.noExit(1,3,SOUTH);
lev1.noExit(1,4,WEST);
lev1.noExit(1,4,SOUTH);
lev1.noExit(1,5,NORTH);
lev1.noExit(1,5,EAST);
lev1.noExit(1,6,WEST);
lev1.noExit(2,2,NORTH);
lev1.noExit(2,3,NORTH);
lev1.noExit(2,4,NORTH);
pm = new PackMan(lev1, 2, 0);
chewTimer = new Timer(150, this);
moveTimer = new Timer(50,this);
chewTimer.start();
moveTimer.start();
message = "Click a cell to show info";
message2 = pm.toString();
moveCnt=0;
}
public static void main(String[] args) {
LevelTester app= new LevelTester();
JFrame window = new JFrame("Level Tester");
window.setSize(WIDTH, HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().add(app);
// remember to add Key Listeners for the game interface
window.addKeyListener(app);
window.getContentPane().addMouseListener(app);
window.setVisible(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(),getHeight());
lev1.draw(g);
pm.draw(g);
g.setColor(Color.BLACK);
g.drawString(message, 50,50);
message2 = pm.toString();
g.drawString(message2, 50,70);
g.drawString("moves: "+moveCnt + " Crumbs: "+ lev1.crumbsLeft(), 50,90);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==chewTimer){
pm.changeMouth();
} else if (e.getSource()==moveTimer) {
pm.move();
moveCnt++;
}
repaint();
}
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {
int keyCode=e.getKeyCode();
if(keyCode == 37){
//left
pm.setDirection(Cell.WEST);
} else if (keyCode ==38){
// up
pm.setDirection(Cell.NORTH);
} else if (keyCode ==39){
// right
pm.setDirection(Cell.EAST);
}else if (keyCode ==40){
// down
pm.setDirection(Cell.SOUTH);
}
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
int x=e.getX();
int y=e.getY();
message = lev1.getCell(x,y).toString();
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}