五子棋游戏

来源:互联网 发布:文章植入广告软件 编辑:程序博客网 时间:2024/05/02 18:50

五子棋游戏

关于画布

五子棋游戏中绘制棋盘时是需要用到画布,当然画布要从一个面板上得到,然后在画布上进行绘制横线和竖线得到画布用的方法是graphics=panel.getGraphics();那么接下来就可以绘制棋盘了。

这里以绘制十行十列棋盘为例
        // 棋盘面板        JPanel panel_grid = new JPanel() {            public void paint(Graphics g) {                super.paint(g);                for (int i = 0; i < 10; i++) {                    //水平直线                    g.drawLine(10, 10 + 50 * i, 460, 10 + 50 * i);                    //垂直直线                    g.drawLine(10 + 50 * i, 10, 10 + 50 * i, 460);                }            }        }

关于paint和repaint

在窗口发生改变的时候,比如放大或缩小,就会自动调用paint()方法。而在下棋的过程中会发现如果没有将绘制棋子的方法写在paint()方法里,一旦将窗口关掉,那么棋盘上的棋子就会消失。

repaint()方法是用来调用paint()方法的,在设计重新开始一局游戏的时候直接用repaint,就会将棋子抹掉,当然还要用到一点其他的方法。

关于监听和绘制棋子

绘制棋子的时候是通过对棋盘面板pannel_grid进行鼠标监听来绘制。在绘制的时候需要将所有的棋子都记录下来,这样在重绘的时候就能画出棋盘在窗口改变前棋盘的样子,那么就需要用到一个集合ArrayList,当鼠标点击的时候就向集合中添加一颗棋子,再用循环将集合重的元素遍历。为了将棋子画在交叉点上,需要调整绘制棋子的位置。

值得注意的是在实现鼠标监听的时候,要将监听里的所有方法实现,其中内容可以是空,但不可以没有这个方法。

panel_grid.addMouseListener(new MouseListener() {//匿名内部类            @Override            public void mouseClicked(MouseEvent mouse) {                int x1 = mouse.getX();                int y1 = mouse.getY();                int x0, y0;                for (int i = 0; i <= 10; i++) {                    for (int j = 0; j <= 10; j++) {                    //x0,y0表示所有的交叉点                        x0 = 50 * i;                        y0 = 50 * j;                        //flag数组用来记住棋盘上当前位置是否已有棋子                        //0没有棋子,1为黑棋,2为白棋                        if (flag[i][j] == 0) {                            if (x0 - 50 / 3 <= x1 && x1 < x0 + 50 / 3                                    && y0 - 50 / 3 <= y1 && y1 <= y0 + 50 / 3) {                                    //flag_color是一个全局变量,用来判断是画白棋还是黑棋                                if (flag_color == 0) {                                    flag[i][j] = 1;                                    //chess也是一个全局变量,用来创建当前要画的棋子                                    chess = new Chess(x0, y0, Color.black);                                    // 黑棋                                    flag_color = 1;                                } else if (flag_color == 1) {                                    chess = new Chess(x0, y0, Color.white);                                    flag[i][j] = 2;                                    // 白棋                                    flag_color = 0;                                }                                chess.draw(graphics);                                isWin(i, j);                                //list是一个棋子集合                                list.add(chess)                            }                        }                    }                }            }            @Override            public void mouseEntered(MouseEvent arg0) {            }            @Override            public void mouseExited(MouseEvent arg0) {            }            @Override            public void mousePressed(MouseEvent arg0) {            }            @Override            public void mouseReleased(MouseEvent arg0) {            }        });

遍历集合

for (int j = 0; j < list.size(); j++) {        list.get(j).draw(g); }

由于在集合中放置的是棋子类的对象,所以就需要建立一个棋子类。而棋子其实就是一个圆盘,那么用fillOval(x, y, width, height)就可以绘制棋子了。

public class Chess {       int x, y;       Color color;       public Chess(int x, int y, Color color) {          this.color = color;          this.x = x - 5;          this.y = y - 5;       }       public void draw(Graphics g) {         g.setColor(color);         g.fillOval(x, y, 30, 30);       }     }

关于判断输赢

每下一颗棋子就需要判断四个方向是否有五颗连续相同颜色的棋子,四个方向分别是水平,垂直及对角线。那么就需要将棋盘的情况记录下来,而整个棋盘的交叉点就相当于是一个二维数组,因此在绘制一颗棋子的同时用二维数组记录下来,黑棋还是白棋。

这里给出水平方向的判断代码

public void isWin(int x, int y) {        int count = 1;        int a, b;        a = x;        b = y;        while (a > 0 && flag[a][b] == flag[a - 1][b]) {// 向左            count++;            a--;        }        a = x;        b = y;        while (flag[a][b] == flag[a + 1][b] && a < 10) {// 向右            count++;            a++;        }        if (count >= 5) {            colorWin(flag[a][b]);        }
public void colorWin(int color) {        if (color == 1) {            JOptionPane.showMessageDialog(null, "黑棋赢了!");        }        if (color == 2) {            JOptionPane.showMessageDialog(null, "白棋赢了!");        }    }
0 0
原创粉丝点击