java实现拼图小游戏

一个简单的拼图小游戏,供大家参考,具体内容如下

1.首先设计视图面板。
2.添加所需要的图片按钮。
3.最主要的是设计监听事件,添加图片的监听按钮,设定移动空白图片周围的按钮。
4.判断是否成功 。

package sxy;
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;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现俄罗斯方块游戏

    本文实例为大家分享了java实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 1.功能需求 2.软件功能架构图 3.界面设计 4.程序逻辑图 5.实现代码 创建控制面板并添加按钮 初始化界面 添加事件监听 创建方块 实现对方块操作 游戏主类,实现游戏控制 功能需求 1. 在二维平面里面用各种随机产生的方块堆积木,每满一行消去一行,当达到顶部时,游戏结束. 2. 玩家通过方向键来控制方块转动,左移,右移和直落. 3. 每种类型的方块都有颜色. 4. 玩家能够在玩的过程中给出分数,分数是由方块

  • java GUI实现五子棋游戏

    本文实例为大家分享了java实现五子棋游戏GUI,供大家参考,具体内容如下 引用包 //{Cynthia Zhang} import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.LineBorder; import javax.swing.JOptionPane; import javax.swing.ImageIcon; import java.awt.Image; i

  • Java的带GUI界面猜数字游戏的实现示例

    先导包 import java.util.*; import javax.swing.*; 再写主方法 public static void main(String[] args) { } 新声明一个Scanner和随机数 public static void main(String[] args) { Scanner in = new Scanner(System.in); Random r = new Random(); } 让UIManager爬取系统窗口样式 try { UIManage

  • Java小程序赛马游戏实现过程详解

    这是当时做的一个小游戏,大概就是程序开始后,会进入用户登录界面,用户输入自己的姓名和密码后,选择登录会进入到赛马比赛的界面,这时可以看见赛马场和马匹的编号,用户可以选择任何一个编号的马进行投注,输入有效的投注金额(因为系统设置了初始金额,所以不得投注的超过初始金额).投注完成后用户可以选择开始比赛,赛马期间用户不得进行任何操作,赛马结束后,用户可以重新进行新一轮的赛马比赛,方法上同. 程序流程图: 一.赛马比赛模块 其中此模块包括对画出马匹和赛道部分,通过使用Draw类来向Jpanel面板中添加

  • java实现猜拳小游戏

    一天下午无聊,突发奇想做的一个简单的小游戏. 下面是我做的过程中思路与步骤:` /* 需求:由后台输入剪刀石头布,然后电脑随机输出一项,比较判断输赢 追加需求:可继续游戏,并当输入错误时提供重新输入 思路: 1.创建一个可以输入的渠道 2.能让电脑随机输出一个结果 3.用一些语句来判断比较 4.用do-while语句来完成继续游戏 5.在判断是否继续游戏时,只能输入Y/N,输入其他则重新输入 步骤: 1.输入格式:import java.util.Scanner; 2.随机格式:Math.ran

  • java实现扫雷小游戏

    本文实例为大家分享了java实现扫雷小游戏的具体代码,供大家参考,具体内容如下 代码: package GUI; import java.util.Random; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.awt.BorderLayout; import java.awt.GridLayo

  • Java实现蓝桥杯数独游戏的示例代码

    你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一的,所以,多个解也称为无解. 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目.但对会使用计算机编程的你来说,恐怕易如反掌了. 本题的要求就是输入数独题目,程序输出数独的唯一解.我们保证所有已知数据的格式都是合法的,并且题目有唯一的解. 格式要求: 输入9行,每行9个数字,0代表未知,其它数字为

  • java实现拼图小游戏

    一个简单的拼图小游戏,供大家参考,具体内容如下 1.首先设计视图面板. 2.添加所需要的图片按钮. 3.最主要的是设计监听事件,添加图片的监听按钮,设定移动空白图片周围的按钮. 4.判断是否成功 . package sxy; import java.awt.Choice; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEv

  • Android实现拼图小游戏

    本文实例为大家分享了Android实现拼图小游戏的具体代码,供大家参考,具体内容如下 目标效果: 1.activity_main.xml页面: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem

  • Java实现数独小游戏

    本文实例为大家分享了Java实现数独小游戏的具体代码,供大家参考,具体内容如下 题目要求: 制作一个数独游戏.数据游戏拼图由一个3*3的九宫格组成,每个格式又分成一个小九宫格,共九九八十一个小格子.游戏规则:游戏开始前会有一些格式了写好了1-9的数,在剩下的格式里填写1-9的数,直到把所有格式填满,要求任何一行或一列或者任一个小九宫中没有相同的数字.拼图示例如下: 任务要求: (1) 可以根据在九宫格中初始给出的数字个数设定游戏难度,如初始给出30个数设定为难.35个数设定为中等难度.40个数设

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • 使用vue.js编写蓝色拼图小游戏

    之前在网上看到<蓝色拼图>这款小游戏,作者是用jquery写的.于是便考虑能不能用vue.js优雅简单的编写出来呢? Later equals never!说干就干.首先理解游戏的规则:第一关为1*1的方块,第二关为2*2以此类推 该图为第三关3*3的方块.点击一个小方块,该方块和它相邻的方块的的颜色会从黄色变为蓝色,全部变为蓝色就过关了. 现在规则清楚了,开动吧! /*style*/ .game_bg{ background: #333; width: 600px; height: 600p

  • jQuery实现拼图小游戏(实例讲解)

    小熊维尼拼图 jQuery代码实现拼图小游戏,鼠标选中拼块,用上下左右键移动拼块. html代码 <div id="box-div"> <!--走不通时的提示!--> <div id="tips"> <p>\(╯-╰)/ 哎呦,走不通啦!</p> </div> <div id="container"> <div class="row"&g

  • Java编程经典小游戏设计-打砖块小游戏源码

    [程序中使用的数据结构和符号说明] HitBrick类 GreenBallThread控制小球路线 xUp,yUp,bouncing定义变量存储16位数值形式 x,y小球坐标 xDx,yDy坐标增量 MAX_X,MAX_Y坐标最大值 renew初始化 label标签 Rx,Ry横板坐标 Brick[]砖块 ball小球 HitBrick()定义小球横板及砖块位置坐标 keyPressd(keyEent)定义小球启动键(按空格键启动) keyReleased(keyEvent)接收键盘事件侦听器接

  • java实现桌球小游戏

    本文实例为大家分享了java实现桌球小游戏的具体代码,供大家参考,具体内容如下 桌球小游戏 两张图片放在src的同级目录下 版本一.出现窗口 package cn.xjion.game; /** * 出现窗口 * @author xjion * */ import java.awt.*; import javax.swing.*; //继承窗口类 public class BallGame extends JFrame{ // 窗口加载的方法 void launchFrame(){ // 窗口的

  • Android自定义View实现拼图小游戏

    本文实例为大家分享了Android拼图小游戏的具体代码,供大家参考,具体内容如下 1.效果图: 运行时: 结束时: 2.PuzzleLayoutView: public class PuzzleLayoutView extends RelativeLayout implements View.OnClickListener { //表示将其切成2*2拼图(默认4块) private int mColumn = 2; //容器的内边距 private int mPadding; //每个块块的边距

  • java猜数字小游戏案例

    本文实例为大家分享了java猜数字小游戏案例,供大家参考,具体内容如下 package day08; import java.util.Scanner; public class GuessNumber { /** * 猜数字小游戏:. 需求: 随机产生一个整数数1-100(被猜数)不设置输出 * 键盘录入一个玩家要猜的数字 * 判断猜大还是猜小了或者猜中 */ public static void main(String[] args) { // 随机产生整数1-100 int number

随机推荐