Java_Class 16方格拼图游戏

Posted Pacify

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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!\nYou win.");
        }
    }

}

 

以上是关于Java_Class 16方格拼图游戏的主要内容,如果未能解决你的问题,请参考以下文章

拼图游戏(数码还原游戏)算法的研究

2048游戏介绍

拼图游戏(数码还原游戏)的实现

LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷

LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷

LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷