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();//登入界面
    }
}
运行结果如下:

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

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

相关文章

10、信息打点——APP小程序篇抓包封包XP框架反编译资产提取

APP信息搜集思路 外在——抓包封包——资产安全测试 抓包&#xff08;Fiddle&茶杯&burp&#xff09;封包&#xff08;封包监听工具&#xff09;&#xff0c;提取资源信息 资产收集——资源提取——ICO、MAD、hash——FOFA等网络测绘进行资产搜集 外在——功能逻辑 内在…

国际版Amazon Lightsail的功能解析

Amazon Lightsail是一项易于使用的云服务,可为您提供部署应用程序或网站所需的一切,从而实现经济高效且易于理解的月度计划。它是部署简单的工作负载、网站或开始使用亚马逊云科技的理想选择。 作为 AWS 免费套餐的一部分&#xff0c;可以免费开始使用 Amazon Lightsail。注册…

【Python进阶】近200页md文档14大体系第4篇:Python进程使用详解(图文演示)

本文从14大模块展示了python高级用的应用。分别有Linux命令&#xff0c;多任务编程、网络编程、Http协议和静态Web编程、htmlcss、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。 Python全套笔记直接地址…

PostgreSQL10安装postgis插件

1.安装pgsql10 2.下载插件&#xff0c;以Windows为例&#xff0c;地址&#xff1a;Index of /postgis/windows/pg10/ 3.安装插件&#xff0c;直接安装&#xff0c;和pgsql的目录相同即可&#xff0c;一直下一步 4.安装之后&#xff0c;需要执行sql打开 CREATE EXTENSION po…

028 - STM32学习笔记 - ADC结构体学习(二)

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…

Redis设计与实现-数据结构(建设进度17%)

Redis数据结构 引言数据结构stringSDS数据结构原生string的不足 hash 本博客基于《Redis设计与实现》进行整理和补充&#xff0c;该书依赖于Redis 3.0版本&#xff0c;但是Redis6.0版本在一些底层实现上仍然没有明显的变动&#xff0c;因此本文将在该书的基础上&#xff0c;对于…

PostgreSQL基本操作

1.查询某个表的所在磁盘大小 select pg_size_pretty(pg_relation_size(grb_grid)); 2.插入point类型的记录 insert into tb_person ("name", "address", "location", "create_time", "area", "girls") values …

Java 两个线程交替打印1-100

线程题&#xff1a;交替打印1-100 这里演示两个线程&#xff0c;一个打印奇数&#xff0c;一个打印偶数 方式一&#xff1a;synchronized FixedThreadPool public class example {private static int count 1;private static final Object lock new Object();public stat…

WPF基础DataGrid控件

WPF DataGrid 是一个用于显示和编辑表格数据的强大控件。它提供了丰富的功能&#xff0c;包括排序、筛选、分组、编辑、选择等&#xff0c;使你能够以类似电子表格的方式呈现和操作数据。 DataGrid 的布局主要由以下部分组成&#xff1a; 列定义 (Columns): DataGrid 列定义了…

YOLO目标检测——卫星遥感多类别检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;卫星遥感目标检测数据集说明&#xff1a;卫星遥感多类别检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含网球场、棒球场、篮球场、田径场、储罐、车辆、桥、飞机、船等类别标签说明&#xff1a;使用lableimg标…

2023年【上海市安全员C证】考试及上海市安全员C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年上海市安全员C证考试为正在备考上海市安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的上海市安全员C证找解析祝您顺利通过上海市安全员C证考试。 1、【多选题】2017年9月颁发的《中共上海市委…

基于STM32的烟雾浓度检测报警仿真设计(仿真+程序+讲解视频)

这里写目录标题 &#x1f4d1;1.主要功能&#x1f4d1;2.仿真&#x1f4d1;3. 程序&#x1f4d1;4. 资料清单&下载链接&#x1f4d1;[资料下载链接](https://docs.qq.com/doc/DS0VHTmxmUHBtVGVP) 基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解&#xff09; 仿真图prot…

【数据结构】B : DS图应用--最短路径

B : DS图应用–最短路径 文章目录 B : DS图应用--最短路径DescriptionInputOutputSampleInput Output 解题思路&#xff1a;初始化主循环心得&#xff1a; AC代码 Description 给出一个图的邻接矩阵&#xff0c;再给出指定顶点v0&#xff0c;求顶点v0到其他顶点的最短路径 In…

SkyWalking配置报警推送到企业微信

1、先在企业微信群里创建一个机器人&#xff0c;复制webhook的地址&#xff1a; 2、找到SkyWalking部署位置的alarm-settings.yml文件 编辑&#xff0c;在最后面加上此段配置 &#xff01;&#xff01;&#xff01;一定格式要对&#xff0c;不然一直报警报不出来按照网上指导…

JVM 堆外内存详解

Java 进程内存占用除了JVM 运行时数据区&#xff0c;还有直接内存&#xff08;Direct Memory&#xff09;区域及 JVM 程序自身也会占用内存 直接内存&#xff08;Direct Memory&#xff09;区域&#xff1a;直接内存通过使用Native堆外内存来存储数据&#xff0c;这意味着数据…

大数据平台实践之CDH6.2.1+spark3.3.0+kyuubi-1.6.0

前言&#xff1a;关于kyuubi的原理和功能这里不做详细的介绍&#xff0c;感兴趣的同学可以直通官网&#xff1a;https://kyuubi.readthedocs.io/en/v1.7.1-rc0/index.html 下载软件版本 wget http://distfiles.macports.org/scala2.12/scala-2.12.16.tgz wget https://archi…

pikachu_php反序列化

pikachu_php反序列化 源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }//O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_POST[o])){$s $_POST[…

基于python人脸性别年龄检测系统-深度学习项目

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术组成1. OpenCV2. Dlib3. TensorFlow 和 Keras 功能流程 二、功能三、系统四. 总结 一项目简介 # Python 人脸性别年龄检测系统介绍 简介 该系统基…

用idea搭建一个spring cloud微服务项目

以下是使用 IntelliJ IDEA 搭建 Spring Cloud 微服务项目的步骤&#xff1a; 创建一个新的 Maven 项目。 在 pom.xml 文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-…

Android studio 迁移之后打开没反应

把Android studio由d盘迁移到c盘&#xff0c;点击没反应&#xff1b; 需要把C:\Users\xxxx\AppData\Roaming\Google\AndroidStudio2022.3 目录下的studio64.exe.vmoptions 修改为C:&#xff0c;删除该文件会导致无法安装app。 里面配置了一个