MazeBoard.java

~cpp 
import java.awt.Point;

public class MazeBoard {
	public int boardMatrix[][];
	public static int WALL = 0;
	public static int PATH = 1;
	public static int END = 2;
	public static int BLOCK = 3;

	public MazeBoard(int boardMatrix[][]) {
		int x = boardMatrix[0].length;
		int y = boardMatrix.length;
		this.boardMatrix = new int[y+2][x+2];
		for(int i = 0 ; i < x ; ++i)
			for(int j = 0 ; j < y ; ++j)
				this.boardMatrix[j+1][i+1] = boardMatrix[j][i];
	}
	public boolean isEndPoint(Point point) {
		return getBoardSymbol(point) == END;
	}
	public boolean isOpened(Point pt) {
		return getBoardSymbol(pt) != MazeBoard.WALL &&
				getBoardSymbol(pt) != MazeBoard.BLOCK;		
	}
	public int getBoardSymbol(Point pt) {
		return boardMatrix[pt.y][pt.x];
	}
}

Player.java

~cpp 
import java.awt.Point;
import java.util.Vector;

public class Player {
	public Vector tracedPath = new Vector();
	public MazeBoard board;

	public static final int E = 0;
	public static final int S = 1;
	public static final int W = 2;
	public static final int N = 3;

	public static final Point directionTable[] =
		{ new Point(1, 0), new Point(0, 1), new Point(-1, 0), new Point(0, -1)};

	public Player(int x, int y, MazeBoard board) {
		tracedPath.add(new Point(0,0));
		tracedPath.add(new Point(x + 1, y + 1));
		this.board = board;		
	}
	public void move() {
		for (int i = 0; i < 4; ++i) {
			Point curPoint = new Point( getLastPoint() );
			if ( isValidMove(curPoint,i) ) {
				curPoint.x += directionTable[i].x;
				curPoint.y += directionTable[i].y;
				tracedPath.add( new Point(curPoint) );
				return;
			}
		}
		backToPrev();
	}
	public boolean isValidMove(Point curPoint, int nth) {
		Point nextPt = new Point( curPoint.x + directionTable[nth].x, 
							curPoint.y + directionTable[nth].y );
		Point prevPt = (Point) tracedPath.elementAt(tracedPath.size() - 2); 
		return board.isOpened(nextPt) && getDirection(nextPt)!= getDirection(prevPt);
	}
	public int getDirection(Point point) {
		Point curPoint = new Point(getLastPoint());
		if (point.x > curPoint.x)
			return E;
		if (point.x < curPoint.x)
			return W;
		if (point.y > curPoint.y)
			return S;
		return N;
	}
	public Point getLastPoint() {
		return (Point)tracedPath.get(tracedPath.size() - 1);
	}
	public void traverseMaze() {
		while( !board.isEndPoint( getLastPoint() ) )
			move();
	}
	public void backToPrev() {
		Point pt = new Point(getLastPoint());
		board.boardMatrix[pt.y][pt.x] = MazeBoard.BLOCK;
		tracedPath.remove( tracedPath.size()-1 );				 
	}
}

MazeTestCase

~cpp 
import java.awt.Point;
import java.util.Vector;

import junit.framework.TestCase;

public class MazeTestCase extends TestCase {
	final int X = 3;
	final int Y = 3;
	int mazeBoard[][] = { {1,1,0}, {0,1,0}, {0,1,2} };	
	MazeBoard mb = new MazeBoard(mazeBoard);
	Player player = new Player(0,0,mb);
	
	public MazeTestCase(String title) {
		super(title);
	}
	public void testCreation() {
		int expected[][] = { {0,0,0,0,0}, {0,1,1,0,0}, {0,0,1,0,0},
							{0,0,1,2,0}, {0,0,0,0,0} };
		for(int i = 0 ; i < X+2 ; ++i) 
			for(int j = 0 ; j < Y+2 ; ++j) 
				assertEquals(expected[j][i], mb.boardMatrix[j][i]);
	}
	public void testMovement() {
		Point expectedPoint[] = { new Point(2,1), new Point(2,2),
								new Point(2,3), new Point(3,3) };
		for(int i = 0 ; i < 4 ; ++i) {
			player.move();
			assertEquals( expectedPoint[i], player.getLastPoint() );						
		}
	}
	public void testMovement2() {
		Vector expected = new Vector();
		Point pt[] = {new Point(0,0), new Point(1,1), new Point(2,1),
					 new Point(2,2), new Point(2,3), new Point(3,3)};
		for(int i = 0 ; i < pt.length ; ++i)
			expected.add(pt[i]);			
		player.traverseMaze();
		assertEquals( expected, player.tracedPath );
	}
	public void testJudge() {
		Point point = new Point(2,1);
		assertEquals(Player.E, player.getDirection(point));
		point.setLocation(1,2);
		assertEquals(Player.S, player.getDirection(point));
	}	
	public void testEnd() {
		player.traverseMaze();
		Point point = player.getLastPoint();
		assertEquals(2, mb.boardMatrix[point.y][point.x]);		
	}	
}

ComplexMazeTestCase

~cpp 
import java.awt.Point;
import junit.framework.TestCase;

public class ComplexMazeTestCase extends TestCase {
	int complexMatrix[][] = {{1,1,1,0},{0,0,1,0},{1,1,1,1},{2,0,0,0}};
	MazeBoard mb = new MazeBoard(complexMatrix);
	Player player = new Player(0,0,mb);
	
	public void testBlocked() {
		for(int i = 0 ; i < 5 ; ++i)
			player.move();				
		player.backToPrev();
		assertEquals(MazeBoard.BLOCK, mb.getBoardSymbol(new Point(4,3)));
		assertEquals(new Point(3,3), player.getLastPoint());
	}
	
	public void testAll() {
		Point expected[] = {new Point(0,0), new Point(1,1), new Point(2,1),
						new Point(3,1), new Point(3,2), new Point(3,3),
						new Point(2,3), new Point(1,3), new Point(1,4)}; 
		player.traverseMaze();
		for(int i = 0 ; i < expected.length ; i++)
			assertEquals(expected[i], (Point) player.tracedPath.get(i));
	}

	public void testAcceptance1() {
		int matrix[][] = {	 {1,1,0,0,0,0},
							{0,1,1,1,1,0},
							{0,0,0,0,1,0},
							{0,0,0,0,2,0} };						
		MazeBoard maze = new MazeBoard(matrix);
		Player p = new Player(0,0,maze);
		p.traverseMaze();

		assertEquals(new Point(5,4), p.getLastPoint());
	}	
	public void testAcceptance2() {
		int matrix[][] = {{1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
							{0,1,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0},
							{0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0},
							{0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0},
							{1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0},
							{1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0},
							{1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0},
							{1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
							{1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
							{1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},
							{1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},
							{0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0},
							{1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
							{0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0},
							{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0},
							{0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,2}};						
		MazeBoard maze = new MazeBoard(matrix);
		Player p = new Player(0,0,maze);
		p.traverseMaze();

		assertEquals(new Point(30,20), p.getLastPoint());
	}
}

MazeFrame.java

~cpp 
import java.awt.*;

import javax.swing.*;

public class MazeFrame extends JApplet {
	JButton mazeUnit[][] = new JButton[20][30];
	MazeBoard maze;
	Player player;	
	public void init() {
		int matrix[][] = {{1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
							{0,1,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0},
							{0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0},
							{0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0},
							{1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0},
							{1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0},
							{1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0},
							{1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
							{1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
							{1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},
							{1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},
							{0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0},
							{1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
							{0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0},
							{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
							{0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0},
							{0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,2}};						
		maze = new MazeBoard(matrix);
		player = new Player(0,0,maze);
		player.traverseMaze();

		getContentPane().setLayout(new GridLayout(20,30));
		for(int i = 0 ; i < 20 ; ++i) {
			for(int j = 0 ; j < 30 ; ++j) {
				mazeUnit[i][j] = new JButton();
				
				int boardSymbol = maze.getBoardSymbol(new Point(j+1,i+1)); 
				if( boardSymbol == MazeBoard.WALL ) 
					mazeUnit[i][j].setBackground(Color.BLACK);	 
				else if( boardSymbol == MazeBoard.PATH ||
					boardSymbol == MazeBoard.BLOCK )			
					mazeUnit[i][j].setBackground(Color.WHITE);	
				getContentPane().add(mazeUnit[i][j]);
			}
		}
		setSize(600,600);
		setVisible(true);
		
		traverse();
	}
	public void traverse() {
		for(int i = 1 ; i < player.tracedPath.size() ; ++i) {
			Point pt = (Point)player.tracedPath.get(i);
			mazeUnit[pt.y-1][pt.x-1].setBackground(Color.RED);
		}
	}
	
}
Retrieved from http://wiki.zeropage.org/wiki.php/미로찾기/상욱&인수
last modified 2021-02-07 05:29:31