# TDD实战（三）“井字游戏” 需求二




### 需求2
---

现在处理轮到哪个玩家落子问题。

>  需要提供一种途径，用于判断接下来该谁落子。

将需求分成三个测试：

* 玩家 X 先下；
* 如果上一次是 X 下的，接下来将轮到 O 下。
* 如果上一次是 O 下的，接下来将轮到 X 下。

#### 测试用例1
---

```Java
import static org.junit.Assert.*;

……

@Test
public void givenFirstTurnWhenNextPlayerThenX(){
    assertEquals('X', ticTacToe.nextPlayer());
}

```

在这条用例中用到了 JUnit 的断言方法 `assertEquals()`，通过 `nextPlayer()` 判断下一个下棋的是否是 X 玩家。

##### 实现代码1

对于当前的测试用例来说，根本不需要检查玩家 X 是否先下，因为就目前而言，只需要让 `nextPlayer()` 返回 X 就能让测试释通过。

在 TicTacToe 类中添加 `nextPlayer()` 方法。

```Java
public char nextPlayer() {
    return 'X';
}
```

** __执行 测试用例1 检查它是否运行通过。__


#### 测试用例2
---
现在需要确保让玩家轮流下，玩家 X 下棋后，应轮到玩家 O， 然后再轮到玩家 X， 以此类推：

```Java

@Test
public void givenLastTurnWasXWhenNextPlayerThenO(){
    ticTacToe.play(1,1);
    assertEquals('O', ticTacToe.nextPlayer());
}
```


##### 实现代码2

如果前一次是玩家 X 下的，接下来应该轮到玩家 O。

```Java
……

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 下。

```Java
@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)


