U E D R , A S I H C RSS

오목/인수

  • TDD 연습차..

Board.java

~cpp 
public class Board {
	final static int EMPTY = 0;
	int width, height;
	int boardState[][];

	public Board(int width, int height) {
		this.width = width;
		this.height = height;
		boardState = new int[height][width];
	}
	public int getState(int x, int y) {
		return boardState[y][x];
	}
	public void putStone(int turn, int x, int y) {
		if(boardState[y][x] == EMPTY) {
			boardState[y][x] = turn;
		}	
	}
	public boolean isInBoard(int x, int y) {
		return x >= 0 && x < width && y >= 0 && y < width;
	}
	public boolean isSameStone(int turn, int x, int y) {
		return isInBoard(x, y) && getState(x, y) == turn;
	}
	public void clearStones() {
		for(int i = 0 ; i < width ; ++i)
			for(int j = 0 ; j < height ; ++j)
				clearStone(i, j);		
	}
	public void clearStone(int x, int y) {
		boardState[y][x] = EMPTY;
	}
}

Omok.java

~cpp 
public class Omok {
	final static int BLACK = 1;
	final static int WHITE = 2;
	final static int WANTED = 5;
	Board board;
	int curTurn;
	public Omok(Board board) {
		this.board = board;
		curTurn = BLACK;
	}
	public Omok(int width, int height) {
		board = new Board(width, height);
		curTurn = BLACK;
	}
	private int commonCheck(int x, int y, int wanted,  
							int dX1, int dX2, int dY1, int dY2) {
		int numOfStone = 1;
		for(int i = 1 ; i <= wanted - 1 ; ++i) {
			if( board.isSameStone(curTurn, x + i * dX1, y + i * dY1) )
				++numOfStone;
			if( board.isSameStone(curTurn, x + i * dX2, y + i * dY2) )
				++numOfStone;
		}
		return numOfStone;				
	}	
	private int checkHeight(int x, int y, int wanted) {
		return commonCheck(x, y, wanted, 0, 0, -1, 1);
	}
	private int checkWidth(int x, int y, int wanted) {
		return commonCheck(x, y, wanted, -1, 1, 0, 0);
	}
	private int checkBackSlash(int x, int y, int wanted) {
		return commonCheck(x, y, wanted, -1, 1, -1, 1);
	}
	private int checkSlash(int x, int y, int wanted) {
		return commonCheck(x, y, wanted, 1, -1, -1, 1);
	}
	public boolean doesAnyoneWin(int x, int y) {
		return checkHeight(x, y, WANTED) == WANTED || 
				checkWidth(x, y, WANTED) == WANTED ||
				checkBackSlash(x, y, WANTED) == WANTED || 
				checkSlash(x, y, WANTED) == WANTED;
	}
	public boolean is33(int x, int y) {
		int count = 0;
		if( checkHeight(x,y,3) == 3 ) ++count;
		if( checkWidth(x,y,3) == 3 ) ++count;
		if( checkBackSlash(x,y,3) == 3 ) ++count;
		if( checkSlash(x,y,3) == 3 ) ++count;
		return count == 2;
	}
	public void putStone(int x, int y) {
		board.putStone(curTurn, x, y);
	}
	public int getState(int x, int y) {
		return board.getState(x, y);
	}
	public void toNextTurn() {
		curTurn = (curTurn == BLACK) ? WHITE : BLACK;
	}
	public String getTurnSymbol() {
		return curTurn == BLACK ? "흑" : "백";
	}
	public void clearStone(int x, int y) {
		board.clearStone(x, y);
	}
}

OmokFrame.java

~cpp 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OmokFrame extends JFrame {
	final static int WIDTH = 20;
	final static int HEIGHT = 20;
	final static int BLOCKSIZE = 30;
	
	protected Omok omok;
	public OmokFrame(String arg) throws HeadlessException {
		super(arg);
		omok = new Omok(WIDTH, HEIGHT);
		getContentPane().addMouseListener( new PutStoneListener(this) );
		setSize( (WIDTH + 2) * BLOCKSIZE , (HEIGHT + 2) * BLOCKSIZE );
		setBackground( Color.WHITE );
		setVisible(true);
		repaint();
	}
	public void paint(Graphics g) {
		for(int i = 0 ; i < WIDTH ; ++i)
			g.drawLine(BLOCKSIZE + i * BLOCKSIZE, BLOCKSIZE, 
						BLOCKSIZE + i * BLOCKSIZE, HEIGHT * BLOCKSIZE);
		for(int i = 0 ; i < HEIGHT ; ++i)
			g.drawLine(BLOCKSIZE, BLOCKSIZE + i * BLOCKSIZE, 
						WIDTH * BLOCKSIZE, BLOCKSIZE + i * BLOCKSIZE);
		for(int i = 0 ; i < WIDTH ; ++i) {
			for(int j = 0 ; j < HEIGHT ; ++j) {
				if( omok.getState(i,j) == Omok.BLACK )
					g.fillOval( (i+1) * BLOCKSIZE - BLOCKSIZE/2, 
								(j+1) * BLOCKSIZE - BLOCKSIZE/2, 
								BLOCKSIZE, BLOCKSIZE );
				else if( omok.getState(i,j) == Omok.WHITE )
					g.drawOval( (i+1) * BLOCKSIZE - BLOCKSIZE/2, 
								(j+1) * BLOCKSIZE - BLOCKSIZE/2, 
								BLOCKSIZE, BLOCKSIZE );
			}
		}
	}
	public static void main(String args[]) {
		new OmokFrame("오목");
	}
	public int getValidLocation(int clicked) {
		if( clicked < BLOCKSIZE / 2 )
			return BLOCKSIZE;
		if( clicked > BLOCKSIZE * HEIGHT )
			return BLOCKSIZE * HEIGHT;
		return clicked % BLOCKSIZE >= BLOCKSIZE / 2 
				? (clicked / BLOCKSIZE + 1) * BLOCKSIZE
				: clicked / BLOCKSIZE * BLOCKSIZE;
	}
	public int getIndexFromCoordinate(int c) {
		return c / BLOCKSIZE - 1;
	}
	
	class PutStoneListener implements MouseListener {
		JFrame parent;
		public PutStoneListener(JFrame parent) {
			this.parent = parent;
		}
		public void mouseClicked(MouseEvent ev) {
			int x = getIndexFromCoordinate( getValidLocation( ev.getX() ) );
			int y = getIndexFromCoordinate( getValidLocation( ev.getY() + 25 ) );
			String message;
			omok.putStone(x, y);
			if( omok.is33(x,y) ) {
				message = "33입니다. 다시 하세요.";
				JOptionPane.showMessageDialog(parent, message);
				omok.clearStone(x,y);
			}
			else if( omok.doesAnyoneWin(x,y) ) {
				message = omok.getTurnSymbol() + "이 이겼습니다.";
				JOptionPane.showMessageDialog(parent, message);
				System.exit(0);				
			}
			else {
				omok.toNextTurn();
				message = omok.getTurnSymbol() + "차례입니다.";
				JOptionPane.showMessageDialog(parent, message);
			}			 
			repaint();
		}
		public void mousePressed(MouseEvent ev) {}
		public void mouseReleased(MouseEvent ev) {}
		public void mouseEntered(MouseEvent ev) {}
		public void mouseExited(MouseEvent ev) {}
	}
}

OmokTestCase.java

~cpp 
import junit.framework.TestCase;

public class OmokTestCase extends TestCase {
	final static int BLACK = 1;
	final static int WHITE = 2;
	Board board;
	Omok omok;
	int width, height;
	
	public OmokTestCase(String arg) {
		super(arg);
	}
	public void setUp() {
		width = height = 5;
		board = new Board(width, height);
		omok = new Omok(board);
	}
	public void testCreationBoard() {
		for(int i = 0 ; i < height ; ++i)
			for(int j = 0 ; j < width ; ++j)
				assertEquals(0,board.getState(j,i));
	}
	public void testPutStone() {
		int turnSet[] = {BLACK, WHITE, BLACK, BLACK};
		int xSet[] = {0,0,0,1};
		int ySet[] = {0,1,1,0};
		int expectedSet[] = {BLACK, WHITE, WHITE, BLACK};
		
		for(int i = 0 ; i < expectedSet.length ; ++i) {
			board.putStone(turnSet[i],xSet[i],ySet[i]);
			assertEquals(expectedSet[i],board.getState(xSet[i],ySet[i]));
		}
	}
	public void testCheckInBoard() {
		assertEquals( true, board.isInBoard(0,4) );
		assertEquals( true, board.isInBoard(4,0) );
		assertEquals( false, board.isInBoard(5,0) );
		assertEquals( false, board.isInBoard(-1,6) );
	}
	private void checkBoard(int turnSet[][][], int lastTurn, int x, int y, 
								boolean expected) {
		for(int i = 0 ; i < turnSet.length ; ++i) {
			for(int j = 0 ; j < turnSet[i].length ; ++j) {
				board.putStone(i+1, turnSet[i][j][0], turnSet[i][j][1]);
				assertEquals(false, 
					omok.doesAnyoneWin(turnSet[i][j][0], turnSet[i][j][1]));
			}
		}		
		board.putStone(lastTurn, x, y);
		assertEquals(expected, omok.doesAnyoneWin(x, y));
	}
	public void testCheckHeight() {
		int turnSet[][][] = { {{0,0},{0,1},{0,2},{0,4}}, {{1,0},{1,1},{1,2},{1,3}} };
		checkBoard(turnSet, BLACK, 0, 3, true);
	}
	public void testCheckWidth() {
		int turnSet[][][] = { {{0,0},{1,0},{2,0},{3,0}}, {{0,1},{1,1},{2,1},{3,1}} };
		checkBoard(turnSet, BLACK, 4, 0, true);
	}
	public void testCheckBackSlashDirection() {
		int turnSet[][][] = { {{0,0},{1,1},{2,2},{3,3}}, {{0,1},{1,2},{2,3},{3,4}} };
		checkBoard(turnSet, BLACK, 4, 4, true);
	}
	public void testCheckSlashDirection() {
		int turnSet[][][] = { {{4,0},{3,1},{2,2},{1,3}}, {{0,1},{1,2},{2,3},{3,4}} };
		checkBoard(turnSet, BLACK, 0, 4, true);	
	}
	public void test6() {
		width = height = 6;
		board = new Board(width, height);
		omok = new Omok(board);
		int turnSet[][][] = { {{0,0},{0,1},{0,2},{0,3},{0,5}}, {{1,0},{1,1},{1,2},{1,3},{1,5}} };			
		checkBoard(turnSet, BLACK, 0, 4, false);		
	}
	public void test33() {
		int turnSet[][][] = { {{0,0},{2,0},{0,2},{2,2}}, {{3,3},{4,4},{3,4},{4,3}} };
		checkBoard(turnSet, BLACK, 1, 1, false);	
		assertEquals(true, omok.is33(1, 1));
	}
}

OmokUITestCase.java

~cpp 
import junit.framework.TestCase;

public class OmokUITestCase extends TestCase {
	OmokFrame of;
	public OmokUITestCase(String arg) {
		super(arg);
	}
	public void setUp() {
		of = new OmokFrame("오목");		
	}
	public void testPutStoneToValidLocation() {
		assertEquals( 50, of.getValidLocation(50) );
		assertEquals( 100, of.getValidLocation(80) );
		assertEquals( 100, of.getValidLocation(120) );
		assertEquals( 50, of.getValidLocation(15) );
		assertEquals( 550, of.getValidLocation(589) );
	}
	public void testCoordinateToArrayIndex() {
		assertEquals( 0, of.getIndexFromCoordinate(50) );
		assertEquals( 1, of.getIndexFromCoordinate(100) );
	}
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.0868 sec