zoukankan      html  css  js  c++  java
  • Java_Class 16方格拼图游戏

    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            GameFrame frame = new GameFrame();
            frame.setTitle("Game");
        }
    
    }
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
    
    import javax.swing.*;
    import javax.swing.border.LineBorder;
    
    public class GameFrame extends JFrame {
        /**
         * 菜单栏
         */
        JMenuBar menuBar;
        /**
         * "菜单"选项
         */
        JMenu menu;
        /**
         * "帮助"选项
         */
        JMenu help;
        /**
         * "重新开始"选项
         */
        JMenuItem mItem1;
        /**
         * "退出"选项
         */
        JMenuItem mItem2;
        /**
         * "关于"选项
         */
        JMenuItem hItem;
        /**
         * 游戏面板
         */
        JPanel panel;
        /**
         * 游戏中的按钮
         */
        JButton buttons[] = new JButton[16];
        /**
         * 按钮监听器
         */
        GameListener listener;
        /**
         * 背景颜色
         */
        Color backgruond = Color.DARK_GRAY;
        /**
         * 前景颜色
         */
        Color foreground = Color.WHITE;
        /**
         * 游戏中的字体
         */
        Font font = new Font("Consolas", Font.PLAIN, 14);
        
        public GameFrame() {
            // TODO Auto-generated constructor stub
            setSize(500, 520);
            setLocationRelativeTo(null);
            setResizable(false);
            setVisible(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
    
            menuBar = new JMenuBar();
            menu = new JMenu("Menu");
            menu.setForeground(foreground);
            menu.setFont(font);
            mItem1 = new JMenuItem("Restart");
            mItem1.setFont(font);
            mItem1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    init();
                }
            });
            mItem2 = new JMenuItem("Exit");
            mItem2.setFont(font);
            mItem2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            menu.add(mItem1);
            menu.add(mItem2);
            help = new JMenu("Help");
            help.setForeground(foreground);
            help.setFont(font);
            hItem = new JMenuItem("About");
            hItem.setFont(font);
            hItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null, "Maked by : 胡靖");
                }
            });
            help.add(hItem);
            menuBar.add(menu);
            menuBar.add(help);
            menuBar.setBackground(backgruond);
            setJMenuBar(menuBar);
    
            panel = new JPanel();
            panel.setLayout(new GridLayout(4, 4));
            add(panel);
    
            setTitle("Loading...");
            listener = new GameListener(buttons);
            for (int i = 0; i < 16; i++) {
                if (i == 15)
                    buttons[i] = new JButton(" ");
                else
                    buttons[i] = new JButton("" + (i + 1));
                buttons[i].setBackground(backgruond);
                buttons[i].setForeground(foreground);
                buttons[i].setBorder(new LineBorder(Color.GRAY));
                buttons[i].setFont(new Font("Consolas", Font.PLAIN, 40));
                buttons[i].addActionListener(listener);
                panel.add(buttons[i]);
            }
            gameOn();
    
            validate();
    
        }
        /**
         * 初始话第一次游戏,并有动态初始化效果
         */
        public void gameOn() {
            for (int i = 0; i < 16; i++)
                buttons[i].setEnabled(false);
            menu.setEnabled(false);
            help.setEnabled(false);
            Random random = new Random();
            int d[] = { -4, 1, -1, 4 };
            int p = 15;
            for (int i = 0; i < 1000; i++) { // 打乱的次数
                int tmp = random.nextInt(4);
                int next = p + d[tmp];
                if (p % 4 == 0 && next % 4 == 3 || p % 4 == 3 && next % 4 == 0)
                    continue;
                if (next >= 0 && next < 16) {
                    String s = buttons[p].getText();
                    buttons[p].setText(buttons[next].getText());
                    buttons[next].setText(s);
                    p = next;
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            judge();
            for (int i = 0; i < 16; i++)
                buttons[i].setEnabled(true);
            menu.setEnabled(true);
            help.setEnabled(true);
        }
        /**
         * 重新开始游戏的初始化,与第一次游戏使用的初始化方式不同
         */
        public void init() {
            for (int i = 0; i < 16; i++)
                buttons[i].setEnabled(false);
            Random random = new Random();
            boolean flag[] = new boolean[16];
            for (int i = 0; i < 16; i++) {
                int tmp = random.nextInt(16);
                while (flag[tmp])
                    tmp = random.nextInt(16);
                if (tmp == 15)
                    buttons[i].setText(" ");
                else
                    buttons[i].setText("" + (tmp + 1));
                flag[tmp] = true;
            }
            judge();
            for (int i = 0; i < 16; i++)
                buttons[i].setEnabled(true);
        }
        /**
         * 判断生成的序列是否可行,如果不可行交换任意相邻两个按钮的文本即可
         */
        public void judge() {
            int sum = 0;
            int a[] = new int[16];
            for (int i = 0; i < 16; i++) {
                String s = buttons[i].getText();
                if (s.equals(" "))
                    a[i] = 0;
                else
                    a[i] = Integer.parseInt(s);
            }
            for (int i = 0; i < 15; i++) {
                if (a[i] == 0) {
                    sum += i % 4;
                    sum += i / 4;
                    continue;
                }
                for (int j = i + 1; j < 16; j++)
                    if (a[i] > a[j])
                        sum++;
            }
            if (sum % 2 == 0) {
                String s = buttons[0].getText();
                buttons[0].setText(buttons[1].getText());
                buttons[1].setText(s);
            }
        }
    }
    import java.awt.event.*;
    
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    
    public class GameListener implements ActionListener {
        /**
         * 游戏中的按钮,传进来的参数
         */
        JButton[] button = new JButton[16];
        /**
         * 四个方向
         */
        int[] d = { -4, 1, -1, 4 };
    
        public GameListener(JButton[] button) {
            // TODO Auto-generated constructor stub
            this.button = button;
        }
        /**
         * 监听到动作后执行的方法
         */
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            JButton jButton = (JButton) e.getSource();
            if (jButton.getText().equals(" "))
                return;
            int position = 0;
            for (int i = 0; i < 16; i++) {
                if (jButton == button[i]) {
                    position = i;
                    break;
                }
            }
            for (int i = 0; i < 4; i++) {
                int next = position + d[i];
                if (position % 4 == 0 && next % 4 == 3 || position % 4 == 3 && next % 4 == 0)
                    continue;
                if (next >= 0 && next < 16 && button[next].getText().equals(" ")) {
                    String s = button[position].getText();
                    button[position].setText(button[next].getText());
                    button[next].setText(s);
                    break;
                }
            }
            boolean win1 = true;
            boolean win2 = true;
            if (!button[15].getText().equals(" "))
                win1 = false;
            for (int i = 0; i < 15 && win1; i++)
                if (!button[i].getText().equals("" + (i + 1)))
                    win1 = false;
            if (!button[0].getText().equals(" "))
                win2 = false;
            for (int i = 1; i < 16 && win2; i++)
                if (!button[i].getText().equals("" + (16 - i)))
                    win2 = false;
            if (win1 || win2) {
                for (int i = 0; i < 16; i++)
                    button[i].setEnabled(false);
                JOptionPane.showMessageDialog(null, "Congratulations!
    You win.");
            }
        }
    
    }
  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/pach/p/6227642.html
Copyright © 2011-2022 走看看