五子棋(一)

一、做一个界面

之前做界面用JFrame,为了把面板分块使用(将按钮组件和整个棋盘分开),现在用JPanle容器组件(JPanle将面板划分为五个区块)

需要用到的类:JFrame
BorderLayout 边框布局,把容器分为5部分,上北下南左西右东中间
JPanel 面板容器组件
FlowLayout
Dimension 封装组件宽度和高度的类
JButton
JLabel
JRadioButton 单选按钮
ButtonGroup 单选按钮分组类
Graphics
MouseListener|MouseAdapter
MouseEvent
ActionListener
ActionEvent

 1.界面的实现

定义FiveChessUI类,让继承JPanel
public class FiveChessUI extends JPanel {

public void initUI(){
//实例化JFrame对象设置属性

//将棋盘面板添加到窗体上的中间

//创建一个JPanel,添加按钮,面板添加到窗体的东边

                     //增加监听事件

}

public void paint(Graphics g) {//重写JPanle中的paint方法
super.paint(g);
//绘制棋盘
}

}

2.下棋子

首先要考虑把棋子绘制到距离点击位置最近的棋盘交叉坐标上,这就需要思考一下,如何计算出交点坐标(并将棋子下到对应位置上)。

下面是两种找位置的计算方法

还有画棋子时需要注意棋子要黑白交替的出现




下棋子的时候还有一个细节需要注意:不能在下过棋子的地方再下棋!这样我们定义一个二维数组来存储下过棋子的情况(后面判断输赢也要用到),初始时二维数组数值都为0(表示全部位置都还没有棋子),然后可以设下过黑棋的位置为1,下过白棋的位置为2。




3.判断输赢

判断输赢的思路很简单,就是找棋子水平,垂直,左斜和右斜四个方向上是否有五个相同颜色的棋子相连。

每次画完棋子都需调用判断输赢的方法对其进行判断。


4.重绘棋子

与画板的重绘一样,改变窗体大小而棋子不消失,则需要重绘棋子,即重写父类的paint()方法。


加背景图要写在调用画棋盘和画棋子的方法前面才能执行的,因为代码的执行是有先后顺序的。

5.重新开始游戏和悔棋

点击重新开始游戏时,需要把棋盘上的棋子都清除。这只需要循环遍历存储棋子的数组,然后把数组的值赋为0就可以了。



悔棋则需要记录上一步所下的棋子的位置,并将该位置的棋子数组值赋为0(还要将棋子的颜色改变),最后还要调用repaint()方法。如果需要悔棋多个的话,就要将每次下的棋子的位置按顺序存入另外一个数组中了(这个我感觉有点混乱,就不细写了)


还有在绘制棋盘和棋子时有些常量(如棋盘中的间距,行列数,棋子大小)我们可以把它放到一个接口中,然后哦实现这个接口,这样方便数据的修改。