目录

TDD实战(三)“井字游戏” 需求二

需求2


现在处理轮到哪个玩家落子问题。

需要提供一种途径,用于判断接下来该谁落子。

将需求分成三个测试:

  • 玩家 X 先下;
  • 如果上一次是 X 下的,接下来将轮到 O 下。
  • 如果上一次是 O 下的,接下来将轮到 X 下。

测试用例1


import static org.junit.Assert.*;

……

@Test
public void givenFirstTurnWhenNextPlayerThenX(){
    assertEquals('X', ticTacToe.nextPlayer());
}

在这条用例中用到了 JUnit 的断言方法 assertEquals(),通过 nextPlayer() 判断下一个下棋的是否是 X 玩家。

实现代码1

对于当前的测试用例来说,根本不需要检查玩家 X 是否先下,因为就目前而言,只需要让 nextPlayer() 返回 X 就能让测试释通过。

在 TicTacToe 类中添加 nextPlayer() 方法。

public char nextPlayer() {
    return 'X';
}

** 执行 测试用例1 检查它是否运行通过。

测试用例2


现在需要确保让玩家轮流下,玩家 X 下棋后,应轮到玩家 O, 然后再轮到玩家 X, 以此类推:


@Test
public void givenLastTurnWasXWhenNextPlayerThenO(){
    ticTacToe.play(1,1);
    assertEquals('O', ticTacToe.nextPlayer());
}
实现代码2

如果前一次是玩家 X 下的,接下来应该轮到玩家 O。

……

private char lastPlayer = '\0';

public void play(int x, int y){
    checkAxis(x);
    checkAxis(y);
    setBox(x, y);
    lastPlayer = nextPlayer();
}

public char nextPlayer() {
    if(lastPlayer == 'X'){
        return 'O';
    }
    return 'X';
}

……

** 执行 测试用例2 检查它是否运行通过。

测试用例3


如果前一次是玩家 O 下的,接下来应该是玩家 X 下。

@Test
public void givenLastTurnWasXWhenNextPlayerThenX(){
    ticTacToe.play(1,1);
    ticTacToe.play(1,2);
    assertEquals('X', ticTacToe.nextPlayer());
}

即使什么也不做这一条用例,这个测试也可以通过。 因此它毫无用处,应用删除。

原始封面

https://images.unsplash.com/photo-1524749292158-7540c2494485?w=300