Java 拼图游戏

2014-07-01·WeaponX

11359 次浏览

## 效果图

![pintu.png](https://image.xsoftlab.net/baike/articleImages/9b0d694c18bc0af15f2f7909f78a83b4.jpg)

## 准备工作

准备2张500X500像素的图片,命名分别为0.jpg与1.jpg,放在代码根目录

## 代码

```java

import java.awt.Choice;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.image.CropImageFilter;

import java.awt.image.FilteredImageSource;

import java.awt.image.ImageFilter;

import java.util.Random;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

public class PintuGame {

public static void main(String args[]) {

new PintuFrame().StartFrame();

}

}

class PintuFrame extends JFrame {

private static final long serialVersionUID = 1L;

// 等级设置

private static int level = 3;

// 图片索引

private static int index = 0;

// 图片数量

private static int picCount = 2;

// 开始时间

private long startTime;

// 初始化小方块

private JButton[] buttons;

// 初始化空方块

private JPanel emptyPanel = new JPanel();

// 初始化监听类

private PintuListener listener = new PintuListener();

// 初始化Panel

private JPanel panel = new JPanel(null);

// 图片预览

private JLabel label;

private String[] imgpath = new String[picCount];

// 选图时的图片路径

String path;

public PintuFrame() {

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

imgpath[i] = i + ".jpg";

System.out.println(imgpath[i]);

}

path = imgpath[index];

}

/**

* 开始窗体加载

*/

public void StartFrame() {

panel.removeAll();

JButton start = new JButton("开始");// 开始按钮

JButton left = new JButton("

JButton right = new JButton(">");

JLabel selLevel = new JLabel("LV:");

label = new JLabel(getIcon());// 根据图标设置标签

final Choice choice = new Choice();// 创建选择器

choice.add("--初级--");// 添加列表项

choice.add("--中级--");

choice.add("--高级--");

selLevel.setBounds(5, 0, 20, 20);// 设置坐标

choice.setBounds(28, 0, 65, 20);

start.setBounds(93, 0, 85, 20);

left.setBounds(178, 0, 61, 20);

right.setBounds(239, 0, 61, 20);

label.setBounds(0, 22, 300, 300);// 设置标签的方位

panel.add(selLevel);

panel.add(choice);

panel.add(start);

panel.add(left);

panel.add(right);

panel.add(label);

panel.repaint();

add(panel);

setTitle("拼图游戏");

setBounds(450, 130, 300, 322);

setResizable(false);

// 添加关闭按钮

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

// 监听等级选择

start.addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

level = choice.getSelectedIndex() + 3;

launchFrame();

}

});

// 监听选图按钮

left.addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

if (index == 0) {

index = picCount - 1;

path = imgpath[index];

} else {

path = imgpath[--index];

}

panel.remove(label);

label = new JLabel(getIcon());

label.setBounds(0, 22, 300, 300);

panel.add(label);

panel.repaint();

}

});

// 监听选图按钮 ->

right.addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

if (index == picCount - 1) {

index = 0;

path = imgpath[index];

} else {

path = imgpath[++index];

}

panel.remove(label);

label = new JLabel(getIcon());

label.setBounds(0, 22, 300, 300);

panel.add(label);

panel.repaint();

}

});

}

/**

* 拼图窗体加载

*/

public void launchFrame() {

startTime = System.currentTimeMillis();

panel.removeAll();

buttons = new JButton[level * level];

// 设置图标组

Icon[] icon = new PintuFrame().creatIcon(path);

// 小方块索引

int index = 0;

// 小方块坐标

int x = 0, y = 0;

// 设置小方块位置,图标,监听

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

for (int j = 0; j < level; j++) {

// 添加图标

buttons[index] = new JButton(icon[index]);

// 添加监听

buttons[index].addMouseListener(listener);

// 设置位置

buttons[index].setBounds(x, y, 100, 100);

// 添加到panel

panel.add(buttons[index++]);

x += 100;

}

y += 100;

x = 0;

}

// 移除最后一个小方块

panel.remove(buttons[(level * level) - 1]);

// 设置空方块位置

emptyPanel.setBounds((level - 1) * 100, (level - 1) * 100, 100, 100);

// 添加空方块

panel.add(emptyPanel);

panel.repaint();

add(panel);

setResizable(false);

setTitle("拼图游戏");

// 设置大小

setBounds(450, 130, level * 100, level * 100 + 30);

// 打乱方格顺序

breakRank();

// 添加关闭按钮

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

// 选图界面图像

public Icon getIcon() {

ImageIcon bi = new ImageIcon(getClass().getClassLoader().getResource(path));

// 缩放大小并显示到窗体

Image image = bi.getImage().getScaledInstance(300, 300, Image.SCALE_REPLICATE);

return new ImageIcon(image);

}

// 打乱方格

public void breakRank() {

Random r = new Random();

int x = 0, y = 0, emptyDir_X = 0, emptyDir_Y = 0;

// 模拟随即点击1000次,打乱方格

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

int rid = r.nextInt(level * level - 1);

// 获得该方格按钮的横坐标

x = buttons[rid].getBounds().x;

// 获得该方格按钮的纵坐标

y = buttons[rid].getBounds().y;

// 得到空方格的横坐标

emptyDir_X = emptyPanel.getBounds().x;

// 得到空方格的纵坐标

emptyDir_Y = emptyPanel.getBounds().y;

move(x, y, emptyDir_X, emptyDir_Y, buttons[rid]);

}

}

// 移动方格

public void move(int x, int y, int emptyDir_X, int emptyDir_Y, JButton button) {

// 进行比较果满足条件则交换

if (x == emptyDir_X && y - emptyDir_Y == 100) {

button.setLocation(button.getBounds().x, button.getBounds().y - 100);

} else if (x == emptyDir_X && y - emptyDir_Y == -100) {

button.setLocation(button.getBounds().x, button.getBounds().y + 100);

} else if (x - emptyDir_X == 100 & y == emptyDir_Y) {

button.setLocation(button.getBounds().x - 100, button.getBounds().y);

} else if (x - emptyDir_X == -100 && y == emptyDir_Y) {

button.setLocation(button.getBounds().x + 100, button.getBounds().y);

} else

return;

// 重新设置空方格的位置

emptyPanel.setLocation(x, y);

}

// 判断是否拼凑成功

public boolean isFinish() {

for (int i = 0; i < (level * level) - 1; i++) {

int x = buttons[i].getBounds().x;

int y = buttons[i].getBounds().y;

// 根据坐标位置判断是否拼凑成功 0+0 0+1 ..

if (y / 100 * level + x / 100 != i)

return false;

}

return true;

}

// 事件监听类

public class PintuListener extends MouseAdapter {

@Override

public void mousePressed(MouseEvent e) {

JButton button = (JButton) e.getSource();// 获得鼠标按的方格按钮

int x = button.getBounds().x;// 获得该方格按钮的横坐标

int y = button.getBounds().y;// 获得该方格按钮的纵坐标

int nullDir_X = emptyPanel.getBounds().x;// 得到空方格的横坐标

int nullDir_Y = emptyPanel.getBounds().y;// 得到空方格的纵坐标

move(x, y, nullDir_X, nullDir_Y, button);

if (isFinish()) {// 进行是否完成的判断

panel.remove(emptyPanel);// 移除最后一个小方块

panel.add(buttons[(level * level) - 1]);// 移除最后一个小方块

JOptionPane.showMessageDialog(null,

"恭喜你,完成拼图\r\n用时为:" + (System.currentTimeMillis() - startTime) / 1000 + "S");

for (int i = 0; i < picCount; i++) {// 循环撤消鼠标事件

buttons[i].removeMouseListener(listener);

}

StartFrame();

}

repaint();

}

}

// 创建方格图标组

public Icon[] creatIcon(String srcImageFile) {

ImageIcon bi = new ImageIcon(this.getClass().getClassLoader().getResource(srcImageFile));

// 读取源图像

Image image = bi.getImage();

int index = 0;

int x = 0, y = 0;

Icon[] icon = new Icon[level * level];// 根据窗体大小创建图标数量

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

for (int j = 0; j < level; j++) {

// 从原图像上获取一个方形位置

ImageFilter cropFilter = new CropImageFilter(x, y, 100, 100);

// 截取方形图像

Image img = Toolkit.getDefaultToolkit()

.createImage(new FilteredImageSource(image.getSource(), cropFilter));

icon[index++] = new ImageIcon(img);

x += 100;

}

y += 100;

x = 0;

}

return icon;

}

}

```

java 拼图游戏_Java 拼图游戏相关推荐

  1. 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目

    开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...

  2. java实现抽奖游戏_Java实现游戏抽奖算法

    常用抽奖算法对比 基础的游戏抽奖算法通常要求实现在指定奖品的集合中,每个奖品根据对对应概率进行抽取.个人了解的主要有以下几中抽奖算法: 随机数一一对应 算法思想 这种算法思想最为简单.将n个奖品编号0 ...

  3. java打字游戏_Java打字游戏

    贴吧上看到有人做Java打字游戏,但是问题多多,我把他的程序拿来大改一番,算是半个原创吧.键盘按出对应字母,则该字母消失并随机产生新字母. 如果加些贴图润色一下可以更美观,学习计划紧,暂时不美化了. ...

  4. java 扑克游戏_Java扑克游戏——红心大战

    游戏介绍: 用一幅除去大小王的扑克玩的扑克游戏,开局时先洗牌,然后发给4位玩家.每个回合玩家轮流出牌,牌面大的玩家将会获得积分,并且下一个回合先出牌.积分牌包括红桃和黑桃Q,    红桃1分,黑桃Q1 ...

  5. java打架游戏_java模拟游戏打斗场景摘要.doc

    java模拟游戏打斗场景摘要.doc //游戏人物属性模型 package dahuaxiyou; public class Immortal { public String name; public ...

  6. java五子棋图片_java五子棋游戏如何加载图片

    展开全部 直接上程序吧: //wuziqi.java import java.applet.Applet; import java.awt.Button; import java.awt.Checkb ...

  7. java扑克游戏_Java扑克游戏(多人多牌数比较游戏)的实现

    具体实现步骤如下: 实现扑克Card类,用于储存扑克牌,1-13代表点数,4-1代表花色(黑桃,红桃,梅花,分块) 实现扑克列表CardList类,用于实现生成一副牌,洗牌,发牌的功能 实现玩家Pla ...

  8. 直升飞机java游戏_java飞机游戏

    飞机游戏 需求分析 本意是做一个类似雷霆战机的小游戏, 但超出了知识范围, 简化成为了一个没有敌人, 生命, 得分, 菜单栏的小游戏, 游戏内容变成了飞机闪躲从固定位置发出的多个子弹, 计算存活时间的 ...

  9. 如何用java做游戏地图_Java为游戏绘制地图网格

    嘿,我正在尝试制作地牢爬虫,但我仍停留在地图生成上.我希望生成随机的房间,但是在完成所有操作之前,我必须先在屏幕上绘制地图.我希望地图自上而下,几乎是一个网格,稍后再将地板图像添加到其中.我的思维方式 ...

最新文章

  1. 2022-2028年中国装配式装修行业市场研究及前瞻分析报告
  2. Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
  3. SCOM2012部署系列之九:部署审核收集报告(ACSReporting)
  4. jQuery 事件用法详解
  5. 服务器系统检测报告自动生成,生成allure测试报告之后,服务器端口无法访问查看生成的report,可能是这样引起的。...
  6. CET6级高频词(按频度)(700个)
  7. 功能、资源权限管理的设计
  8. 【数据结构笔记】B树和B+树的实现,哈希查找,STL中的hash_map和unordered_map容器用法
  9. 深度学总结:weight_initialization
  10. 【Qt】undefined reference to `vtable for xxx’
  11. java仿聊天室项目总结_Java团队课程设计-socket聊天室(个人总结)
  12. 前端学习(811):api和webapi
  13. SCCM 2016 配置管理系列(Part4)
  14. 【机器学习】监督学习--(分类)决策树②
  15. UIBarButtonSystemItem 样式
  16. php在线拍照代码,html5可以实现在线拍照了
  17. 一纵一横,搭建完整数据分析体系
  18. 如何用公众号关联认证小程序
  19. 【180719】疯狂躲避球源代码
  20. 国内工业机器人发展水平综述

热门文章

  1. 简述计算机主板的主要品牌,(品牌管理)计算机主板品牌介绍(9页)-原创力文档...
  2. c语言 教学大纲,C语言教学大纲 ).doc
  3. php实例-微信第三方登录
  4. C++:实现量化daycounters 日计数器测试实例
  5. 石油化工行业智能供应链管理系统解决方案:数智化供应链平台推动企业转型智能化发展
  6. Nginx源码安装及调优配置(二)
  7. 利用Python实现scissors-rock-paper-lizard-Spock小游戏
  8. stm32cubeide烧写程序_初学STM32CubeIDE
  9. IEEE认证Pdf格式失败问题
  10. 你未必知的拼音打字快打十招