TDD实战(六)“井字游戏” 需求四
虫师 创建于 about 7 years 之前
最后更新: less than a minute 之前
阅读数: 230
需求4
如果出现平局如何处理。
所有格子都占满则为平局。
测试用例1
可以通过填满棋盘的所有格子测试平局结果。
@Test
public void whenAllBoxesAreFilledThenDraw(){
ticTacToe.play(1,1); //X
ticTacToe.play(1,2); //O
ticTacToe.play(1,3); //X
ticTacToe.play(2,1); //O
ticTacToe.play(2,3); //X
ticTacToe.play(2,2); //O
ticTacToe.play(3,1); //X
ticTacToe.play(3,3); //O
String actual = ticTacToe.play(3,2); //X
assertEquals("The result is draw", actual);
}
实现测试1
检查是否为平局非常简单 --- 只需要检查是否已占满整个棋盘,所以,可以通过遍历数组board实现。
public String play(int x, int y){
checkAxis(x);
checkAxis(y);
lastPlayer = nextPlayer();
setBox(x, y, lastPlayer);
if(isWin()){
return lastPlayer + " is the winner";
}else if(isDraw()){
return "The result is draw";
}else {
return "No winner";
}
}
private boolean isDraw(){
for(int x = 0; x < SIZE; x++){
for(int y = 0; y < SIZE; y++){
if(board[x][y] == '\0'){
return false;
}
}
}
return true;
}
** 执行 测试用例1 检查它是否运行通过。
** 执行 所有测试用例 检查它们是否全部运行通过。
重构
虽然 isWin()
方法与最后的个测试无关,但也可以重构。
我们无须检查所有获胜条件,只需要判断与最后一个棋子的位置相关的获胜条件。
优化isWin()
方法如下:
public String play(int x, int y){
checkAxis(x);
checkAxis(y);
lastPlayer = nextPlayer();
setBox(x, y, lastPlayer);
if(isWin(x, y)){ // 传参x,y 给isWin()方法
return lastPlayer + " is the winner";
}else if(isDraw()){
return "The result is draw";
}else {
return "No winner";
}
}
……
// 优化isWin()处理逻辑
private boolean isWin(int x, int y){
int playerTotal = lastPlayer * SIZE;
char horizontal, vertical, diagonal1, diagonal2;
horizontal = vertical = diagonal1 = diagonal2 = '\0';
for(int i = 0; i < SIZE; i++){
horizontal += board[i][y - 1];
vertical += board[x - 1][i];
diagonal1 += board[i][i];
diagonal2 += board[i][SIZE - i - 1];
}
if(horizontal == playerTotal ||
vertical == playerTotal ||
diagonal1 == playerTotal ||
diagonal2 == playerTotal){
return true;
}
return false;
}
** 执行 所有测试用例 检查它们是否全部运行通过。
到此,“井字游戏” 通过TDD模式开发完成。