“井字游戏”需求文档

本文档详细描述了井字游戏的需求,包括落子检查、玩家轮流落子检查和胜利条件测试。每个需求都分为测试和实现部分,并进行了必要的重构。文章强调了以测试驱动开发的思路,以及代码的可读性和重构的重要性。
摘要由CSDN通过智能技术生成

“井字游戏”需求文档

“井字游戏”是两个人使用纸和笔玩的一种游戏,双方轮流在一个3×3的网格中画XO,最先在水平、垂直或对角线上将自己的三个标记连接起来的玩家获胜

需求 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("存在重复棋子"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值