当前位置: 首页 > news >正文

JAVA小游戏 “拼图”

第一步是创建项目 项目名自拟

第二部创建个包名 来规范class  

然后是创建类  创建一个代码类 和一个运行类 

代码如下:

package heima;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
 
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;
 
public class GameJFrame  extends JFrame implements KeyListener,ActionListener{
    //GameJFrame这个界面表示的就是 游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
    
    //创建一个二维数组
    //目的:用来管理数据
    //加载图片的时候,会根据二维数组中的数据来进行加载
    int[][] data =new int[4][4];
    //记录空白方块在二维数组中的位置
    int x=0;
    int y=0;
    //定义一个变量,记录当前展示图片的路径
    String path = "D:\\学习资料\\Java\\拼图小游戏\\image\\animal\\animal1\\";
    //定义一个二维数组  存储一个正确的数据
    int[][] win= {
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,16},
    };
    //定义变量来统计部署
    int step = 0 ;
    
     //创建项目下面的条目对象
     JMenuItem replayItem =new JMenuItem("重新游戏");
     JMenuItem reLoginItem =new JMenuItem("重新登录");
     JMenuItem closeItem =new JMenuItem("关闭游戏");
     
     JMenuItem accountItem =new JMenuItem("丁国俊的微信");
    
     public GameJFrame () {
         //初始化界面
         intiJFrame();
         
         //初始化菜单
         initJMenuBar();
         
         //初始化数据
         initData();
         
         //初始化图片(根据打乱之后的结果去加载图片)
         initImage();
         
         
         
    //设置窗体可见  放到最后
     this.setVisible(true);
}
     
     //初始化数据
     private void initData() {
        //1.定义一个一维数组
         int[] tempArr= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //2.打乱数组中的数据顺序
         //遍历数组中得到的每一个元素,拿到每一个元素跟随索引上的数据进行交换
         Random r = new Random();
         for(int i =0 ;i<tempArr.length;i++) {
             //获取随机索引
             int index = r.nextInt(tempArr.length);
             //拿到遍历到每一个数据,跟随机索引上的数据进行交换
             int temp =tempArr[index];
             tempArr[i] = tempArr[index];
             tempArr[index] =temp;
         }
         
         //4.给二维数组添加数据
         //遍历一维数组tempArr得到每一个元素, 把每一个元素依次添加到二维数组当中
         for(int i=0;i<tempArr.length;i++) {
             if(tempArr[i]==0) {
                 x=i/4;
                 y=i%4;
             }else {
             data[i/4][i%4]=tempArr[i];
             }
         }
    }
     //初始化图片
     //添加图片的时候,就需要按照二维数组中管理的数据添加图片
    private void initImage() {
        //清空原本已经出现的所有图片
        this.getContentPane().removeAll();
        
        if(victory()) {
            //显示胜利图标
            JLabel winJLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\win.png"));
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }
        
        
        
        JLabel stepCount = new JLabel ("步数"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);
        
        
        
        //先加载的图片在上方  后加载的图片在下方
         //外循环---把内循环重复执行了4次
         for (int i = 0; i<4;i++) {
             //内循环---表示一行添加了4张图片
             for (int j = 0; j<4;j++) {
         //获取当前要加载图片的序号
            int num =  data[i][j];
         //创建一个JLabel的对象(管理容器)
         JLabel jLabel =new JLabel(new ImageIcon(path+ num + ".jpg"));
         //指定图片位置
         jLabel.setBounds(105*j+83,105*i+134,105,105);
         //给图片添加边框
         jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//设置边框凹下来
         
         //把管理容器添加到界面中
         this.getContentPane().add(jLabel);//取消默认的居中放置
             }
         }
         JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));
         background.setBounds(40,40,508,560);
         //将背景图片添加到界面中
         this.getContentPane().add(background);
         
         //刷新一下界面
         this.getContentPane().repaint();
         
    }
    public void intiJFrame() {
         
        //GameJFrame这个界面表示的就是 游戏的主界面
            //以后跟游戏相关的所有逻辑都写在这个类
             //设置界面的宽高
             this.setSize(603,680);
             //设置界面的标题
             this.setTitle("拼图单机版v1.8");
             //设置界面置顶
             this.setAlwaysOnTop(true);
             //设置页面居中
             this.setLocationRelativeTo(null);
             //设置关闭模式
             this.setDefaultCloseOperation(3);
             
             //取消默认的居中放置  只有取消了才会按照xy的形式来添加组件
             this.setLayout(null);
             //给整个界面添加键盘监听事件
             this.addKeyListener(this );
             
     } 
     public void initJMenuBar(){
        //初始化菜单
         JMenuBar jMenuBar =new JMenuBar();
         
         //常见菜单上的两个选项的对象(功能 关于我们 )
         JMenu functionJMenu = new JMenu("功能");
         JMenu aboutJMenu = new JMenu("关于我们");
         
         //将每一个选项下面的条目放在选项当中
         functionJMenu.add(replayItem);
         functionJMenu.add(reLoginItem);
         functionJMenu.add(closeItem);
         
         aboutJMenu.add(accountItem);
         
         //给条目绑定时间
         replayItem.addActionListener(this);
         reLoginItem.addActionListener(this);
         closeItem.addActionListener(this);
         accountItem.addActionListener(this);
         
         //将菜单里的两个选项添加到菜单当中去
         jMenuBar.add(functionJMenu);
         jMenuBar.add(aboutJMenu);
         
         //给整个界面设置菜单
         this.setJMenuBar(jMenuBar);
         
         
         
     }
 
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }
    
    @Override
    //按下不松时会调用这个方法
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        int code = e.getKeyCode();
        if(code==65) {
        //把界面所有的图片删除
        this.getContentPane().removeAll();
        //加载第一张完整的图片
        JLabel all =new JLabel(new ImageIcon(path +"all.jpg"));
        all.setBounds(83,134,420,420);
         this.getContentPane().add(all);
        //加载背景图片
        //添加背景图片
         JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));
         background.setBounds(40,40,508,560);
         //将背景图片添加到界面中
         //把背景图片添加到界面中
         this.getContentPane().add(background);
         //刷新界面
         this.getContentPane().repaint();
        }
    }
 
    @Override
    public void keyReleased(KeyEvent e) {
 
        // TODO Auto-generated method stub
        //对 上,下,左,右进行判断
                //左37 上38 右39 下40
                int code =e.getKeyCode();
                if(code ==37) {
                    System.out.println("向左移动");
                    if(y==3){
                        return;
                    }
                    data[x][y] =data[x][y+1];
                    data[x][y+1]=0;
                    y++;
                    //有一次移动,计步器自增一次
                    step++;
                    //调用方法按照最新的数字加载图片
                    initImage();
                }else if(code ==38) {
                    System.out.println("向上移动");
                    //逻辑
                    //空白方框下方的数字往上移动
                    //x,y表示空白方块 
                    //x+1,y表示空白方块下方的数字
                    
                    //把空白方块下方的数字赋值给空白方块
                    if(x==3){
                        return;
                    }
                    data[x][y] =data[x+1][y];
                    data[x+1][y]=0;
                    x++;
                    //有一次移动,计步器自增一次
                    step++;
                    //调用方法按照最新的数字加载图片
                    initImage();
                }else if(code ==39) {
                    System.out.println("向右移动");
                    if(y==0){
                        return;
                    }
                    data[x][y] =data[x][y-1];
                    data[x][y-1]=0;
                    y--;
                    //有一次移动,计步器自增一次
                    step++;
                }else if(code ==40) {
                    System.out.println("向下移动");
                    if(x==0){
                        return;
                    }
                    data[x][y] =data[x-1][y];
                    data[x-1][y]=0;
                    x--;
                    //有一次移动,计步器自增一次
                    step++;
                    //调用方法按照最新的数字加载图片
                    initImage();
                }else if(code ==65){
                    initImage();
                }else if(code ==87) {
                    data =new int[][] {
                        {1,2,3,4},
                        {5,6,7,8},
                        {9,10,11,12},
                        {13,14,15,16}
                    };
                    initImage();
                }
    }
    //判断data数组中的数据是否跟win数组中的i昂同
    //如果全部相同返回true,否则返false
    public boolean victory() {
        for( int i=0;i<data.length;i++) {
            //i:依次表示二维数组中的data里面的索引
            //data[i]:依次表示每一个一维数组
            for(int j=0;j<data[i].length;j++) {
                if(data[i][j] !=win[i][j]) {
                    //只要有一个数据不一样则返回false
                    return false;
                }
            }
        }
        //循环结束表示数组遍历比较完毕  ,全部一样的话返回true
        return false;
        
    }
    public void  actionPerformed(ActionEvent e) {
        //获取当前被点击的条目对象
        Object obj =e.getSource();
        //判断
        if(obj ==replayItem) {
            System.out.println("重新游戏");
            
            //计步器清零
            step = 0;
            
            //再次打乱二维数组
            initData();
            
            //重新加载图片
            initImage();
        }else if(obj == reLoginItem) {
            System.out.println("重新登录");
            this.setVisible(false);
            //打开登入界面
            new LoginJFrame();
        }else if(obj == closeItem) {
            System.out.println("关闭游戏");
            //直接关闭游戏
            System.exit(0);
        }else if(obj == accountItem) {
            System.out.println("丁国俊的微信");
            JDialog jDialog=new JDialog();
            //创建一个管理图片的容器对象jDialog
            JLabel jLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\微信图片_20231119183326.jpg")) ;
            //设置位置和宽高
            jLabel.setBounds(0,0,258,258);
            //把图片添加到弹框中
            jDialog.getContentPane().add(jLabel);
            //设置弹框大小
            jDialog.setSize(344,344);
            //让弹框置顶
            jDialog.setAlwaysOnTop(true);
            //让弹框剧中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭则无法操作下面的界面
            jDialog.setModal(true);
            //让弹框显示出来
            jDialog.setVisible(true);
        }
    }
}

测试类如下:

package heima;
 
public class App {
    public static void main(String[]args) {
        //表示程序的启动入口
        //如果我们想要开启一个界面,就创建谁的对象就可以了
        new GameJFrame();//调用游戏主界面窗体
        //new RegisterJFrame();//注册界面
        //new LoginJFrame();//登入界面
    }
}
运行结果如下:

相关文章:

JAVA小游戏 “拼图”

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …...

Spring 配置

配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…...

全新酷盒9.0源码:多功能工具箱软件的最新iapp解决方案

全能工具箱软件酷盒&#xff1a;源码提供iapp解决方案&#xff0c;自定义打造个性化体验 酷盒是一款功能丰富的工具箱软件&#xff0c;内置众多实用功能&#xff0c;并实时更新热门功能。该软件还拥有丰富的资源库&#xff0c;用户可以在线畅玩游戏、免费下载音乐等。 我们提…...

aspose.cells java合并多个excel

背景 有需求需要把多个excel合并到一个excel文件里面&#xff0c;之前一直都是用python来处理办公自动化的东西&#xff0c;但是这个需求用python的openxyl库处理基本只能合并数据&#xff0c;样式没办法一比一合并过去&#xff0c;找了很多解决方案都没法实现&#xff0c;所以…...

【每日一题】三个无重叠子数组的最大和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;滑动窗口 写在最后 Tag 【滑动窗口】【数组】【2023-11-19】 题目来源 689. 三个无重叠子数组的最大和 题目解读 解题思路 方法一&#xff1a;滑动窗口 单个子数组的最大和 我们先来考虑一个长度为 k 的子数组的最…...

react之基于@reduxjs/toolkit使用react-redux

react之基于reduxjs/toolkit使用react-redux 一、配置基础环境二、使用React Toolkit 创建 counterStore三、为React注入store四、React组件使用store中的数据五、实现效果六、提交action传递参数七、异步状态操作 一、配置基础环境 1.使用cra快速创建一个react项目 npx crea…...

基于51单片机水位监测控制报警仿真设计( proteus仿真+程序+设计报告+讲解视频)

这里写目录标题 &#x1f4a5;1. 主要功能&#xff1a;&#x1f4a5;2. 讲解视频&#xff1a;&#x1f4a5;3. 仿真&#x1f4a5;4. 程序代码&#x1f4a5;5. 设计报告&#x1f4a5;6. 设计资料内容清单&&下载链接&#x1f4a5;[资料下载链接&#xff1a;](https://doc…...

git基本用法和操作

文章目录 创建版本库方式&#xff1a;Git常用操作命令&#xff1a;远程仓库相关命令分支(branch)操作相关命令版本(tag)操作相关命令子模块(submodule)相关操作命令忽略一些文件、文件夹不提交其他常用命令 创建版本库方式&#xff1a; 创建文件夹 在目录下 右键 Git Bush H…...

设计模式-组合模式-笔记

“数据结构”模式 常常有一些组件在内部具有特定的数据结构&#xff0c;如果让客户程序依赖这些特定数据结构&#xff0c;将极大地破坏组件的复用。这时候&#xff0c;将这些特定数据结构封装在内部&#xff0c;在外部提供统一的接口&#xff0c;来实现与特定数据结构无关的访…...

Android 弹出自定义对话框

Android在任意Activity界面弹出一个自定义的对话框&#xff0c;效果如下图所示: 准备一张小图片&#xff0c;右上角的小X图标64*64&#xff0c;close_icon.png&#xff0c;随便找个小图片代替&#xff1b; 第一步&#xff1a;样式添加&#xff0c;注意&#xff1a;默认在value…...

(论文阅读40-45)图像描述1

40.文献阅读笔记&#xff08;m-RNN&#xff09; 简介 题目 Explain Images with Multimodal Recurrent Neural Networks 作者 Junhua Mao, Wei Xu, Yi Yang, Jiang Wang, Alan L. Yuille, arXiv:1410.1090 原文链接 http://arxiv.org/pdf/1410.1090.pdf 关键词 m-RNN、…...

4核8G服务器价格选择轻量还是CVM合适?

腾讯云服务器4核8G配置优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云百科txybk.com分…...

Selenium操作已经打开的Chrome浏览器窗口

Selenium操作已经打开的Chrome浏览器窗口 0. 背景 在使用之前的代码通过selenium操作Chrome浏览器时&#xff0c;每次都要新打开一个窗口&#xff0c;觉得麻烦&#xff0c;所以尝试使用 Selenium 获取已经打开的浏览器窗口&#xff0c;在此记录下过程 本文使用 chrome浏览器来…...

创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究

&#x1f50d;&#x1f4c8; 创新研究报告 |新业务拓展&#xff1a;CEO推动企业成长的必然选择 – 麦肯锡研究 &#x1f525;&#x1f4bc; 所有执行长和商界领袖请注意&#xff01;您是否正在寻找为您的组织释放成长机会的钥匙&#xff1f; &#x1f310; 麦肯锡最近的一份研究…...

rv1126-rv1109-openssh

这是一个工具&#xff0c;可以通过ssh远程登录来操作&#xff0c;非常逆天&#xff01; 于是rv1109代码自身自带有openssh 所以只需要打开config即可 diff --git a/buildroot/configs/rockchip_rv1126_rv1109_spi_nand_defconfig b/buildroot/configs/rockchip_rv1126_rv1109…...

MySQL中json类型,你使用过吗

在最近的项目开发过程中&#xff0c;遇到了消息发送内容以Map形式存储的情况。最初的解决方案是将对象转换为字符串&#xff0c;并存储在MySQL的varchar(3000)字段中。然而&#xff0c;由于对存储空间的限制&#xff0c;不得不寻找其他解决方案。在调研中发现&#xff0c;从MyS…...

MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法

系列文章目录 文章目录 系列文章目录前言一、相关函数 —— LQG/LQR 和极点配置算法1.1 LQR —— lqr 函数1.1.1 函数用法1.1.2 举例1.1.2.1 倒摆模型的 LQR 控制 1.2 LQG —— lqg() 函数1.2.1 函数用法1.2.2 举例 1.3 极点配置 —— place() 函数1.3.1 函数用法1.3.2 示例1.3…...

杭州-区块链前瞻性论坛邀请函​

2023密码与安全前瞻性论坛邀请函 生成合法节点或非法节点&#xff0c;测试共识协议...

ElasticSearch学习篇6_ES实践与Lucene对比及原理分析技术分享小记

前言 QBM、MFS的试题检索、试题查重、公式转换映射等业务场景以及XOP题库广泛使用搜索中间件&#xff0c;业务场景有着数据量大、对内容搜索性能要求高等特点&#xff0c;其中XOP题库数据量更是接近1亿&#xff0c;对检索性能以及召回率要求高。目前QBM、MFS使用的搜索中间件是…...

mysql练习1

-- 1.查询出部门编号为BM01的所有员工 SELECT* FROMemp e WHEREe.deptno BM01; -- 2.所有销售人员的姓名、编号和部门编号。 SELECTe.empname,e.empno,e.deptno FROMemp e WHEREe.empstation "销售人员";-- 3.找出奖金高于工资的员工。 SELECT* FROMemp2 WHE…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...