拼图游戏完整思路(全代码演示)

主界面

小练习1:

一、三个界面的设置1:创建窗体

1、将三个主界面分开为三个类,每个类都去继承JFrame这个类,使得每个类都可以使用创建页面功能

2、对每个类进行空参构造,在空参构造里面进行窗体属性的赋值

3、创建一个App类并导入上面三类,统一进行窗口创建操作,仅使用空参构造即可

二、三个界面的设置2:更新窗体的细节属性(标题、窗口在页面置顶、界面居中生成位置、设置关闭模式)

为啥关闭模式是数字3:由源码得,这里设置了一个接口,所以也可以写成WindowConstants.EXIT_ON_CLOSE:

0指点了窗口关闭标志没反应;

1是默认操作,可省略;

2是当所有窗口关闭后,虚拟机才停止,但必须所有窗体都写了这个操作时才生效

3是点了关闭其中一个窗体,就停止运行虚拟机

三、菜单制作:最后需要利用setJMenuBar()将JMenuBar可视化

示例代码:

运行效果图:

四、添加图片(一张,主看思路)

利用JLabel添加,图片默认添加在正中央

示例代码:建立imageIcon对象,建立Jlable管理容器对象添加imageIcon对象,最后添加到界面中

坐标:以窗体左上角为基准,左边x,右边y。

图片默认放在正中央,怎么取消? 将图片传给getContentPane这个隐藏容器,后设置setLayout(null)取消默认,才能跟着xy坐标走。

getContentPane对象不需要自己创建,在创建JFrame时会自己创建

xy坐标公式:jlabel对象.setBounds(x:,y:,width:,height:);

1.取消默认

2.设置坐标,传给窗体隐藏器

五、循环添加图片(全部)

在添加number到文件路径时,直接加number会被当作字符串,需要利用加号添加:

\\"+number+".jpg"
    //利用循环建立添加所有图片,第16张找不见会自动添加白色private void initImage() {int number=1;//外循环:把内循环重复执行4次for (int i = 0; i < 4; i++) {//内循环:一行添加4张for (int j = 0; j < 4; j++) {//建立imageIcon对象、JLabel对象JLabel jLabel = new JLabel(new ImageIcon("E:\\CODE ENVIRONMENT\\JAVA\\JAVACODE\\Game\\image\\animal\\animal3\\"+number+".jpg"));//设置图片坐标,x,y=0,表示在窗体左上角jLabel.setBounds(105*j,105*i,105,105);//把管理容器添加到界面,图片按照.setBounds传递的坐标位置this.getContentPane().add(jLabel);number++;}}}

6.打乱图片(利用二维数组)

6.1 把一维数组统一放入二维数组

将打乱的一维数组添加到二维数组:

打乱过程:

 int []tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};Random r =new Random();int temp = 0;for (int i = 0; i < tempArr.length; i++) {int index = r.nextInt(16);temp = tempArr[i];tempArr[i]=tempArr[index];tempArr[index]=temp;}

方法1:遍历一维数组tempArr再赋值

int [][]data =new int[4][4];for (int i = 0; i < tempArr.length; i++) {//i/4: i = 0, i/4 = 0; i = 1, i/4 = 0;i = 2, i/4 = 0;i = 3, i/4 = 0....//i%4: i = 0, i%4 = 0; i = 1, i%4 = 1; i = 2, i%4 = 2...data[i/4][i%4]=tempArr[i];}
data[i/4][i%4]很巧妙,保证按照i=1,2,3,4时[0,0] [0,1],[0,2],[0,3] ;当i>=5时就会切换到二维数组第二行,以此类推。

方法2:遍历二维数组再赋值,需要单独设立索引,遍历tempArr

int [][]data =new int[4][4];int index = 0;for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {data[i][j]= tempArr[index];index++;}}

6.2 运用进游戏:

1.现在建立全局二维数组

int [][]data = new int[4][4];

2.加入方法:初始化数据(打乱图片),并在空参构造中调用

private void initData(){int []tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};Random r =new Random();int temp = 0;for (int i = 0; i < tempArr.length; i++) {int index = r.nextInt(16);temp = tempArr[i];tempArr[i]=tempArr[index];tempArr[index]=temp;}for (int i = 0; i < tempArr.length; i++) {data[i/4][i%4]=tempArr[i];}}

3.按照二维数组编号顺序(num),加载图片的位置从而实现打乱

private void initImage() {//外循环:把内循环重复执行4次for (int i = 0; i < 4; i++) {//内循环:一行添加4张for (int j = 0; j < 4; j++) {//获取现在所要添加图片的序号int num =data[i][j];//建立imageIcon对象、JLabel对象JLabel jLabel = new JLabel(new ImageIcon("D:\\WHY\\JAVA code\\Game\\image\\animal\\animal3\\"+num+".jpg"));//设置图片坐标,x,y=0,表示在窗体左上角jLabel.setBounds(105*j,105*i,105,105);//把管理容器添加到界面,图片按照.setBounds传递的坐标位置this.getContentPane().add(jLabel);}}}

4.效果:打乱后每次生成位置随机

               

7.事件

ActionListener(两种练习对应的方法和细节针对三种监听模式都适用)

动作监听只能监听鼠标左键点击和空格

练习1:利用匿名方法类创建动作监听操作

JBotton是按键对象,创建其对象时,后面括号可以写他的按钮的显示名字

动作监听:

jb.addActionListener();括号里面需要的是addActionListener的实体类,但却只是用一次,考虑利用匿名方法类解决这一问题

setSize(int width, int height):定义控件的大小,有两个参数,分别对应宽度和高度;

setLocation(int x, int y):将组件移到新位置,用x 和 y 参数来指定新位置的左上角


setBounds(int x, int y, int width, int height):四个参数,既定义组件的位置,也定义控件的大小; 其实它就是上面两个函数的功能的组合

package test;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;public class test2 {public static void main(String[] args) {//页面初始化JFrame jF = new JFrame();jF.setSize(603,600);jF.setTitle("事件演示");jF.setAlwaysOnTop(true);jF.setLocationRelativeTo(null);jF.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);jF.setLayout(null);//设置按钮JButton jb =new JButton("点我啊");Random r = new Random();jb.setBounds(0,0,100,50);//利用匿名类增加监听jb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("你们不要点我啦!");
//                jb.setSize(100,100);jb.setBounds(r.nextInt(500),r.nextInt(500),100,50);}});//将按钮添加到页面jF.getContentPane().add(jb);jF.setVisible(true);}
}

练习2:利用利用继承和添加接口创建动作监听操作

why:this可以调用方法,看疑惑点笔记

成员类:

//获取当前被操作的按钮对象
Object s = e.getSource();
package test;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;public class test3 extends JFrame implements ActionListener {JButton jb1 =new JButton("你点我啊!");JButton jb2 =new JButton("你点不着我吧!");public test3(){initJFrame();initJButton();//显示整体窗体(true是显示,false是关闭),写在最后this.setVisible(true);}public void initJFrame() {//设置尺寸(单位是尺寸)this.setSize(603,680);//设置标题this.setTitle("事件演示");//设置窗口在页面置顶this.setAlwaysOnTop(true);//设置界面居中生成位置,利用nullthis.setLocationRelativeTo(null);//设置关闭模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消加载图片的默认居中this.setLayout(null);}public void initJButton(){//给按钮设置位置和宽高jb1.setBounds(0,0,100,50);//给按钮添加事件jb1.addActionListener(this);jb2.setBounds(0,100,120,50);jb2.addActionListener(this);this.getContentPane().add(jb1);this.getContentPane().add(jb2);}@Overridepublic void actionPerformed(ActionEvent e) {//获取当前被操作的按钮对象Object s = e.getSource();if (s==jb1){jb1.setSize(200,100);}else if (s==jb2){Random r =new Random();jb2.setLocation(r.nextInt(500),r.nextInt(500));}}
}

测试类:

public class test3_test {public static void main(String[] args) {test3 t =new test3();}
}

 MouseListener

KeyListerner(快捷键的使用):第三个方法不常用

细节:标号不是ASCII码表,e.getKeyCode()获取的是每一个按键的标号

8.美化页面:先加载的图片在上方,后加载的图片放在下方

给图片创建内边框:0,1       /    BevelBoeder.LOWERED, BevelBoeder.RAISED

//加入背景图片JLabel j = new JLabel(new ImageIcon("image\\background.png"));j.setBounds(40,40,508,560);this.getContentPane().add(j);

路径美化: 利用相对路径,从本项目文件夹下一级开始写,或者在本文件夹前加

“..\\”

9.移动图片

实际上是对空白格子进行上下左右移动操作,所以要知道空白格子的位置:

小结:

10.显示完整图片

11、优化路径,方便后期修改

String path ="..\\Game\\image\\animal\\animal3\\";JLabel jLabel = new JLabel(new ImageIcon(path+num+".jpg"));

12、作弊码,一键还原图片

13、判断胜利标准

先加载的图片在上方,后加载的图片放在下方

14、统计步数:

1.先在成员变量设置步数变量

2.在图像初始化设置显示页面

3.在监听方法中,对上下左右移动操作进行step++的操作

15.加入重新游戏、关闭游戏、关于我们等功能

首先要加入动作监听,绑定事件:

重新游戏:

关闭游戏:

else if (s==CloseItem){System.exit(0);}

重新登录:

加载弹框:JDialog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖--sky-take-out(二)3-5

sky-take-out&#xff08;一&#xff09;1-2https://blog.csdn.net/kussm_/article/details/138614737?spm1001.2014.3001.5501 第三天 公共字段填充--利用AOP 问题提出 这些字段属于公共字段 &#xff1a;在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间…

蓝桥杯软件测试-十五届模拟赛2期题目解析

十五届蓝桥杯《软件测试》模拟赛2期题目解析 PS 需要第十五界蓝桥杯模拟赛2期功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试模拟赛2期 题目1&#xff1a;功能测试题目 1&#xff08;测试用例&…

[极速版]写个linux探测自己机器ip地址的tool(基于shell + sshpass)

适用情况&#xff1a;上级路由ssh or teamviewer访问下级路由的机器&#xff0c;但下级路由不支持查看IP 自行完成端口映射or DMZ整机映射 apt-get install sshpass#!/bin/bash mkdir log for i in $(seq 2 255) dosshpass -p tmp ssh -E err.log -o StrictHostKeyCheckingno …

【解决】Tree prefab at index 8 is missing.

开发平台&#xff1a;Unity 2020 版本以上   问题描述 翻译&#xff1a;树预制体集合中第8位预制体丢失。   解决方法&#xff1a;修复丢失树资产 关联 Unity Terrier 组件使用&#xff0c;前往 树绘制工作区&#xff0c;检查 “树资产” 引用是否丢失&#xff1f;删除或重…

【面试题-013】MyBatis 中,`#` 和 `$` 符号区别

在 MyBatis 中&#xff0c;# 和 $ 符号用于参数替换和表达式。它们在 SQL 语句中用于防止 SQL 注入&#xff0c;并允许动态地插入参数值。 # 符号&#xff08;预编译参数&#xff09;: #{parameter} 用于预编译参数。在 SQL 语句中&#xff0c;#{parameter} 会被 MyBatis 解析…

【C/C++】C++类的六个特殊成员函数,附亲测实例

在C中&#xff0c;类的特殊成员函数是指那些由编译器自动生成的函数&#xff0c;它们在特定情况下会被调用&#xff0c;以支持类的某些操作。这些特殊成员函数包括&#xff1a; 默认构造函数&#xff08;Default Constructor&#xff09;&#xff1a; 当没有提供任何构造函数时…

【C++】C++程序的四个区和智能指针的实现

这篇文章介绍下 C 程序的四个区&#xff0c;以及一个智能指针的简单实现。 起因 最近在公司审查代码的时候&#xff0c;coverity 对以下代码&#xff1a; T fun() {Obj obj;//代码逻辑 }报出了 obj 占用空间过大&#xff0c;有可能栈溢出的问题。 以前从来没有考虑过C的代码…

双指针练习:盛水最多的容器

题目链接&#xff1a;11.盛水最多的容器 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可…

【多模态】34、LLaVA-v1.5 | 微软开源,用极简框架来实现高效的多模态 LMM 模型

文章目录 一、背景二、方法2.1 提升点2.2 训练样本 三、效果3.1 整体效果对比3.2 模型对于 zero-shot 形式的指令的结果生成能力3.3 模型对于 zero-shot 多语言的能力3.4 限制 四、训练4.1 数据4.2 超参 五、代码 论文&#xff1a;Improved Baselines with Visual Instruction …

深入了解 Java 泛型

Java 泛型&#xff08;Generics&#xff09;是 Java SE 5 引入的一个强大特性&#xff0c;它允许你定义类、接口和方法时使用类型参数&#xff0c;从而使代码更加灵活和可重用。本篇博客将详细讲解 Java 泛型的概念、使用方法和注意事项&#xff0c;并通过多个代码示例&#xf…

回溯算法指组合总和

题目&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 思路&#xff1a; 这种问题…

python编程:SQLite 管理图片数据库

在本博客中&#xff0c;我们将介绍如何使用 wxPython 和 sqlite3 模块构建一个 GUI 应用程序&#xff0c;该程序可以遍历指定文件夹中的所有图片&#xff0c;并将其信息存储到 SQLite 数据库中。 C:\pythoncode\new\InputImageOFFolderTOSqlite.py 项目简介 我们的目标是创建…

【无标题】2024.6.2

2024.6.2 【明霄升海平&#xff0c;飞彩镌流年。】 Sunday 四月廿六 A. 矩形覆盖 题目描述 有N个矩形&#xff0c;矩形的底边边长为1&#xff0c;且均在X轴上&#xff0c;高度给出&#xff0c;第i个矩形的高为h[i]&#xff0c;求最少需要几个矩形才能覆盖这个图形。 例如h […

微信里的东西怎么打印出来呢

随着微信的普及&#xff0c;我们的日常生活和工作都离不开这个强大的社交工具。无论是重要的工作文件、孩子的作业、还是精彩的旅行照片&#xff0c;我们都习惯在微信里保存和分享。但是&#xff0c;当需要将这些微信里的内容打印出来时&#xff0c;很多人可能会感到困惑和麻烦…

2024.05.18 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | 东风日产2024实习生招聘正式启动 实习 | 东风日产2024实习生招聘正式启动 2、实习 | 达实智能实习生招募令&#xff01; 实习 | 达实智能实习生招募令&#xff01; 3、校招 | …

电力能源指挥中心调度台解决方案主要关注的问题

调度台是指挥中心不可或缺的设备&#xff0c;随着信息化建设的不断深入&#xff0c;电力能源指挥中心已成为重要平台。因此&#xff0c;构建一套高效、智能的电力能源指挥中心调度台解决方案&#xff0c;需要关注以下关键问题&#xff1a; 一、实时监控与数据采集 电力能源指挥…

2.3.2_3 单链表的建立

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏&#xff0c;今后还会不断更新。 此外&#xff0c;《程序员必备技能》专栏和《程序员必备工具》专栏&#xff08;该专栏暂未开设&#xff09;日后会逐步更新&#xff0c;感兴趣的小伙伴可以点一下订阅、收藏、关注&#xff01; 谢…

【AI 大揭秘】ChatGPT 写作绝技与必备提示词大全

利用ChatGPT撰写文章是一种极具创意的方法&#xff0c;它能显著提升您的写作效率&#xff0c;并帮助您创作出高质量的内容。通过人工智能的辅助&#xff0c;您可以迅速、便捷地生成精美文章&#xff0c;或至少为您的下一个写作项目提供灵感。 不管您是在撰写文章、剧本还是电子…

react路由参数path不再支持正则?比较v5和v6写法的差异性

文章目录 前言v5方式&#xff1a;直接在path参数中&#xff0c;写入对应正则&#xff08;1&#xff09;代码详细注释如下&#xff08;2&#xff09;页面输出如下&#xff0c;会出现undefined的情况 v6方式: 在路由对象中配置&#xff0c;但只可配动态路由&#xff0c;不可用正则…

TH方程学习(4)

一、背景介绍 在本节将会对TH方程打包成一个函数&#xff0c;通过输入目标星的轨道要素&#xff0c;追踪星在目标星VVLH坐标系下的相对位置和速度&#xff0c;以及预报的时间&#xff0c;得到预报时刻追踪星在VVLH坐标系下的位置和速度&#xff0c;以及整个状态转移矩阵。 合并…