“井字游戏”需求文档
“井字游戏”是两个人使用纸和笔玩的一种游戏,双方轮流在一个3×3的网格中画X
和O
,最先在水平、垂直或对角线上将自己的三个标记连接起来的玩家获胜
需求 1 落子检查
首先应该定义边界,以及将棋子放在那些地方是非法的。
可将需求分成三个测试 :
- 如果棋子放在超出
X
轴边界的地方,就引发RuntimeException
异常 - 如果棋子放在超出
Y
轴边界的地方,就引发RuntimeException
异常 - 如果棋子放在已有棋子的地方,就引发
RuntimeException
异常
测试1
首先检查棋子是否放在3×3棋盘的边界内
/**
* 需求1:当棋子超出X轴边界时,抛出RuntimeException
*/
@Test
public void whenXOutsideBoardThenRuntimeException(){
exception.expect(RuntimeException.class);
ticTacToe.play(5,2);
}
实现1
public void play(int x,int y){
if(x < 1 || x >3 ){
throw new RuntimeException("X is outside board");
}
}
测试2
/**
* 需求1:当棋子超出Y轴边界时,抛出RuntimeException
*/
@Test
public void whenYOutsideBoardThenRuntimeException(){
exception.expect(RuntimeException.class);
ticTacToe.play(2,5);
}
实现2
public void play(int x,int y){
if(x < 1 || x > 3 ){
throw new RuntimeException("X边界检查不通过");
}else if(y < 1 || y > 3){
throw new RuntimeExceptioin("Y边界检查不通过");
}
}
测试3
/**
* 需求1:如果棋子放在已有棋子的地方,就引发RuntimeException异常
*/
@Test
public void whenOccupiedThenRuntimeException(){
ticTacToe.play(1,1);
exception.expect(RuntimeException.class);
ticTacToe.play(1,1);
}
实现3
private char[][] board = new char[3][3];
public void play(int x,int y){
if(x < 1 || x > 3 ){
throw new RuntimeException("X边界检查不通过");
}else if(y < 1 || y > 3){
throw new RuntimeExceptioin("Y边界检查不通过");
}
if (board[x][y] != 0){
throw new RuntimeException("存在重复棋子");
}
board[x][y] = 'X';
}
重构
以上代码虽然能满足测试指定需求,但是可读性差。应重构这个方法,将该方法拆分(Extract Method
)。重构后的代码如下:
private char[][] board = new char[3][3];
public void play(int x,int y){
checkAxis(x);
checkAxis(y);
dropChessman(x,y);
}
/**
* 落子
* @param x
* @param y
*/
private void dropChessman(int x, int y) {
if (board[x][y] != 0){
throw new RuntimeException("存在重复棋子"