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

主界面

小练习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() {
            @Override
            public 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);
        //设置界面居中生成位置,利用null
        this.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);
    }

    @Override
    public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript基础(十一)

String对象的方法 上一次说了String&#xff0c;那也少不了方法。 length 字符串长度 charAt(a) 返回指定位置的字符&#xff0c;(这里a代表下标&#xff0c;它返回的就是下标a对应的字符) concat(b) 连接字符串&#xff0c;b是被合并的对象名&#xff0c;和加号拼接一样…

创新指南|领导者如何评估自己的表现——麦肯锡专有的CEO卓越评估工具

CEO是任何组织中最具挑战性和要求最高的职位之一&#xff0c;尤其是在当前的经济环境下。这也是最重要的职位之一。研究表明&#xff0c;一家公司 45% 的业绩可归因于CEO的影响。但 CEO 们的实际表现如何&#xff1f;他们面临哪些问题&#xff1f;如何帮助他们发挥出最佳水平&a…

HALCON飞拍贴片机框架程序——硬件介绍

本专栏主要讲解三头贴片机框架程序&#xff0c;包括硬件介绍和软件代码。硬件主要为视觉部分&#xff0c;软件为视觉检测代码部分。贴片机的机械硬件不做介绍。 具体设备运行视频可以搜索博主抖Y&#xff1a;“伶俐科技”观看。 贴片机硬件如下图分为三个部分&#xff0c;第一…

了解Maven,并配置国内源

目录 1.了解Maven 1.1什么是Maven 1.2快速创建一个Maven项⽬ 1.3Maven 核⼼功能 1.3.1项⽬构建 1.3.2依赖管理 1.4Maven Help插件 2.Maven 仓库 2.1中央仓库 2.2本地仓库 3.Maven 设置国内源 1.查看配置⽂件的地址 2.配置国内源 3.设置新项⽬的setting 1.了解Ma…

Ubuntu22.04之安装星火应用商店《兼容windows应用》(二百三十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试6月2日预测第9弹

今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;5,4,7,3,2,9,1,0 十位&#xff1a;4,6,5,7,2,9,1,0 个位&#xff1a;3,4,2,5,…

BIT 2024 编译原理 Lab. 4 四代编译器实验说明和要求

实验四&#xff1a;四代编译器实验 一、实验要求 详细实验要求请参考文件《Lab4实验说明和要求.pdf》。 二、实验思路 1、与 lab3 的对比 如果你在 lab3 就已经像我一样单独写了个函数处理表达式&#xff0c;那么理论上&#xff0c;lab4 相比于 lab3&#xff0c;不过就是多…

Ubuntu server 24 (Linux) IPtables 双网卡 共享上网NAT 安装配置DHCP

一 开启路由转发功能 sudo vim /etc/sysctl.conf net.ipv4.ip_forward1 sudo sysctl -p 二 安装DHCP #更新软件包列表&#xff1a; sudo apt update #安装DHCP服务器 sudo apt install isc-dhcp-server #修改监听网卡,根据实际修改 sudo vi /etc/default/isc-dhcp-server …

HTML+CSS 文本动画卡片

效果演示 实现了一个图片叠加文本动画效果的卡片&#xff08;Card&#xff09;布局。当鼠标悬停在卡片上时&#xff0c;卡片上的图片会变为半透明&#xff0c;同时显示隐藏在图片上的文本内容&#xff0c;并且文本内容有一个从左到右的渐显动画效果&#xff0c;伴随着一个白色渐…

15、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、plot()函数默认格式画图 代码&#xff1a; x0:0.1:20;%绘图默认格式 ysin(x); plot(x,y) 2、X轴和Y轴显示范围/axis()函数 代码&#xff1a; x0:0.1:20;%绘图默认格式 ysin(x); plot(x,y) axis([0 21 -1.1 1.1])%设置范围 3、网格显示/grid on函数 代码&#xff1a; …

c++ 继承多态详解

第一节&#xff1a;继承&#xff1a; 1&#xff0c;相关概念 父类&#xff0c;基类。子类&#xff0c;派生类 &#xff08;1&#xff09;基类的私有成员&#xff0c;派生类不可访问 &#xff08;2&#xff09;基类中被保护的成员再子类中可以被访问&#xff0c;但是在类外不可…

计算机毕业设计Hadoop+Spark+Hive知识图谱租房推荐系统 租房数据分析 租房爬虫 租房可视化 租房大数据 大数据毕业设计 大数据毕设 机器学习

毕 业 设 计&#xff08;论 文&#xff09; 基于大数据的租房数据爬虫与推荐分析系统 姓 名 学 院 专 业 班 级 指导教师 摘 要 本设计是一个基于爬虫技术的房地产数据采集与可视化分析应用程序。该程序首先通过爬虫采集网上所有房地产的房源数据…

华为坤灵交换机S300, S500, S210,S220, S200, S310 如何WEB抓包

通过S系列交换机配置端口镜像实现抓包 1、应用场景 端口镜像是指将经过指定端口(源端口或者镜像端口)的报文复制一份到另一个指定端口(目的端口或者观察端口)。在网络运营与维护的过程中&#xff0c;为了便于业务监测和故障定位&#xff0c;网络管理员时常要获取设备上的业务报…

数据分析常用模型合集(二)RARRA模型、RFM模型

随着互联网的发展&#xff0c;前期平台的砸钱拉新、抢占市场&#xff0c;大家都叫AARRR小甜甜&#xff1b; 现在市场基本抢占得差不多&#xff0c;形成了一个平衡&#xff0c;新人基本拉不到多少&#xff0c;用户都知道干什么事有哪些平台&#xff0c;比如买东西主流淘宝、京东…

kotlin1.8.10问题导致gson报错TypeToken type argument must not contain a type variable

书接上回&#xff0c;https://blog.csdn.net/jzlhll123/article/details/139302991。 之前我发现gson报错后&#xff1a; gson在2.11.0给我的kotlin项目代码报错了。 IllegalArgumentException: TypeToken type argument must not contain a type variable 上次解释原因是因为&…

金钱的认知,你如何理解呢?

金钱的认知 建立在金钱之上的爱情是纯真的爱&#xff0c;朋友关系也才够纯粹&#xff0c;才是单纯的世界&#xff0c;反之没了钱的条件爱情和友情的美好关系极易破碎&#xff0c;也极易反目成仇。 心若美好钱就美好&#xff0c;心有欲望狰狞钱就是只咬人的老虎&#xff0c;钱…

量子加速超级计算简介

本文转载自&#xff1a;量子加速超级计算简介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目录 一、概述二、量子计算机的构建块&#xff1a;QPU 和量子位三、量子计算硬件和算法四、…

3DMAX建筑生长动画插件PolyFX安装使用方法

3DMAX建筑生长动画插件PolyFX安装使用教程 PolyFX插件是一个功能强大的工具&#xff0c;它可以将对象分解为片段并根据需要设置动画。它有许多用于微调动画的选项和一些附加工具。这是制作宣传视频、游戏开发等的绝佳解决方案。 【版本要求】 3ds max 2010-2025&#xff08;不…

探究MySQL中的“树”结构

1 引言 树高千丈,叶落求索 – 唐代杜牧 树结构在MySQL中常用于表示层次关系,如组织结构或分类体系。引入树结构可使数据之间建立父子关系,便于查询和管理。益处包括快速检索子节点、方便展示层次关系、支持递归查询等。 2 基础概念 2.1 名词解析 程序就像是一张有向图,你…

Pipecat: 创建语音对话agent的开源框架,支持多模态!

项目简介 pipecat 是用于构建语音&#xff08;和多模态&#xff09;对话代理的框架。诸如私人教练、会议助理、儿童讲故事玩具、客户支持机器人、摄入流程和尖刻的社交伙伴。 看看一些示例应用&#xff1a; 语音代理入门 您可以开始在本地计算机上运行 Pipecat&#xff0c;然…