1.4 棋盘类实现
在此类中,主要是用一个String[][]类型的二维数组board去保存棋盘,board[i][j]代表棋盘的某个位置(i代表x坐标,j代表y坐标),如果此位置没有棋子,默认值为“十”,如果有棋子,则board[i][j]的值为“●”或者“○”。用一个不可改变的常量BOARD_SIZE来表示棋盘的大小,所以保存这个棋盘的是一个BOARD_SIZEBOARD_SIZE的二维数组。图1.3描述了为什么需要使用一个二维数组来代表一个棋盘。如果把棋盘的一列当做一个数组,那么N列的棋盘就是一个二维数组,用数组能很好地存储与表现这个棋盘。
图1.3 棋盘与数组的关系
1.4.1 初始化棋盘
在1.3节中介绍过,此类主要是实现棋盘初始化、输出与更新,本节便用代码一步一步地实现各个功能。首先我们需要初始化棋盘的实现,看以下代码片段。
代码清单:code\gobang\src\org\crazyit\gobang\Chessboard.java
public void initBoard() { //初始化棋盘数组 board = new String[BOARD_SIZE][BOARD_SIZE]; //把每个元素赋值为“十”,用于控制台输出棋盘 for( int i = 0 ; i < BOARD_SIZE ; i++ ) { for( int j = 0 ; j < BOARD_SIZE ; j++ ) { board[i][j] = "十"; } } }
上面的代码中,BOARD_SIZE代表棋盘的大小,用一个String[][]类型的二维数组来代表棋盘,创建此数组后,通过迭代将各个数组元素的值赋为“十”来初始化棋盘。创建了棋盘数组后,如果需要定位到棋盘的某个位置,只需要得到棋盘数组的一维值与二维值即可,例如处理玩家下棋动作的时候,可以将数组中具体的某个“十”替换成具体的棋子字符串。
1.4.2 输出棋盘
输出棋盘,只需将Chessboard的board属性(二维数组)的每一个值打印到控制台中。要做到更好的可扩展性,我们可以在二维数组中存放棋子对象,而不是简单的字符串,而存放在二维数组中的每一个棋子对象,都可以实现某个棋子接口或者继承棋子的抽象类。当然,在本章我们为了简单起见,只在该二维数组中存放需要打印的字符串,打印时只需得到具体的某个二维数组的元素即可。
代码清单:code\gobang\src\org\crazyit\gobang\Chessboard.java
public void printBoard() { //打印每个数组元素 for( int i = 0 ; i < BOARD_SIZE ; i++ ) { for( int j = 0 ; j < BOARD_SIZE ; j++ ) { //打印后不换行 System.out.print( board[i][j] ); } //每打印完一行数组元素就换行一次 System.out.print("\n"); } }
棋盘的输出与棋盘的初始化相类似,都要遍历保存棋盘的数组,只不过每遍历到一个元素都要输出,注意这里的输出方法用的是System.out.print()而不是常用的System.out.println(),这是因为System.out.println()方法是输出后自动换行的,如果使用此方法,便达不到我们需要的效果,棋盘的输出效果如图1.4所示。
图1.4 控制台五子棋的棋盘
打印出来的效果,就好像在控制台中出现了一个棋盘。
1.4.3 获取棋盘
在Chessboard中提供了一个getBoard方法,用于返回本对象的棋盘二维数组,该方法一般在游戏类GobangGame中调用,游戏类得到棋盘的二维数组,可以用来判断棋盘中的某一个位置是否有棋子或者游戏是否胜利。
getBoard方法只需将本对象中的board(二维数组)返回即可,代码如下。
代码清单:code\gobang\src\org\crazyit\gobang\Chessboard.java
/** * 返回棋盘 * @return 返回棋盘 */ public String[][] getBoard() { return this.board; }
至此,棋盘类的几个方法都已经实现,该类的主要功能是创建棋盘、打印棋盘等,实现的过程中涉及了一些Java语言的基本操作,例如嵌套循环、创建二维数组等。在下面的章节中,我们将实现游戏的核心部分。