Java拼图小游戏简易版

  • 技术需求
  • 代码实现
  • 完整代码
  • 相关图片

技术需求

Java基础封装、继承、多态。

代码实现

创建一个子类继承自父类JFrame,好处是继承到父类的所有方法,直接使用,更为方便。

public class MyFrame{}

创建方法用于设置窗口参数

public void window(){// 设置窗口大小setSize(514,594);// 设置窗口标题setTitle("单机游戏v1.0");// 设置窗口居中显示setLocationRelativeTo(null);// 设置窗口置顶setAlwaysOnTop(true);// 设置程序关闭模式为窗口关闭setDefaultCloseOperation(MyFrameDemo.EXIT_ON_CLOSE);// 取消默认布局setLayout(null);}

图片本身不能移动,将图片映射为二维数组下标,数组下标的改变实际上就模拟了图片的移动。
程序每次运行都需要打乱图片的摆放顺序,这里采取的办法是:将图片编号,然后把图片的序号存到一维数组中,打乱一维数组中的数据,然后把一维数组的数据再赋值给二维数组。

// 创建成员变量二维数组,用来存放随机生成的图片
int[][] arr = new int[4][4];
// 创建顺序正确的二维数组,用于校验游戏是否成功
int[][] win = {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};// 创建成员变量行、列(用于记录空白图片的位置)、步数(用来统计步数)
int row;
int column;
int count = 0;

创建方法将二维数组随机化,以模拟图片打乱

public void initData(){Random random = new Random();// 用来保存图片的正确顺序int[] a = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};// 打乱顺序for (int i = 0; i < a.length; i++) {int index = random.nextInt(a.length);int temp = a[i];a[i] = a[index];a[index] = temp;}// 一位数组下标计数器int index = 0;// 将打乱好的数据存入二位数组中for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {arr[i][j] = a[index];// 定位空白图片位置if (arr[i][j] == 0){row = i;column = j;}// 更新一维数组小标index++;}}}

接下来完成图片的加载,上面我们已经将图片的名字编号,然后将打乱顺序的编号存入了二维数组中,接下来利用这些编号,将图片加载进容器内并显示出来。

// 加载图片public void view(){// 清除容器内的所有组件,后面图片移动时我们要刷新页面,// 如果页面中存在有组件的话,后加载的组件会被先加载的组件覆盖// JFrame中的重合问题采用的是先来先显示getContentPane().removeAll();// 创建标签用来显示移动的步数JLabel countLabel = new JLabel("一共走了" + count + "步");// 设置标签大小countLabel.setBounds(50,20,100,20);// 将标签加载到容器中(因为取消了默认布局,必须手动加载)getContentPane().add(countLabel);// 加载图片for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {// 创建图片对象用于存放图片,注意图片的路径的\要写\\,避免转义// 注意:图片的名字已映射为二位数组中的数据,所以图片的名字要//      用二维数组替换//      如:E:\\image\\" + arr[i][j] + ".pngImageIcon imageIcon = new ImageIcon("图片的全路径");// 创建标签,将图片对象添加进去JLabel imageLabel = new JLabel(imageIcon);// 设置标签大小// 将每个图片的显示位置动态设置,体现出我们设置二维数组的便捷性imageLabel.setBounds(50 + j*100, 90 + i*100, 100, 100);// 将标签添加进容器getContentPane().add(imageLabel);}}// 添加背景图片(为啥要将背景图片放到下面?知道的可以在评论区留言哦)ImageIcon imageIcon = new ImageIcon("背景图片全路径");JLabel backgroundLabel = new JLabel(imageIcon);getContentPane().add(backgroundLabel);// 获取当前容器对象,重新编辑组件(这行代码的作用?)getContentPane().repaint();}

到这完成了游戏界面的加载工作,我们希望创建对象时能自动加载界面,所以需要再空参构造器中进行初始化工作。

// 构造方法完成初始化public MyFrame(){// 初始化窗口showView();// 数据初始化initData();// 初始化图片printView();// 注册键盘监听器(这里用的this就体现出继承的好处了)this.addKeyListener(this);// 设置窗口可见setVisible(true);}

本质上图片是不能发生移动的,我们将图片映射到了二位数组中,就可以通过改变二维数组的下边来模拟移动操作,比如往左移,那么只需要将两个数组的数据互换就行。而每次移动都要去判断是否游戏胜利。

// 完成状态public boolean check(){for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {// 对比当前二位数组和预设二位数组中的数据是否相同if (arr[i][j] != win[i][j]){return false;}}}return true;}

通过键盘移动图片,需要对键盘设置监听器,需要实现键盘监听器接口

 // 键盘监听@Overridepublic void keyReleased(KeyEvent e) {move(e.getKeyCode());// 刷新页面printView();}
// 键盘监听public void move(int key){// 胜利if (check()){return;}// 左if (key == 37){if (column != 3){arr[row][column] = arr[row][column + 1];arr[row][column + 1] = 0;column++;count++;}// 上} else if (key == 38) {if (row != 3){arr[row][column] = arr[row + 1][column];arr[row + 1][column] = 0;row++;count++;}// 右} else if (key == 39) {if (column != 0){arr[row][column] = arr[row][column - 1];arr[row][column - 1] = 0;column--;count++;}// 下} else if (key == 40) {if (row != 0) {arr[row][column] = arr[row - 1][column];arr[row - 1][column] = 0;row--;count++;}} else if (key == 90){arr = new int[][]{{0, 1, 2, 3},{4, 5, 6, 7},{8, 9, 10, 11},{12, 13, 14, 15}};}}// 下面方法用不到就不管@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {}

完整代码

MyFrame类

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;public class MyFrame extends JFrame implements KeyListener, ActionListener {// 二维数组控制图片编号int[][] arr = new int[4][4];int[][] win = {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};// 行int row;// 列int column;// 步数int count = 0;// 构造方法完成初始化public MyFrame(){// 初始化窗口showView();// 数据初始化initData();// 初始化图片printView();// 初始化菜单Menu();// 注册键盘监听器this.addKeyListener(this);// 设置窗口可见setVisible(true);}// 菜单public void Menu(){// 创建菜单对象JMenuBar jMenuBar = new JMenuBar();// 创建栏目对象JMenu jMenu1 = new JMenu("功能");JMenu jMenu2 = new JMenu("关于");// 创建条目对象JMenuItem jMenuItem = new JMenuItem("Replay");// 条目添加进栏目jMenu1.add(jMenuItem);// 栏目添加进菜单jMenuBar.add(jMenu1);jMenuBar.add(jMenu2);// 菜单添加进窗口this.setJMenuBar(jMenuBar);// 给条目添加监听jMenuItem.addActionListener(this);}// 二位数组随机化public void initData() {Random random = new Random();int[] arr1 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};for (int i = 0; i < arr.length; i++) {int index = random.nextInt(arr1.length);int temp = arr1[i];arr1[i] = arr1[index];arr1[index] = temp;}int index = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {arr[i][j] = arr1[index];if (arr[i][j] == 0){row = i;column = j;}index++;}}}// 窗口设置public void showView(){// 设置窗口大小setSize(514,594);// 设置关闭模式setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置置顶显示setAlwaysOnTop(true);// 设置居中显示setLocationRelativeTo(null);// 设置窗口标题setTitle("石头迷阵v1.0单机版");// 取消默认布局setLayout(null);}// 界面加载public void printView(){// 清除界面getContentPane().removeAll();// 胜利,输出图片if (check()){JLabel winLabel = new JLabel(new ImageIcon("E:\\黑马程序员\\image\\image\\win.png"));winLabel.setBounds(124,230,266,88);getContentPane().add(winLabel);}// 步数加载JLabel jLabel = new JLabel("步数:" + count);jLabel.setBounds(50,20,100,20);getContentPane().add(jLabel);// 添加图片for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {//这个地址要根据你自己的地址来写JLabel image = new JLabel(new ImageIcon("E:\\image\\"+arr[i][j]+".png"));image.setBounds(50 + j*100, 90 + i*100, 100 ,100);getContentPane().add(image);}}// 背景图片JLabel backgroung = new JLabel(new ImageIcon("E:\\image\\background.png"));backgroung.setBounds(26,30,450,484);getContentPane().add(backgroung);// 获取当前容器对象,重新编辑组件getContentPane().repaint();}// 键盘监听@Overridepublic void keyReleased(KeyEvent e) {move(e.getKeyCode());// 刷新页面printView();}// 完成状态public boolean check(){for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {if (arr[i][j] != win[i][j]){return false;}}}return true;}// 键盘监听public void move(int key){// 胜利if (check()){return;}// 左if (key == 37){if (column != 3){arr[row][column] = arr[row][column + 1];arr[row][column + 1] = 0;column++;count++;}// 上} else if (key == 38) {if (row != 3){arr[row][column] = arr[row + 1][column];arr[row + 1][column] = 0;row++;count++;}// 右} else if (key == 39) {if (column != 0){arr[row][column] = arr[row][column - 1];arr[row][column - 1] = 0;column--;count++;}// 下} else if (key == 40) {if (row != 0) {arr[row][column] = arr[row - 1][column];arr[row - 1][column] = 0;row--;count++;}} else if (key == 90){arr = new int[][]{{0, 1, 2, 3},{4, 5, 6, 7},{8, 9, 10, 11},{12, 13, 14, 15}};}}//@Overridepublic void keyTyped(KeyEvent e) {}//@Overridepublic void keyPressed(KeyEvent e) {}@Overridepublic void actionPerformed(ActionEvent e) {// 初始化数据initData();// 步数初始化count = 0;// 初始化图片图片printView();}
}

测试类

public class Test {public static void main(String[] args) {new MyFrame();}
}

相关图片

可以做任何自己想做的拼图游戏,根据大小自己切割。
上述代码用到的图片:
百度网盘
链接:https://pan.baidu.com/s/1FCoXXOm6spF9qsdfjTWYug
提取码:785g
(上述代码为简易版,供学习参考,如有不足欢迎及时指正)

拼图小游戏Java简易版相关推荐

  1. C实现扫雷小游戏(简易版)

    你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉.--<肖申克的救赎> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化雷阵 2.3生成雷 2.4玩家 ...

  2. 扫雷小游戏(简易版)

    写个小游戏娱乐娱乐! 目录:1.简要分析            2.实现扫雷游戏细节             3.总代码 1.简要分析 一般写这种小游戏要分为两个模块:头文件,源文件.头文件中声明各种 ...

  3. java实现拼图小游戏(包括打包exe)

    事先说明这是在B站上学习java基础知识的时候,写的小游戏,该游戏在B站上的视频上只实现了拼图游戏的主界面,本人在这基础上实现的功能有: 1.登录界面实现: 在原来B站视频的基础上实现了: 验证码功能 ...

  4. 【java】JavaFX从零开始实现拼图小游戏

    最近java课老师布置了一个作业:制作一个拼图小游戏,关键老师自己说javaGUI编程没用,讲课的时候好像跳过了(没去上课不过我猜应该没讲吧),现在又叫我们做这些,实在是哭笑不得. 得了吧,老师的任务 ...

  5. java实现智能拼图_java实现拼图小游戏

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

  6. Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)

    移动图片 一.前言 二.步骤 1.让我们的类继承KeyListener接口 2.改写initData方法 3.实现向上移动 4.实现向下移动 5.实现向左移动 6.实现向右移动 7.改写initIma ...

  7. JavaScript版拼图小游戏

    慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...

  8. Java项目之“拼图小游戏”

    文章目录 一.项目简介 二.游戏展示 三.程序设计 1. 创建游戏主界面( GameJFrame ) 2. 初始化界面 ( initJFrame ) 3. 初始化菜单 ( initJMenuBar ) ...

  9. JAVA练习题37:拼图小游戏

    第一个小项目:拼图小游戏 暂不完善,因为没有链接数据库,用户名和密码只是暂存在集合中 资料 图片资料 整个项目源码 界面展示 代码: 一.主程序(入口)App import com.qi.ui.Gam ...

最新文章

  1. Android之控件使用
  2. 专家解释即将到来的BCH网络升级
  3. 利用Flutter写一个跨平台的果核APP(3)——网络请求
  4. 数据结构之并查集:并查集解决案例, Python——21
  5. thriftpy2使用与流程
  6. 中国最好学科排名发布:北大14个学科全国第一,北京高校上榜数居首
  7. 常见浏览器bug以及解决方法
  8. java visio_Visio画UML类图、序列图 for Java
  9. python生成3d人体模型_make human开源3D人体建模软件免费下载|make human开源3D人体建模软件2018最新版下载_v1.0.2_9号软件下载...
  10. Lipschitz连续
  11. 数仓工具—Hive的数据组织管理方式(4)
  12. 苹果钱包(AppleWallet)接入操作手册,超详细
  13. 蓝牙速率,距离和组网
  14. mysql表前缀_关于数据库表前缀的认识
  15. Linux内核机制总结进程管理之SMP调度(六)
  16. 【pytorch】ValueError: Expected more than 1 value per channel when training
  17. 获取抖音视频信息api
  18. WebRTC -- Windows平台编译
  19. 优秀的计算机编程类博客 和 文章 转
  20. FreeSWITCH对接SIP中继 语音外呼电话机器人 配置技术指导 www.ruikesoft.com

热门文章

  1. 八皇后 C++ 递归算法和循环嵌套算法 共得到 92 种题解
  2. 图像化转向名词解释_图形学名词解释2(转帖)
  3. 物联网络连万物教学设计_设计中的万物有灵
  4. 联想小新笔记本外接显示屏HDMI无信号
  5. faiss教程【facebook官方文档】
  6. 大型情感类电视连续剧--Android高德之旅(2)地图类型
  7. C++中动态分配多维数组
  8. android 美拍人脸识别,人脸识别+双摄美拍一个都不少:荣耀畅玩7C使用体验
  9. i.MX6ULL终结者搭建交叉编译环境
  10. 微信小程序DarkMode,深色模式自适应代码