JAVA小游戏拼图

news2024/12/25 2:09:29

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

第二部创建个包名 来规范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.coloradmin.cn/o/1231510.html

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

相关文章

淘宝商品详情数据接口,淘宝商品优惠券数据接口,淘宝API接口

随着电商行业的快速发展&#xff0c;淘宝作为国内最大的电商平台之一&#xff0c;不断探索和创新&#xff0c;以满足不断变化的用户需求和商家需求。其中&#xff0c;淘宝API接口便是其创新的一个重要方面。本文将深入探讨淘宝API接口的作用、功能、优势以及使用方法&#xff0…

数字化文化的守护之星:十八数藏的非遗创新之道

在数字时代的浪潮中&#xff0c;十八数藏犹如一颗璀璨的守护之星&#xff0c;为传统文化注入了新的生命力。这个非遗创新项目以数字化为工具&#xff0c;以守护为使命&#xff0c;开辟了文化传承的新航道。 十八数藏是文化数字守护的引领者&#xff0c;通过数字技术&#xff0…

【开源】基于Vue.js的计算机机房作业管理系统的设计和实现

项目编号&#xff1a; S 017 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S017&#xff0c;文末获取源码。} 项目编号&#xff1a;S017&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

NX二次开发UF_CAM_ask_config_file 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_config_file Defined in: uf_cam.h int UF_CAM_ask_config_file(const char * * cam_config_filename ) overview 概述 This function provides the name of the CAM configuration fil…

使用Python实现几种底层技术的数据结构

使用Python实现几种底层技术的数据结构 数据结构(data structure)是带有结构特性的数据元素的集合&#xff0c;它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系&#xff0c;并对这种结构定义相适应的运算&#xff0c;设计出相应的算法&#xff0c;并确保经过这…

Labview中for循环“无法终止”问题?即使添加了条线接线端,达到终止条件后,仍在持续运行?

关键&#xff1a; 搞清楚“运行”和“连续运行”两种运行模式的区别。 出现题目中所述问题&#xff0c;大概率是因为代码运行在“连续运行“模式下。 可以通过添加 探针 的方式&#xff0c;加深理解&#xff01;

BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络的背景生物学原理 二、BP神经网络模型 2.1 BP神经网络的结构 2.2 BP神经网络的激活函数 三、BP神经网络的误差函数 四、BP神经网络的训练 4.1 BP神经网络的训练流程 4.2 BP神经网络的训练流…

【并发编程】Synchronized的使用

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

华东理工李洪林课题组开发 Macformer,加速大环类药物发现

大环类化合物是指由 12 个以上原子组成的小分子或肽。相较于其他小分子化合物&#xff0c;大环类化合物在结构和性能上有着诸多优势&#xff0c;也因此被视为各类靶点的潜在治疗药物。 基于药物化学合成的大环类似物是大环类药物的一个主要来源。然而&#xff0c;由于合成方法…

力扣刷题-二叉树-完全二叉树的节点个数

222.完全二叉树的节点个数 给出一个完全二叉树&#xff0c;求出该树的节点个数。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,6] 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;0 示例 3&#xff1a; 输入&#xff1a;root [1]…

拼图游游戏代码

一.创建新项目 二.插入图片 三.游戏的主界面 1.代码 package com.itheima.ui;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…

【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

前言 在上一篇文章中&#xff0c;我们学习了IoC与DI的相关概念与原理&#xff0c;现在让我们 以HelloWorld为例&#xff0c;编写一个程序&#xff0c;让创建对象的工作由Spring帮助我们创建。 一同感受一下Spring框架带给我们开发的便捷性。 文章目录 前言一、编写Java类二、传…

IDEA调用接口超时,但Postman可成功调用接口

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码

基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于非洲秃鹫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

消息中间的应用场景

1、异步处理 比如用户在电商网站下单&#xff0c;下单完成后会给用户推送短信或邮件&#xff0c;发短信和邮件的过程就可以异步完成。因为下单付款是核心业务&#xff0c;发邮件和短信并不属于核心功能&#xff0c;并且可能耗时较长&#xff0c;所以针对这种业务场景可以选择先…

趣学python编程(六、关于蓝桥杯比赛)

蓝桥杯全国软件和信息技术专业人才大赛简称“蓝桥杯”&#xff0c;是由工业和信息化部人才交流中心举办的国内最大的信息技术竞赛。为促进中小学科技创新&#xff0c;提升中小学生逻辑思维&#xff0c;发现和培养面向未来的科技精英人才。 蓝桥杯介绍 蓝桥杯全国软件和信息技术…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

贪吃蛇代码

一.准备 1.新建项目 2.放进照片 3.创建两个包放置图片类和入口类 二&#xff0c;游戏界面 package com.snake.view;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; i…

前缀和(c++,超详细,含二维)

前缀和与差分 当给定一段整数序列a1,a2,a3,a4,a5…an; 每次让我们求一段区间的和&#xff0c;正常做法是for循环遍历区间起始点到结束点&#xff0c;进行求和计算&#xff0c;但是当询问次数很多并且区间很长的时候 比如&#xff0c;10^5 个询问和10^6区间长度&#xff0c;相…

[JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制

文章目录 1. javap -version 版本信息2. javap -verbose 输出附加信息3. javap -l 显示行号和局部变量列表4. javap -c 对代码进行反汇编&#xff08;或叫反编译生成汇编代码&#xff0c;一般说反编译是生成java代码&#xff09;&#xff0c;分解方法代码&#xff0c;也就是显示…