看完第三课之后做习题,怎么做都觉得不合适,于是留到看完第四课再做的。
1、将Pawn类修改成Piece。
先修改测试:
@Test
public void testCreate() {
Piece piece = Piece.createPiece("white","Pawn");
assertEquals("white", piece.getColor());
assertEquals("Pawn", piece.getName());
}
在修改Pawn类为Piece,并使其通过测试。
public class Piece {
private String color ;
private String name;
private Piece(String color, String name) {
this.color = color;
this.name = name;
}
public static Piece createPiece(String color, String name) {
return new Piece(color, name);
}
public String getColor() {
return color;
}
public String getName() {
return name;
}
}
2、按照题目修改BoardTest,并修改Board使其通过测试,得到最简单的Board代码如下:
public class Board {
public void initialize() {
}
public int pieceCount() {
return 32;
}
public String print() {
return "RNBQKBNR\n" +
"PPPPPPPP\n" +
"........\n" +
"........\n" +
"........\n" +
"........\n" +
"pppppppp\n" +
"rnbqkbnr\n";
}
}
这个明显是不对的,但是的确又能够通过测试(很大的可能是我跳过了第三课的习题)。只要能够通过测试,就可以先不管,进而进行下一步。
3、测试Board包含了16个黑棋,16个白棋。
先在Board中testCreate添加测试代码:
assertEquals(16, board.blackPieceCount());
assertEquals(16, board.whitePieceCount());
相应的修改Board代码:
public int blackPieceCount() {
return 16;
}
public int whitePieceCount() {
return 16;
}
现在在反过来看第三课的习题,会发现我错过了一个约定:用小写字母表示白棋,大写字母表示黑棋。同时在Board中存储Piece(开始是Pawn),在initialize中完成为棋盘添加棋子的操作。
4、重构:向棋盘添加棋子。
首先将测试PieceTest中的“Pawn”修改为“p”;
然后修改Board类用一个数组来表示棋盘。
private Piece pieces[][] = new Piece[8][8];
再在initialize方法中初始化这个数组:
pieces[0][0] = Piece.createPiece("black", "R");
pieces[0][1] = Piece.createPiece("black", "N");
pieces[0][2] = Piece.createPiece("black", "B");
pieces[0][3] = Piece.createPiece("black", "Q");
pieces[0][4] = Piece.createPiece("black", "K");
pieces[0][5] = Piece.createPiece("black", "B");
pieces[0][6] = Piece.createPiece("black", "N");
pieces[0][7] = Piece.createPiece("black", "R");
for(int i = 0; i<8; i++) {
pieces[1][i] = Piece.createPiece("black", "P");
pieces[6][i] = Piece.createPiece("white", "p");
}
pieces[7][0] = Piece.createPiece("white", "r");
pieces[7][1] = Piece.createPiece("white", "n");
pieces[7][2] = Piece.createPiece("white", "b");
pieces[7][3] = Piece.createPiece("white", "q");
pieces[7][4] = Piece.createPiece("white", "k");
pieces[7][5] = Piece.createPiece("white", "b");
pieces[7][6] = Piece.createPiece("white", "n");
pieces[7][7] = Piece.createPiece("white", "r");
再用类属性来表示piece数量:
private int pieceCount = 0;
private int blackPieceCount = 0;
private int whitePieceCount = 0;
在initialize中初始化:
pieceCount = 32;
whitePieceCount = 16;
blackPieceCount = 16;
5、重构修改print(),使其按照存储的piece来打印:
StringBuilder builder = new StringBuilder();
for(Piece tempPieces[] : pieces) {
for(Piece piece : tempPieces) {
if(piece == null) {
builder.append(".");
} else {
builder.append(piece.getName());
}
}
builder.append("\n");
}
return builder.toString();