Java变色方块小游戏

变色

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

/**

 * 开窗户游戏。当你点击游戏界面中的一个正方形按钮时, 它周围的正方形按钮的颜色就会发生变化,当全部正方形按钮的颜色变为一色时,你就胜利了

 */

public class 变色方块 {

    public static void main(String[] args) {

        JFrame frame = new JFrame("开窗户游戏");

        frame.getContentPane().add(new MainPanel());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();

        frame.setVisible(true);

    }

}

/**

 * 主面板

 */

class MainPanel extends JPanel {

    SquarePanel pc = new SquarePanel();

    ControlPanel ps = new ControlPanel(pc);

    public MainPanel() {

        this.setLayout(new BorderLayout());

        this.add(pc, "Center");

        this.add(ps, "South");

    }

}

/**

 * 方块的面板

 */

class SquarePanel extends JPanel {

// 包括25个窗户按钮

    JButton[] winbutton = new JButton[25];

    Color c;

    public SquarePanel() {

// 面板采用网格布局管理器

        this.setLayout(new GridLayout(5, 5));

        for (int i = 0; i < 25; i++) {

            winbutton[i] = new JButton();

            winbutton[i].setActionCommand(String.valueOf(i));

// 获得默认颜色

            c = winbutton[i].getBackground();

            winbutton[i].addActionListener(new OpenWindowListener());

            this.add(winbutton[i]);

        }

// 面板大小值为300*300

        this.setPreferredSize(new Dimension(300, 300));

    }

    /**

     * 单击一个窗户按钮时引起开窗户事件

     */

    class OpenWindowListener implements ActionListener {

        public void actionPerformed(ActionEvent a) {

// 获取被点击窗户的ID

            int x = Integer.parseInt(a.getActionCommand());

// 设置被点击窗户被选。

            select(x);

// 判断是否胜利

            isWin();

        }

// 当一个窗户被选中时进行的操作。需要改变周围窗户的颜色。

        private void select(int x) {

            if (x == 0) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x + 1]);

                changeColor(winbutton[x + 5]);

            } else if (x > 0 && x < 4) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 1]);

                changeColor(winbutton[x + 1]);

                changeColor(winbutton[x + 5]);

            } else if (x == 4) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 1]);

                changeColor(winbutton[x + 5]);

            } else if (x == 20) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 5]);

                changeColor(winbutton[x + 1]);

            } else if (x == 24) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 5]);

                changeColor(winbutton[x - 1]);

            } else if (x > 20 && x < 24) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 5]);

                changeColor(winbutton[x - 1]);

                changeColor(winbutton[x + 1]);

            } else if (x % 5 == 0) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 5]);

                changeColor(winbutton[x + 1]);

                changeColor(winbutton[x + 5]);

            } else if (x % 5 == 4) {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 5]);

                changeColor(winbutton[x - 1]);

                changeColor(winbutton[x + 5]);

            } else {

                changeColor(winbutton[x]);

                changeColor(winbutton[x - 5]);

                changeColor(winbutton[x - 1]);

                changeColor(winbutton[x + 1]);

                changeColor(winbutton[x + 5]);

            }

        }

// 改变周围颜色函数。

        private void changeColor(JButton winbutton) {

// 如果窗户的颜色是初始颜色,则变成白色。

            if (winbutton.getBackground() == c) {

                winbutton.setBackground(Color.white);

            } else {

// 如果窗户的颜色不是初始颜色,则变成初始颜色

                winbutton.setBackground(c);

            }

        }

// 判断是否胜出

        private void isWin() {

            int a = 1;

// 当25个窗户都变成白色时,获胜

            for (int i = 0; i < 25; i++) {

                if (winbutton[i].getBackground() == Color.white) {

                    a++;

                }

            }

            if (a > 25) {

                JOptionPane.showMessageDialog(null, "恭喜过关");

            }

        }

    }

}

/**

 * 控制面板

 */

class ControlPanel extends JPanel {

    JLabel label = new JLabel("开窗户游戏");

// 游戏重新开始按钮

    JButton restart = new JButton("重置");

    SquarePanel pc;

    /**

     * 构造函数,参数为待控制的窗户面板

     */

    public ControlPanel(SquarePanel pc) {

        this.pc = pc;

        restart.addActionListener(new Reset());

        this.add(label);

        this.add(restart);

    }

    /**

     * 重设窗户面板,将所有窗户变成初始颜色

     */

    class Reset implements ActionListener {

        public void actionPerformed(ActionEvent a) {

            for (int i = 0; i < 25; i++) {

                pc.winbutton[i].setBackground(pc.c);

            }

        }

    }

}

end

评论

新增邮件回复功能,回复将会通过邮件形式提醒,请填写有效的邮件!