本项目需要用到继承、接口、监听器等进阶方法。
首先,创建一个Gobang类。因为要满足下棋的功能,所以需要一个能展示棋盘、棋子的窗口(界面),因此在创建Gobang类后,需要用extends继承JFrame窗口类。然后在该类下编写主方法并创建一个对象,取名为go。
接下来是创建一个窗口。我们可以把窗口的创建写成一个方法(命名为initUI),让方法接收一个项目名(例如“AI”),并返回空值。因为它继承了JFrame,所以也继承了JFrame中的属性和方法,因此直接调用方法使窗口可视化(true)、布局(居中并去掉默认布局)。到此时,initUI这个方法暂时写好了。
下一步我们需要绘制一个棋盘。同样的先创建一个方法(命名为paint1)。用super继承paint中已拥有的方法,然后绘制棋盘,用循环的方式画好横线和竖线即可。此方法的编写结束。
接下来需要完成“鼠标点击操纵下棋”的功能。这时就要引用鼠标监听器了。先新建一个Class(命名为MyListener)并implements上MouseListener。鼠标移动到“MouseListener”上,按住“Ctrl”键点击它,会进入到源代码页面。将源代码中所有内容(用不到的也需一起)拷贝到MyListener类中。在MouseListener中有五个方法,分别是“鼠标点击”、“鼠标按住”、“鼠标松开”、“鼠标进入(界面)”和“鼠标离开(界面)”,在这里我们选择用“鼠标点击”的方法下棋。所以后续代码都写在“mouseClicked”中。通过调用“MouseEvent”中的方法可以获取到鼠标点击时的坐标(x,y),然后通过计算调整位置使得棋子落在交叉点上,用flag选择黑棋和白棋。最后需要回到Gobang里添加注册监听器对象。
再之后就是判断输赢了。为了记录已经下过的棋子的位置和颜色,我们可以采用二维数组。用0表示没有棋子,1表示黑棋,2表示白棋。这样既能储存棋子还能辨识颜色,为判断胜负铺好了道路。判断胜负有两种常规方法;方法一:枚举出所有可以获胜的情况;方法二:考察刚下的那颗棋子,向四个大方向(八个小方向)搜索能否触发获胜的条件。方法一的代码会比较多但是思考量较少,方法二则相反。两种方法各有千秋,个人更倾向于方法二。
接下来的一步是添加“开始游戏”、“悔棋”和“结束游戏”的功能。这一步需要再添加一个按钮类并创建两个按钮对象,还需要在创建的监听器”MyListener“后接上一个“ActionListener”用于监听按钮是否被点击。然后在“MyListener”中编写一个名为actionPerformed的方法用于监听按钮是否被点击和通过事件获取按钮对象(注意,我们也需要回到Gobang里添加按钮对象并把它添加到窗口上,设置位置)。为了记录棋子,我们再创建一个棋子类(命名为Chess)用于储存棋子的信息,包括所在行列、索引(第几步棋)、颜色(flag,黑1白2)。创建完毕后给Chess类 编写一个构造方法,该方法接收棋子所在的行列、索引、颜色。再创建一个一维数组(命名为ChessList)用于储存记录步数。回到MyListener中,将每一个符合条件的棋子都录入Chess里;再回到Gobang中重新编写一次下棋的方法(命名为paint2),与之前在MyListener中的下棋方法有所不同的是,只下ChessList中count-1颗棋子(即满足悔一步棋)。最后回到MyListener中编写“开始游戏”、“悔棋”和“结束游戏”即可。
“开始游戏”、“悔棋”和“结束游戏”的编写并不复杂。注意到“开始游戏”和“结束游戏”不会同时出现且是交替出现的情况,可以用flag完成。注意,“结束游戏”时要将所有的Chess类中的信息“清零”并将ChessLIst“清零”、储存棋子的二维数组“清零”。”悔棋“的编写稍微复杂,需要注意调用Chess中棋子的个数问题。
以上便是创作一个简易五子棋的主要步骤概括。