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

1.3 创建游戏的各个对象

这里设计三个类来完成游戏的功能:棋盘类(Chessboard),游戏类(GobangGame)与棋子类(Chessman)(枚举类),类的关系如图1.2所示。从图中可以看出,Chessboard依赖于GobangGame,GobangGame的改变,会影响到Chessboard状态的改变,而Chessman与GobangGame是一个聚合关系。下面一一介绍。

图1.2 五子棋类图

1.3.1 Chessboard类

要进行五子棋游戏,必须要有一个棋盘,而这个类主要控制棋盘的初始化、输出及增加新的棋子。这个类包含以下方法:

void initBoard(),这个方法用于初始化棋盘,开始新的游戏时,应该调用此方法,初始化出一个新的空棋盘。

void printBoard(),此方法用于在控制台输出棋盘,各方每下完一颗棋子后,由于棋盘上棋子的状态有改变,所以必须调用此方法重新输出棋盘。

void setBoard( int posX , int posY , String chessman ),posX与posY是新下棋子的x与y坐标,chessman是新下棋子的类型(黑子与白子),每下完一颗棋子后,通过调用此方法把棋子设置到棋盘上。

String[][] getBoard(),返回棋盘,返回类型是保存棋盘的二维数组。

当需要初始化棋盘的时候,可以直接调用Chessboard的initBoard方法,我们需要考虑该方法要实现的功能:初始化棋盘。由于我们将棋盘看做是一个二维数组,因此initBoard需要帮我们创建一个二维数组,创建二维数组可以使用以下代码:

代码清单:code\gobang\src\org\crazyit\gobang\Chessboard.java

    Object[][] array = new Object[size][size];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            array[i][j] = new Object();
        }
    }

以上代码创建了一个固定大小(一维与二维大小)的二维数组,并通过嵌套循环为数组中的每一个元素进行赋值。在游戏中如果我们进行了下棋的操作,可以直接改变这个数组的某一个元素值。在创建Chessboard类时,我们就需要发挥面向对象的思维,在我们的程序中,所有看到的或者想到的事物,我们都可以将其抽象成具体的某个对象,并赋予一定的属性与行为。在设计对象的过程中,如果有某些事物拿捏不准,不知如何设计属性或者行为,可以将其设计成接口或者抽象类。

Chessboard中提供了一个printBoard方法用于打印棋盘,在本章中,我们只需要将棋盘数组打印到控制台中,因此该方法可以简单地调用System.out.print去打印相关的字符串。需要注意的是,由于printBoard方法是没有参数的,因此我们需要为Chessboard提供一个二维数组变量,当调用printBoard方法的时候,打印对象内的二维数组。我们可以将Chessboard看做一个有状态的Java对象,有状态的Java对象可以理解成一个Java对象保存了一些与该对象相关的状态属性,如果该对象没有保存与该对象相关的状态属性,那么我们可以将这个对象看成一个无状态的Java对象。

当外部调用Chessboard的setBoard方法时,就可以将某个值设置到Chessboard中的

二维数组里,告诉Chessboard玩家或者“电脑”在某个位置下了怎样的棋子。

1.3.2 Chessman类

Chessman类是一个枚举类,此类是构造器私有的,不能直接创建,里面有BLACK与WHITE两个静态属性,代表黑子与白子枚举类,两个静态属性都是Chessman类型的。要获取棋子,需要通过这两个属性调用以下的方法:

String getChessman(),返回String类型的棋子实例,“●”或者“○”。

如果需要得到棋子的字符串(“●”或者“○”),可以使用以下的代码:

代码清单:code\gobang\src\org\crazyit\gobang\Chessman.java

    Chessman.BLACK.getChessman();

1.3.3 GobangGame类

GobangGame类是进行游戏的类,Chessboard依赖于此类,此类负责控制游戏的开始、重玩与结束,并影响Chessboard类。它主要包含以下构造器与方法:

GobangGame(),默认无参数构造器。

GobangGame( Chessboard chessboard ),有参数构造器,以一个Chessboard实例去初始化这个类。

boolean isValid( String inputStr ),此方法验证控制台的输入字符串是否合法,如果合法,返回true,否则返回false。此方法抛出Exception异常。

void start(),开始游戏。此方法抛出Exception异常。

boolean isReplay( String chessman ),是否重新开始游戏,如果是,返回true,否则返回false,参数chessman代表黑子或白子。

int[] computerDo(),“电脑”随机下棋,由“电脑”自动设置棋盘,并返回包含新下棋子位置x与y坐标的int[]数组类型。

boolean isWon( int posX , int posY , String ico ),判断输赢,参数posX与posY代表新下棋子的x与y坐标,ico代表新下的棋子类型,如果赢了,返回true,否则返回false。

GobangGame是我们五子棋游戏的主体类,游戏里面所有的处理都在该类中实现。GobangGame中的isValid方法用于验证控制台的输入,玩家主要在控制台输入下棋的坐标,下棋的坐标的字符串形式为:x,y,我们需要对字符串进行处理得到x和y的值,如果玩家输入的字符串不符合系统要求,则isValid方法返回false,只有当该方法返回true的时候,才会去修改Chessboard二维数组。

GobangGame中提供了一个start方法,用于游戏的开始,我们需要考虑游戏开始的行为,例如需要初始化棋盘(调用Chessboard的initBoard方法),需要开始从控制台读取玩家的输入信息、打印棋盘和验证控制台输入的信息等,这些功能我们将在下面的章节中加以描述。

当轮到“电脑”下棋的时候,我们需要随机生成其下棋坐标,GobangGame中的computerDo方法用于随机产生坐标。

判断一局游戏是否胜利,可以调用GobangGame的isWon方法,该方法是五子棋中最主要的方法,五子棋是否可以相连的所有逻辑,都会在该方法中实现。isWon方法会在每次下棋后(玩家下棋或者“电脑”下棋)调用。

至此,游戏中的三个对象已经设计完成,这三个对象中已经定义好了各种方法,并在前面章节中详细描述了各个方法的作用,在下面章节中我们将开始对这三个对象所定义的方法进行实现。当然,如果需要做到更好的程序解耦,我们可以使用一些设计模式,例如将游戏规则写成一个具体的算法,可以使用策略模式,如果需要产生出不同的棋子(将控制台换成其他界面),可以编写棋子工厂等。但是本章的主要目的是展现一个最简单的五子棋,因此本章中并不涉及任何具体的设计模式。