疯狂Java实战演义
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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语言的基本操作,例如嵌套循环、创建二维数组等。在下面的章节中,我们将实现游戏的核心部分。