欢迎使用CSDN-markdown编辑器

package com.icss;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionEvent;

public class GameFrame extends JFrame {

    private int step;

    private JPanel contentPane;
    private JButton[] btnAry;
    private JLabel lblJindu;
    private JLabel lblStep;
    private JButton btnRestart;
    private JButton btnExit;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GameFrame frame = new GameFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public GameFrame() {
        step = 0;

        setTitle("\u6B22\u8FCE\u8FDB\u5165\u7FFB\u724C\u6E38\u620F");
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //废掉了x按钮的功能
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        this.setSize(464, 595);
        this.setLocationRelativeTo(this);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        //摆放游戏按钮的面板
        JPanel pnlGame = new JPanel();
        pnlGame.setBounds(0, 43, 456, 468);
        contentPane.add(pnlGame);

        //显示进度的标签
        lblJindu = new JLabel("\u5F53\u524D\u8FDB\u5EA60/81");
        lblJindu.setBounds(10, 10, 141, 23);
        contentPane.add(lblJindu);

        //显示步数的标签
        lblStep = new JLabel("\u4F7F\u7528\u4E860\u6B65");
        lblStep.setHorizontalAlignment(SwingConstants.RIGHT);
        lblStep.setBounds(305, 10, 141, 23);
        contentPane.add(lblStep);

        //重新开始按钮
        btnRestart = new JButton("\u91CD\u65B0\u5F00\u59CB");
        btnRestart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //重新开始按钮的事件处理方法

                //所有的按钮全部恢复为红色
                for (int i = 0; i < btnAry.length; i++) {
                    btnAry[i].setBackground(Color.PINK);
                }

                //使用步数清零
                step = 0;
                lblStep.setText("当前使用:" + step + "步");

                //当前进度也重新显示
                int blueCount = getBlueButtonCount();
                lblJindu.setText("当前进度:" + blueCount + "/81");
            }
        });
        btnRestart.setBounds(113, 521, 107, 30);
        contentPane.add(btnRestart);

        //退出游戏按钮
        btnExit = new JButton("\u9000\u51FA\u6E38\u620F");
        btnExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //退出游戏按钮的事件处理
                //先询问用户是否真的退出
                //JOptionPane.showConfirmDialog(null, "您真的打算退出吗?");
                if (JOptionPane.showConfirmDialog(null, "您真的打算退出吗?",
                        "退出", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    System.exit(0);
                }   
            }
        });
        btnExit.setBounds(230, 521, 107, 30);
        contentPane.add(btnExit);

        //为了调试游戏胜利的结果,特别增加的作弊按钮,游戏完成,记得删除它
        JButton btnZuobi = new JButton("B");
        btnZuobi.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //令所有的按钮都变成蓝色,离开胜利差一步
                for (int i = 0; i < btnAry.length; i++) {
                    btnAry[i].setBackground(Color.BLUE);
                }

                //往回退一步
                btnAry[0].doClick();
                //btnAry[0].setBackground(Color.PINK);
                //btnAry[1].setBackground(Color.PINK);
                //btnAry[9].setBackground(Color.PINK);
            }
        });
        btnZuobi.setBounds(407, 525, 39, 26);
        contentPane.add(btnZuobi);

        //为当前窗体注册窗体监听器
        this.addWindowListener(new MyWindowListener());

        //=============================华丽的分割线===================
        btnAry = new JButton[9 * 9];
        GridLayout gl = new GridLayout(9, 9);
        pnlGame.setLayout(gl);



        //实例化一个监听器出来
        GameButtonListener gbl = new GameButtonListener();

        for (int i = 0; i < btnAry.length; i++) {
            btnAry[i] = new JButton();
            pnlGame.add(btnAry[i]);
            //将按钮的索引以文本的方式显示在按钮上面。
            btnAry[i].setText(i + "");

            btnAry[i].setBackground(Color.PINK);
            //将数组中的每个按钮都注册到同一个监听器
            btnAry[i].addActionListener(gbl);

            //以当前按钮的索引为字符串设定为名牌
            btnAry[i].setActionCommand(i + "");
        }
    }

    //自定义一个方法,该方法能够使得某一个按钮变颜色,达到翻转的效果
    //参数:指定按钮的索引
    //功能:指定索引的按钮变换颜色
    //返回值:无
    private void changeColor(int index) {
        //原来是红的,变蓝色,原来是蓝的,变红色 
        if (btnAry[index].getBackground().equals(Color.PINK)) {
            btnAry[index].setBackground(Color.BLUE);
        } else {
            btnAry[index].setBackground(Color.PINK);
        }
    }

    //自定义一个获得当前按钮数组中有多少个蓝色按钮的方法
    private int getBlueButtonCount() {
        int bcount = 0;
        for (int i = 0; i < btnAry.length; i++) {
            if (btnAry[i].getBackground().equals(Color.BLUE)) {
                bcount++;
            }
        }

        return bcount;
    }

    //定义1个监听器将所有的游戏按钮都控制住
    private class GameButtonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent ae) {
            //每次点击游戏按钮都应当增加一次步数
            step++;

            //要分辨出到底是哪个按钮被按下,要获得此按钮在整个数组中的索引
            String strCmd = ae.getActionCommand();   //撕下名牌
            int index = Integer.parseInt(strCmd);   //将字符串转化为索引

            //令被点击的那个按钮变颜色
            //自己变,调用自定义的变色方法
            changeColor(index);

            //上面变  index - 9
            if (index >= 9) {
                changeColor(index - 9);
            }

            //下面变
            if (index < 9 * (9 - 1)) {
                changeColor(index + 9);
            }

            //只有当被点击的按钮不在最左边的时候,左边的按钮才需要变
            if (index % 9 != 0) {
                changeColor(index - 1);
            }

            //右边变
            if ((index + 1) % 9 != 0) {
                changeColor(index + 1);
            }

            int blueCount = getBlueButtonCount();
            //显示当前进度
            lblJindu.setText("当前进度:" + blueCount + "/81");
            //显示游戏步数
            lblStep.setText("当前使用:" + step + "步");

            //判断是否已经胜利,所有的按钮的变成蓝色
            if (blueCount == 81) {
                //胜利后的效果,稍后再处理
                //弹出一个消息框,恭喜玩家,告诉他赢了。
                //JOptionPane.showMessageDialog(null, "恭喜您,胜利了。");
                JOptionPane.showMessageDialog(null, "You win!", "胜利", JOptionPane.INFORMATION_MESSAGE); 

                //暗示用户重新开始
                btnRestart.doClick();
            }
        }

    }

    //自定义窗体监听器来控制窗体事件
    //通过继承适配器类的方式
    private class MyWindowListener extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            // TODO Auto-generated method stub
            btnExit.doClick();
        }
    }
    /*
     * 通过实现监听器接口的方式
    private class MyWindowListener implements WindowListener {

        //在窗体即将关闭时执行,关注此方法
        public void windowClosing(WindowEvent e) {
            // TODO Auto-generated method stub
            btnExit.doClick();
        }

        //窗体打开时执行,不关注
        public void windowOpened(WindowEvent e) {}

        //窗体关闭之后执行,不关注
        public void windowClosed(WindowEvent e) {}

        //窗体最小化时执行,不关注
        public void windowIconified(WindowEvent e) {}

        //窗体从最小化恢复成正常时执行,不关注
        public void windowDeiconified(WindowEvent e) {}

        //窗体从非活动状态变为活动状态时执行,不关注
        public void windowActivated(WindowEvent e) {}

        //窗体从活动状态变为非活动状态时执行,不关注
        public void windowDeactivated(WindowEvent e) {}
    }
    */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值