| CODE |
| import java.awt.HeadlessException; import java.io.FileNotFoundException; import java.io.IOException; import javax.swing.JOptionPane; public class Project2 { public static void main(String[] args) throws HeadlessException, FileNotFoundException, IOException { //(new MazeController(JOptionPane.showInputDialog("Maze file name:"))).start(); (new MazeController("maze.txt")).start(); } } |
| CODE |
| import java.awt.Point; import java.io.FileNotFoundException; import java.io.IOException; import javax.swing.JOptionPane; public class MazeController { Maze m; boolean[] moving = new boolean[3]; MouseController mc; Mouse[] mouse = new Mouse[3]; Cat[] cat = new Cat[3]; int day = 0; String record = ""; int[] timer = new int[3]; public MazeController(String file) throws FileNotFoundException, IOException { m = new Maze(file); mc = new MouseController(); Point[] starting = new Point[6]; int length = (int)m.getSize().getX(); int width = (int)m.getSize().getY(); int I = 0; for (int Q = 0; Q < 3; Q++) {moving[Q] = true;} do { Point p = new Point((int)Math.floor(length*Math.random()), (int)Math.floor(width * Math.random())); boolean valid = m.isHallway(p); //random point is hall if (valid) { for (int j = 0; j < i; j++) { valid = valid && !p.equals(starting[j]); } //random point hasn't been used } if (valid) { cat[i] = new Cat(p, i); starting[i] = p; i++; } } while (i < 3); do { Point p = new Point((int)Math.floor(length*Math.random()), (int)Math.floor(width*Math.random())); boolean valid = m.isHallway(p); //random point is hall if (valid) { for (int j = 0; j < i; j++) { valid = valid && !p.equals(starting[j]); } //random point hasn't been used } if (valid) { mouse[i-3] = new Mouse(p, cat[0], cat[1], cat[2], (i-3), mc); starting[i] = p; i++; } } while (i < 6); for (int M = 0; M < 3; M++) { for (int N = 0; N < 3; N++) { mouse[M].addObserver(cat[N]); } mouse[M].addObserver(mc); } Point[] ps = new Point[3]; for (int L = 0; L < 3; L++) { ps[L] = mouse[L].getPosition(); timer[L] = 0; } for (int L = 0; L < 3; L++) { cat[L].receiveSpots(ps); } } public void start() { record += " Day 0:\n"; for (int I = 0; i < 3; i++) { record += "Mouse " + (i+1) + ": (" + (int)mouse[i].getPosition().getX() + ", " + (int)mouse[i].getPosition().getY() + ")\n"; } for (int I = 0; i < 3; i++) { record += "Cat " + (i+1) + ": (" + (int)cat[i].getPosition().getX() + ", " + (int)cat[i].getPosition().getY() + ")\n"; } do { for (int I = 0; i < 3; i++) { if (moving[i]) { map(); mouse[i].move(m); timer[i]++; catchcheck(); leftcheck(); } } day++; record += "\n Day " + day + ":\n"; for (int I = 0; i < 3; i++) { if (moving[i]) {record += "Mouse " + (i+1) + ": (" + (int)mouse[i].getPosition().getX() + ", " + (int)mouse[i].getPosition().getY() + ")\n";} } for (int I = 0; i < 3; i++) { record += "Cat " + (i+1) + ": (" + (int)cat[i].getPosition().getX() + ", " + (int)cat[i].getPosition().getY() + ")\n"; } } while ((moving[0] || moving[1] || moving[2]) && day < 100); for (int I = 0; i < 3; i++) { record += "Mouse " + (i+1) + ": " + timer[i] + " days\n"; } System.out.println(record); } private void catchcheck() { for (int I = 0; i < 3; i++) { if (moving[i]) { for (int j = 0; j < 3; j++) { if ((mouse[i].getPosition().equals(cat[j].getPosition()))) { moving[i] = false; mouse[i].eaten(); record += "Mouse " + (i+1) + " got eaten.\n"; System.out.println("Mouse " + (i + 1) + " was eaten."); } } } } } private void leftcheck() { for (int I = 0; i < 3; i++) { if (moving[i]) { Point p = m.getSize(); Point u = mouse[i].getPosition(); moving[i] = u.getX() < p.getX() && u.getX() > -1 && u.getY() < p.getY() && u.getY() > -1; if (!(moving[i])) { System.out.println("Mouse " + (i+1) + " left the maze."); record += "Mouse " + (i+1) + " escaped.\n"; } } } } private void map() { char[][] map = m.getLayout(); for (int I = 0; i < 3; i++) { if (moving[i]) { map = change(mouse[i], map); } map = change(cat[i], map); } String print = " Day " + day + ": \n\n"; for (int I = 0; i < 16; i++) { for (int j = 0; j < 18; j++) { print += map[i][j]; } print += "\n"; } System.out.println(print + "\n1-3 = Mice\nA-C = Cats\n# = multiple mice\n* = multiple cats\n? = Cat(s) and Mouse(Mice)"); //JOptionPane.showMessageDialog(null, mouse[0].getPosition() + "\n" + mouse[1].getPosition() + "\n" + mouse[2].getPosition() + "\n" // + cat[0].getPosition() + "\n" + cat[1].getPosition() + "\n" + cat[2].getPosition()); } private char[][] change(Animal a, char[][] map) { boolean mcheck = false, ccheck = false; if (a instanceof Mouse) { Mouse mo = (Mouse)a; for (int I = 0; i < 3; i++) { if (!(mouse[i].getNumber() == mo.getNumber()) && mouse[i].getPosition().equals(mo.getPosition())) { mcheck = true; } } for (int I = 0; i < 3; i++) { if (cat[i].getPosition().equals(mo.getPosition())) { ccheck = true; } //these have to be if/thens to avoid switch back to false } if (!mcheck && !ccheck) { switch (mo.getNumber()) { case 0: map[(int)mo.getPosition().getX()][(int)mo.getPosition().getY()] = '1'; break; case 1: map[(int)mo.getPosition().getX()][(int)mo.getPosition().getY()] = '2'; break; case 2: map[(int)mo.getPosition().getX()][(int)mo.getPosition().getY()] = '3'; break; } } else if (mcheck && !ccheck) { map[(int)mo.getPosition().getX()][(int)mo.getPosition().getY()] = '#'; } else if (ccheck) { map[(int)mo.getPosition().getX()][(int)mo.getPosition().getY()] = '?'; } } else { Cat c = (Cat)a; for (int I = 0; i < 3; i++) { if (!(cat[i].getNumber() == c.getNumber()) && cat[i].getPosition().equals(c.getPosition())) { ccheck = true; } } for (int I = 0; i < 3; i++) { if (mouse[i].getPosition().equals(c.getPosition())) { mcheck = true; } } if (!mcheck && !ccheck) { switch (c.getNumber()) { case 0: map[(int)c.getPosition().getX()][(int)c.getPosition().getY()] = 'A'; break; case 1: map[(int)c.getPosition().getX()][(int)c.getPosition().getY()] = 'B'; break; case 2: map[(int)c.getPosition().getX()][(int)c.getPosition().getY()] = 'C'; break; } } else if (!mcheck && ccheck) { map[(int)c.getPosition().getX()][(int)c.getPosition().getY()] = '*'; } else if (mcheck) { map[(int)c.getPosition().getX()][(int)c.getPosition().getY()] = '?'; } } return map; } } |
| CODE |
| import java.awt.Point; /* * Created by Joseph Ambrose * * Animal interface * * methods: -move * -getPosition * */ public interface Animal { /* * move this Animal to a different point in the given maze */ public void move(Maze m); /* * returns the Animal's current location */ public Point getPosition(); } |
| CODE |
| import java.awt.Point; import java.util.Observable; public class Mouse extends Observable implements Animal { private Point p; private int num; /** * create a Mouse at given point * add the 3 cats as observer */ public Mouse(Point p, Cat a, Cat b, Cat c, int num, MouseController mc) { this.p = p; this.num = num; addObserver(a); addObserver(b); addObserver(c); addObserver(mc); } /** * */ public void move(Maze m) { setChanged(); notifyObservers(m); clearChanged(); } public Point getPosition() { return p; } public int getNumber() { return num; } public void eaten() { setChanged(); notifyObservers(null); clearChanged(); } /** * * @ require - a point this mouse can move to (hall and only one space away) * @ ensure - mouse's location = given point */ public void recommendMove(Point p) { this.p = p; } } |
| CODE |
| import java.awt.Point; import java.util.Observable; import java.util.Observer; import javax.swing.JOptionPane; public class Cat implements Animal, Observer { private Point p; private boolean[] chase = new boolean[3]; private Point[] mousespot = new Point[3]; private int num; /** * create a new Cat at given Point */ public Cat(Point p, int num) { this.p = p; this.num = num; for (int I = 0; i < 3; i ++) { chase[i] = true; } } /** * @ require - a valid maze to move in * * @ ensure - the cat moves one space, toward the closest mouse if possible */ public void move(Maze m) { // 1 - north // 2 - south // 3 - west // 4 - east switch (facing(m)) { case 1: p.translate(-1, 0); break; case 2: p.translate(1, 0); break; case 3: p.translate(0, -1); break; case 4: p.translate(0, 1); break; default: JOptionPane.showMessageDialog(null, "Stop the freaking program, something screwed up!"); } } /** * @ require - a maze to check for possible moves in * * @ ensure - int represting direction of optimal possible movement is returned */ private int facing(Maze m) { int closest = closestmouse(); if (closest == -1) { if (m.isHallway(new Point((int) p.getX() - 1, (int) p.getY()))) { return 1; } else if (m.isHallway(new Point((int) p.getX() + 1, (int) p.getY()))) { return 2; } else if (m.isHallway(new Point((int) p.getX(), (int) p.getY() - 1))) { return 3; } else if (m.isHallway(new Point((int) p.getX(), (int) p.getY() + 1))) { return 4; } } else { Point a = mousespot[closest]; if (Math.abs((a.getX() - p.getX())) > Math.abs(a.getY() - p.getY())) { //vertical diff is greater than horizontal if (a.getX() < p.getX()) { //mouse is north if (checkNorth(m)) { //square to north is open return 1; } else if (a.getY() <= p.getY()) { //straight north or north-west, but can't move north if (checkWest(m)) { return 3; } else if (checkEast(m)) { return 4; } else { return 2; } } else { //north-east and can't move north if (checkEast(m)) { return 4; } else if (checkWest(m)) { return 3; } else { return 2; } } } //end mouse-north else { //mouse is south if (checkSouth(m)) { //square to south is open return 2; } else if (a.getY() <= p.getY()) { //straight south or south-west, but can't move south if (checkWest(m)) { return 3; } else if (checkEast(m)) { return 4; } else { return 1; } } else { //south-east and can't move south if (checkEast(m)) { return 4; } else if (checkWest(m)) { return 3; } else { return 1; } } } //end mouse-south } //end vertical difference = greater else { //horizontal difference is greater/equal if (a.getY() < p.getY()) { //mouse is west if (checkWest(m)) { //west is open return 3; } else if (a.getX() <= p.getX()) { //straight west or north-west, can't go west if (checkNorth(m)) { return 1; } else if (checkSouth(m)) { return 2; } else { return 4; } } else { //south-west, can't go west if (checkSouth(m)) { return 2; } else if (checkNorth(m)) { return 1; } else { return 4; } } } //end west else { //mouse is east if (checkEast(m)) { //east is open return 4; } else if (a.getX() <= p.getX()) { //straight east or north-east, can't go west if (checkNorth(m)) { return 1; } else if (checkSouth(m)) { return 2; } else { return 3; } } else { //south-east, can't go east if (checkSouth(m)) { return 2; } else if (checkNorth(m)) { return 1; } else { return 3; } } } //east } //end horizontal difference = greater } JOptionPane.showMessageDialog(null, "Something went wrong horribly with chase method"); return -1; } private boolean checkNorth(Maze m) { return m.isHallway(new Point((int)p.getX() - 1, (int)p.getY())); } private boolean checkSouth(Maze m) { return m.isHallway(new Point((int)p.getX() + 1, (int)p.getY())); } private boolean checkWest(Maze m) { return m.isHallway(new Point((int)p.getX(), (int)p.getY() - 1)); } private boolean checkEast(Maze m) { return m.isHallway(new Point((int)p.getX(), (int)p.getY() + 1)); } /** * @ ensure - number of closest mouse is return unless * only remaining mouse is underneath (-1 is then returned) */ private int closestmouse() { int closest = -1; double distance = 35; //34 is the greatest distance possible in the current maze for (int I = 0; i < 3; i++) { if (chase[i]) { //if mouse is still a target if (!(p.equals(mousespot[i]))) { //ignore mouse underneath if (Math.abs(mousespot[i].getX() - p.getX()) //if mouse is closer than closest so far + Math.abs(mousespot[i].getY() - p.getY()) < distance) { distance = + Math.abs(mousespot[i].getX() - p.getX()) + Math.abs(mousespot[i].getY() - p.getY()); closest = i; } } } } return closest; } public Point getPosition() { return p; } public void receiveSpots(Point[] ps) { mousespot = ps; } /** * @ require - either a valid maze or a null value * * @ ensure - if null is returned, stop chasing that mouse * if a valid maze is returned, update the mouse's position and tell the cat to move */ public void update(Observable mouse, Object maze) { if (maze == null) { chase[((Mouse)mouse).getNumber()] = false; } else { mousespot[((Mouse)mouse).getNumber()] = ((Mouse)mouse).getPosition(); move((Maze)maze); } } public int getNumber() { return num; } } |
| CODE |
| import java.io.*; import java.util.*; /* * Joseph Ambrose * * Maze class for maze project * */ import java.awt.*; import javax.swing.*; public class Maze { private char[][] layout; private int x, y; private int l, w; public Maze(String file) throws FileNotFoundException, IOException { Scanner mazefile = new Scanner(new File(file)); l = mazefile.nextInt(); w = mazefile.nextInt(); layout = new char[l][w]; for (int I = 0; i < l; i++) { for (int j = 0; j < w; j++) { if (mazefile.next().equals("W")) {layout[i][j] = 'W';} else {layout[i][j] = 'H';} } } } public boolean isHallway(Point p) /** * * @ ensure - true is returned if the point is a hallway or outside the maze * */ { return ((p.getX() >= 0 && p.getX() < l && p.getY() >= 0 && p.getY() < w) && !(layout[(int) p.getX()][(int) p.getY()] == 'W')) || !(p.getX() >= 0 && p.getX() < l && p.getY() >= 0 && p.getY() < w); } public boolean isWall(Point p) /** * @ ensure - true is returned if the point is a wall and inside the maze * */ { return (p.getX() >= 0 && p.getX() < l && p.getY() >= 0 && p.getY() < w) && (layout[(int) p.getX()][(int) p.getY()] == 'W'); } public Point getSize() { return new Point(l, w); } public char[][] getLayout() { char[][] map = new char[l][w]; for (int I = 0; i < l; i++) { for (int j = 0; j < w; j++) { if (layout[i][j] == 'W') {map[i][j] = 'W';} else {map[i][j] = 'H';} } } return map; } } |
| CODE |
| import java.awt.Point; import java.util.*; import javax.swing.JOptionPane; public class MouseController implements Observer { public void update(Observable mouse, Object maze) { if (!(maze == null)) { Scanner input = new Scanner(System.in); boolean done = false; do { System.out.println(" Move mouse " + (((Mouse)mouse).getNumber() + 1) + ".\n Please use up, down, left or right"); System.out.print("?"); String answer = input.next(); Point p = ((Mouse)mouse).getPosition(); if (answer.equals("up")) { if (((Maze)maze).isHallway(new Point( (int) p.getX() - 1, (int) p.getY()))) { ((Mouse)mouse).recommendMove(new Point((int)p.getX()-1, (int) p.getY())); done = true; } else { System.out.println("Can't move there.\nProblem: there's a wall above current point"); } } else if (answer.equals("down")) { if (((Maze)maze).isHallway(new Point( (int) p.getX() + 1, (int) p.getY()))) { ((Mouse)mouse).recommendMove(new Point((int)p.getX()+1, (int) p.getY())); done = true; } else { System.out.println("Can't move there.\nProblem: there's a wall below current point"); } } else if (answer.equals("left")) { if (((Maze)maze).isHallway(new Point( (int) p.getX(), (int) p.getY()-1 ))) { ((Mouse)mouse).recommendMove(new Point((int)p.getX(), (int) p.getY()-1 )); done = true; } else { System.out.println("Can't move there.\nProblem: there's a wall to left of current point"); } } else if (answer.equals("right")) { if (((Maze)maze).isHallway(new Point( (int) p.getX(), (int) p.getY()+1 ))) { ((Mouse)mouse).recommendMove(new Point((int)p.getX(), (int) p.getY()+1 )); done = true; } else { System.out.println("Can't move there.\nProblem: there's a wall to right of current point"); } } else { System.out.println("Invalid input.\nPlease select from the given commands."); } } while (!done); } } } |
| CODE |
| 16 18 W H W W W W W W W W W W W W W W W W W H H H H H H H H H H H H H H W H W W H W W W W W H W H W W H W H W H W W H W H H H W H W H W H H W H W H W W H W H W H W H W H W H W W H H H W W H W H W H W H W H W H H H W W W W W H W H W W W H W H W H W H H H H W W H W H H H H H W H W H H W W W H W W H W W W H W W W H W W W H H H H H W H H H W H H H W H W H W H W W W W W W W H W W W H W H W H W H H H H W W H W H W H H H W H W H W W W W H W W H H H W W W H W H W H H H H H H W W H W W W H W W W H W H W W W W W W W H H H H H H H H H H H H H H H H W W H W W W W W W W W W W W W W W W W |
| QUOTE (Alex @ Mar 2 2008, 06:24 PM) |
| I un feel like looking through all that code. O_o. What level are you taking? I'm in AP Programming AB and I never have had to do anything that big, lulz. And also, you should probably do the preconditions/postconditions first before you write stuff. ;O |
| QUOTE (Cadin @ Mar 3 2008, 10:08 AM) |
| Red bull and coffee Enough said. :) |
| QUOTE (KuraiKitsune @ Apr 21 2008, 10:03 PM) |
| Ick, Red Bull. :/ The only Red Bull I liked was in The Last Unicorn. (If ANYONE got that reference, I'll love thee forever. XD) Coffee is good. Try an Eye Opener. Three shots of espresso into a mocha (which already had one) makes sure that you sure aren't going to fall asleep anytime soon. xD |
| QUOTE (KuraiKitsune @ Apr 21 2008, 10:03 PM) |
| Ick, Red Bull. :/ The only Red Bull I liked was in The Last Unicorn. (If ANYONE got that reference, I'll love thee forever. XD) Coffee is good. Try an Eye Opener. Three shots of espresso into a mocha (which already had one) makes sure that you sure aren't going to fall asleep anytime soon. xD |
| QUOTE (KuraiKitsune @ Apr 21 2008, 10:03 PM) |
| Ick, Red Bull. :/ The only Red Bull I liked was in The Last Unicorn. (If ANYONE got that reference, I'll love thee forever. XD) Coffee is good. Try an Eye Opener. Three shots of espresso into a mocha (which already had one) makes sure that you sure aren't going to fall asleep anytime soon. xD |