当前位置: 首页 > article >正文

Java拼图小游戏

Java拼图小游戏

在这里插入图片描述

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ImagePuzzleGame extends JFrame {

    private JPanel puzzlePanel;
    private List<JButton> puzzlePieces;
    private JButton emptyButton;

    public ImagePuzzleGame() {
        initUI();
    }

    private void initUI() {
        setTitle("Image Puzzle Game");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        setLocationRelativeTo(null);

        puzzlePieces = new ArrayList<>();
        puzzlePanel = new JPanel(new GridLayout(3, 3, 2, 2));

        createImagePuzzlePieces();
        addEmptyButton();

        add(puzzlePanel, BorderLayout.CENTER);

        JButton shuffleButton = new JButton("Shuffle");
        shuffleButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                shufflePuzzle();
            }
        });

        add(shuffleButton, BorderLayout.SOUTH);
    }

    // 创建带有图像的拼图方块
    private void createImagePuzzlePieces() {
        // 加载图像( "src/twicon-kagari.jpg" 为实际图像文件路径)
        ImageIcon icon = new ImageIcon("src/twicon-kagari.jpg");
        BufferedImage img = toBufferedImage(icon.getImage());

        for (int i = 1; i <= 8; i++) {
            JButton button = new JButton(new ImageIcon(getSubImage(img, i)));
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    movePiece(button);
                }
            });
            puzzlePieces.add(button);
            puzzlePanel.add(button);
        }
    }

    // 将 Image 转换为 BufferedImage
    private BufferedImage toBufferedImage(Image img) {
        if (img instanceof BufferedImage) {
            return (BufferedImage) img;
        }

        BufferedImage bufferedImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bufferedImage.getGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();

        return bufferedImage;
    }

    // 获取图像的子图像
    private Image getSubImage(BufferedImage img, int index) {
        int width = img.getWidth() / 3;
        int height = img.getHeight() / 3;

        int row = (index - 1) / 3;
        int col = (index - 1) % 3;

        return img.getSubimage(col * width, row * height, width, height).getScaledInstance(width, height, Image.SCALE_SMOOTH);
    }

    // 添加一个空的拼图方块
    private void addEmptyButton() {
        emptyButton = new JButton("");
        emptyButton.setEnabled(false);
        puzzlePieces.add(emptyButton);
        puzzlePanel.add(emptyButton);
    }

    // 洗牌拼图
    private void shufflePuzzle() {
        Collections.shuffle(puzzlePieces);
        updatePuzzlePanel();
    }

    // 更新拼图面板
    private void updatePuzzlePanel() {
        puzzlePanel.removeAll();
        for (JButton piece : puzzlePieces) {
            puzzlePanel.add(piece);
        }
        revalidate();
        repaint();
    }

    // 移动拼图方块
    private void movePiece(JButton clickedButton) {
        int emptyIndex = puzzlePieces.indexOf(emptyButton);
        int clickedIndex = puzzlePieces.indexOf(clickedButton);

        if (isAdjacent(emptyIndex, clickedIndex)) {
            Collections.swap(puzzlePieces, emptyIndex, clickedIndex);
            updatePuzzlePanel();
        }

        if (isPuzzleSolved()) {
            JOptionPane.showMessageDialog(this, "Congratulations! You solved the puzzle!");
        }
    }

    // 检查方块是否相邻
    private boolean isAdjacent(int index1, int index2) {
        int row1 = index1 / 3;
        int col1 = index1 % 3;
        int row2 = index2 / 3;
        int col2 = index2 % 3;

        return Math.abs(row1 - row2) + Math.abs(col1 - col2) == 1;
    }

    // 检查拼图是否已解决
    private boolean isPuzzleSolved() {
        for (int i = 0; i < puzzlePieces.size() - 1; i++) {
            // 检查每个方块是否与其应在的位置相符
            if (!puzzlePieces.get(i).getIcon().equals(new ImageIcon(getSubImage(toBufferedImage(((ImageIcon)puzzlePieces.get(i).getIcon()).getImage()), i + 1)))) {
                return false;
            }
        }
        return true;
    }

    // 主方法,启动应用
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ImagePuzzleGame puzzleGame = new ImagePuzzleGame();
                puzzleGame.setVisible(true);
            }
        });
    }
}

() {
ImagePuzzleGame puzzleGame = new ImagePuzzleGame();
puzzleGame.setVisible(true);
}
});
}
}



http://www.kler.cn/news/135438.html

相关文章:

  • 数电实验-----实现74LS153芯片扩展为8选1数据选择器以及应用(Quartus II )
  • vue3+ts扩展全局属性
  • Python编程陷阱(九)
  • Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)
  • 【信息安全】浅谈SQL注入攻击的概念、原理和防范措施:简单分析六种常见攻击方式
  • ubuntu下载conda
  • 基于RK3588全高端智能终端机器人主板
  • 链动2+1模式:创新营销引领白酒产业新潮流
  • MyBatis在注解中使用动态查询
  • 清华源Certificate verification failed解决办法
  • 竞赛选题 深度学习的视频多目标跟踪实现
  • 计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战
  • 华为数通HCIP 821BGP 知识点整理
  • kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)
  • Go基础面经大全(持续补充中)
  • 【封装UI组件库系列】搭建项目及准备工作
  • 聊一聊go的单元测试
  • vue3的自定义指令
  • WMS仓储管理系统的工作流程是什么
  • ElasticSearch 安装(单机版本)
  • 云原生微服务-理论篇
  • 【运维篇】5.6 Redis server 主从复制配置
  • C++中使用构造函数进行类型转换
  • C++——模板
  • Java中异常的捕获与处理
  • 你听说过“消费多少返利多少的”模式吗?
  • 基于Vue+SpringBoot的医院门诊预约挂号系统 开源项目
  • 【C/PTA】函数专项练习(二)
  • C语言幂级数求近似值
  • JC/T 2339-2015 地暖用相变储能材料及构件检测