五子棋游戏

五子棋游戏

关于画布

五子棋游戏中绘制棋盘时是需要用到画布,当然画布要从一个面板上得到,然后在画布上进行绘制横线和竖线得到画布用的方法是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, "白棋赢了!");
        }
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值