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.hqwc.cn/news/195748.html

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

相关文章

SpringCloud 微服务全栈体系(十四)

第十一章 分布式搜索引擎 elasticsearch 四、RestAPI ES 官方提供了各种不同语言的客户端&#xff0c;用来操作 ES。这些客户端的本质就是组装 DSL 语句&#xff0c;通过 http 请求发送给 ES。官方文档地址&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/…

nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 …

nodejs+vue实验室上机管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 在实验室上机前&#xff0c;实验室管理员需要对教务处发来的上机课表…

SpringBoot常见注解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

leetcode算法之分治-快排

目录 1.颜色分类2.排序数组3.数组中的第k个最大元素4.最小的k个数 1.颜色分类 颜色分类 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,rightn,i0;while(i<right){if(nums[i] 0) swap(nums[left],nums[i]);e…

全新云开发工具箱:融合多项功能的微信小程序源码解决方案

全新云开发工具箱&#xff1a;融合多项功能的微信小程序源码解决方案 这款微信小程序源码提供了超过40个功能&#xff0c;集合了各种实用工具&#xff0c;成为一款全能工具箱。这些功能包括证件照制作、垃圾分类查询、个性签名制作、二维码生成、文字九宫格、手持弹幕、照片压…

2023.11.17 关于 Spring Boot 日志文件

目录 日志文件作用 常见的日志框架说明 门面模式 日志的使用 日志的级别 六种级别 日志级别的设置 日志的持久化 使用 Lombok 输出日志 实现原理 普通打印和日志的区别 日志文件作用 记录 错误日志 和 警告日志&#xff08;发现和定位问题&#xff09;记录 用户登录…

Django+Vue项目创建 跑通

参考链接&#xff1a; 【精选】DjangoVue项目构建_django vue-CSDN博客 一、背景 主要介绍如何使用后端Django 前端Vue 的技术栈快速地搭建起一套web项目的框架。 为什么使用Django和Vue? Django是Python体系下最成熟的web框架之一&#xff0c;由于Python语言的易用…

算法设计与分析【期中+期末复习知识点总结】(持续更新)

第1章&#xff1a;算法概述 算法&#xff1a;具有输入、输出、确定性、有限性。 程序&#xff08;算法数据结构程序&#xff09;&#xff1a;具有输入、输出、确定性&#xff08;注意&#xff1a;程序可以不满足有限性&#xff0c;如操作系统是在无限循环中执行的程序&#x…

文心一言 VS 讯飞星火 VS chatgpt (138)-- 算法导论11.4 2题

二、用go语言&#xff0c;试写出HASH-DELETE 的伪代码;修改 HASH-INSERT&#xff0c;使之能处理特殊值DELETED。 文心一言&#xff1a; 首先&#xff0c;让我们定义一个基本的哈希表数据结构。这个结构将包括一个存储键值对的哈希表和一个存储已删除键值对的队列。我们可以用…

基于SpringBoot的SSMP整合案例(在Linux中发布项目的注意事项与具体步骤步骤)

前言与注意 这几天在Linux中上线之前的小项目时&#xff0c;遇到了很多的问题&#xff0c;Linux镜像的选择&#xff0c;jdk&#xff0c; mysql在linux中的下载&#xff0c;使用finallshell连接linux&#xff0c;使用tomcat连接linux中的数据库........ 在下面的注意事项中我会将…

【好用的个人工具】搭建一款实用的个人IT工具箱——it-tools

【好用的个人工具】搭建一款实用的个人IT工具箱——it-tools 一、it-tools介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载it-tools镜像五、部署it-tools工具箱5.1 创建…