Java学习笔记------拼图游戏

news2024/11/19 8:23:28

图形化界面GUI

GUI:Graphical User Interface(图像用户接口),指采用图形化的方式显示操作界面

两套体系:AWT包中和Swing包中

组件

JFrame:最外层的窗体

JMenuBar:最上层菜单

JLaber:管理文字和图片的容器

ImageIcon:图片

事件

可以被组件识别的操作

代码游戏界面

package cn.puzzlegame.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener {
    //创建二维数组用以管理数据
    int[][]date=new int[4][4];
    //定义变量,用来记录图片路径
    String path="C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\";
    //定义一个储存正确的数组
    int[][]win=new int[][]{
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    public GameJFrame(){
        //创建主界面
        creatGameJFrame();

         //创建菜单
        creatJmenuBar();
        //初始化数据(打乱)
        creatdate();
        //初始化图片
        createImage();
        //打开界面
        setVisible(true);
    }
    //记录空白块位置
    int x=0;
    int y=0;
    //记录步数
    int step=0;

    private void creatdate() {
        //创建数组
        int[]tem={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        Random r=new Random();
        //打乱
        for(int i=0;i< tem.length;i++){
            int index=r.nextInt(tem.length);
            int temp=tem[i];
            tem[i]=tem[index];
            tem[index]=temp;
        }
        //添加到二维数组中
        for (int i = 0; i<tem.length;i++) {
            if(tem[i]==0){
                x=i/4;
                y=i%4;
            }else {
            date[i/4][i%4]=tem[i];}
        }

    }

    //初始化图片
    private void createImage() {
        //清空
        this.getContentPane().removeAll();
        //判断是否成功
        if (victory()){
            JLabel winJLabel=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\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);

        //循环改进
        //图片已经做了操作
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
            //创建ImageIcon对象
            //ImageIcon icon=new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg");
            //创建JLaber对象
            //JLabel jLabel=new JLabel(icon);
            //合并
            int number=date[i][j];
            JLabel jLabel=new JLabel(new ImageIcon(path+number+".jpg"));
            //指定图片位置+38+134使图片整体位于中间
            jLabel.setBounds(105*j+83,105*i+134,105,105);
            //添加边框BevelBorder 0凸起 1凹陷
            jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
            //添加到界面
            getContentPane().add(jLabel);
            }
        }
        //背景图片
        JLabel background=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\background.png"));
        //设置背景图片位置
        background.setBounds(40,40,508,560);
        getContentPane().add(background);
        //刷新界面
        this.getContentPane().repaint();
        //创建ImageIcon对象
        //ImageIcon icon=new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg");
        //创建JLaber对象
        //JLabel jLabel=new JLabel(icon);
        //合并
        //JLabel jLabel=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg"));
        //指定图片位置
        //jLabel.setBounds(0,0,105,105);
        //添加到界面
        //getContentPane().add(jLabel);
    }

    //创建菜单
    private void creatJmenuBar() {
        //初始化菜单
        JMenuBar jMenuBar=new JMenuBar();
        //主菜单
        JMenu functionJmenu=new JMenu("功能");
        JMenu ahoutJmenu=new JMenu("关于我们");
        JMenu rewardJmenu=new JMenu("打赏");
        //菜单下选项
        JMenuItem replayItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem chagepictureItem=new JMenuItem("更换图片");
        JMenuItem closeItem=new JMenuItem("关闭游戏");
        JMenuItem wechatItem=new JMenuItem("微信号");
        JMenuItem PaymentItem=new JMenuItem("收款码");
        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        chagepictureItem.addActionListener(this);
        closeItem.addActionListener(this);

        //添加
        jMenuBar.add(functionJmenu);
        jMenuBar.add(ahoutJmenu);
        jMenuBar.add(rewardJmenu);
        functionJmenu.add(replayItem);
        functionJmenu.add(reLoginItem);
        functionJmenu.add(chagepictureItem);
        functionJmenu.add(closeItem);
        ahoutJmenu.add(wechatItem);
        rewardJmenu.add(PaymentItem);
        setJMenuBar(jMenuBar);
    }
    //创建游戏窗口
    private void creatGameJFrame() {
        //设置页面大小
        setSize(603,680);
        //设置标题
        setTitle("拼图游戏1.0");
        //设置页面置顶
        setAlwaysOnTop(true);
        //设置居中
        setLocationRelativeTo(null);
        //设置关闭
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认居中
        setLayout(null);
        //整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松手调用
    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        if(code==65){
            //按a显示完整图片
            //清空界面图片
            getContentPane().removeAll();
            //加载完整图片
            JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
            //设置 all大小,添加图片
            all.setBounds(83,134,420,420);
            getContentPane().add(all);
            //添加背景图片
            JLabel background=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\background.png"));
            //设置背景图片位置
            background.setBounds(40,40,508,560);
            getContentPane().add(background);
            //刷新
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利
        if(victory()){return;}
        //判断上下左右
        int code =e.getKeyCode();
        //左37,右39,上38,下40,a65,w87
        if(code==37){
            if(y==3){return;}
            date[x][y]=date[x][y+1];
            date[x][y+1]=0;
            y++;
            step++;
            createImage();

        } else if (code==38) {
            if(x==3){return;}
            date[x][y]=date[x+1][y];
            date[x+1][y]=0;
            x++;
            step++;
            createImage();
        } else if (code==39) {
            if(y==0){return;}
            date[x][y]=date[x][y-1];
            date[x][y-1]=0;
            y--;
            step++;
            createImage();

        }else if(code==40){
            if(x==0){return;}
            date[x][y]=date[x-1][y];
            date[x-1][y]=0;
            x--;
            step++;
            createImage();
        } else if (code==65) {
            createImage();
        } else if (code==87) {
            //创建新二维数组,一键通过
            date=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            createImage();
        }

    }
    //判断是否与win数组数据相同
    public boolean victory(){
        for(int i=0;i< 4;i++){
            for (int j=0;j< 4;j++){
                if(date[i][j]!=win[i][j])
                    //一个不同即失败
                {return false;}
            }
        }
        return true;
    }



    }

效果:

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

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

相关文章

【软考】图的遍历

目录 1. 概念2. 深度优先搜索2.1 说明2.2 步骤 3. 深度优先搜索例子3.1 无向图3.2 代码示例3.3 结果示例3.4 过程 4. 广度优先搜索4.1 说明4.2 步骤 5. 广度优先搜索例子5.1 无向图5.2 代码示例5.3 结果示例5.4 过程5.5 例题5.5.1 题目1 1. 概念 1.图的遍历是指从某个顶点出发…

递增三元组 刷题笔记

题意为 若存在 a中的数小于b中的数&#xff0c;b中的数小于c中的数 则该数算一种方案 思路 暴力模拟优化 两层循环遍历即可 从b到c的过程我们发现 第三层并不需要循环 直接加上 大于b的数量即可 那么第一层和第三层是对称的 我们有没有可能再去掉一层循环 只做一次遍历 …

Spring boot2.7整合jetcache 本地linkedhashmap缓存方案

好 上文 Spring boot2.7整合jetcache 远程redis缓存方案 我们讲完了 远程实现方案 本文 我们来说说 本地 jetcache解决方案 首先是 application.yml 在jetcache下加上 local:default:type: linkedhashmapkeyConvertor: fastjson我们技术用的 本地缓存 linkedhashmap 这里 我们…

netty草图笔记

学一遍根本记不住&#xff0c;那就再学一遍 public static void test_nettyFuture() {NioEventLoopGroup group new NioEventLoopGroup();log.info("开始提交任务");Future<String> future group.next().submit(() -> {log.info("执行异步任…

DualSPHysics使用FlowTool工具进行后处理,定义的粒子全在domains外,解决办法

可以知道DualSPHysics官方给了后处理工具使用的示例&#xff0c;如下就是官方给的案例&#xff0c;使用FlowTool工具可以计算出在两个实体domain内的粒子数。 然而我自己也定义了2个domains&#xff0c;但是计算出来Tank1和Tank2里边的粒子数一直是空的&#xff0c;粒子全部在…

微服务系列(一)springcloudAlibaba之Nacos注册和配置中心及openFeign远程调用

一&#xff0c;认识微服务 我们先看看开发大型项目采用单体架构存在哪些问题&#xff0c;而微服务架构又是如何解决这些问题的。 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署…

数学建模【时间序列】

一、时间序列简介 时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去、分析规律和预测未来&#xff0c;本篇将主要介绍时间序列分析中常用的三种模型&#xff1a;季节分解…

第3集《天台教观纲宗》

乙二、约观行释 诸位法师慈悲&#xff01;陈会长慈悲&#xff01;诸位菩萨&#xff01;阿弥陀佛&#xff01; 请大家打开讲义第六页。我们看到乙二、约观行释。这一科是讲到天台教观的修学宗旨。 我们前面讲到&#xff0c;天台教观整个建立的过程&#xff0c;它是先有观法&a…

AHU 汇编 实验一

一、实验名称&#xff1a;实验1 实验1 用Debug命令查看寄存器和内存中的内容 实验目的:求掌握使用Debug命令查看寄存器和内存的方法。 通过第2章两个简单实例认识汇编语言程序&#xff0c;初步了解程序格式&#xff1b;段定义&#xff1b;标号&#xff1b;DOS系统功能&#xf…

017-$route、$router

$route、$router 1、$route2、$router 1、$route $route 对象表示当前的路由信息&#xff0c;包含了当前 URL 解析得到的信息。包含当前的路径&#xff0c;参数&#xff0c;query对象等。 使用场景&#xff1a; 获取路由传参&#xff1a;this.$route.query、this.$route.par…

Linux-socket套接字

前言 在当今数字化时代&#xff0c;网络通信作为连接世界的桥梁&#xff0c;成为计算机科学领域中至关重要的一部分。理解网络编程是每一位程序员必备的技能之一&#xff0c;而掌握套接字编程则是深入了解网络通信的关键。本博客将深入讨论套接字编程中的基本概念、常见API以及…

C++指针(五)完结篇

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09;、C指针&#xff08;四&#xff09;万字图文详解&#xff01; 本篇博客是介…

Independent Variable Dependent Variable

自变量&#xff08;Independent Variable&#xff09; -----------> 因变量&#xff08;Dependent Variable&#xff09; 数据 ----------------------------------------------结果&#xff0c;报告等等

面试宝典-【redis】

目录 1.什么是缓存穿透 ? 怎么解决 ? 2.什么是布隆过滤器 3.什么是缓存击穿 ? 怎么解决 ? 4.什么是缓存雪崩 ? 怎么解决 ? 5.redis做为缓存&#xff0c;mysql数据如何与redis进行同步?(双写) 6.排他锁是如何保证读写、读读互斥的呢&#xff1f; 7.你听说过延…

3月10日

微机原理 1M1000k 1000/5200 200 NMI INTR 主 从 从 8-288 ZF0 100H MOVBX,[DI] 0AA55 基址 寄存器 ENDS SP 指示型和指令行的区别 指令型的语句是可执行的最终产生机器码会上机运行需要CPU去运行 指示型语句是指示如何汇编 数据定义 DB DW 符号定义 EQU 取值 TYPE OF…

Vite:下一代前端开发与构建工具

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于鹦鹉优化算法(Parrot optimizer,PO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

鲜为人知的闰年判定大坑

【题目描述】 输入年份&#xff0c;判断是否为闰年。如果是&#xff0c;则输出yes&#xff0c;否则输出no。 提示&#xff1a;简单地判断除以4的余数是不够的。 【题目来源】 刘汝佳《算法竞赛入门经典 第2版》习题1-7 年份&#xff08;year&#xff09; 【解析】 一、闰…

多线程多进程处理服务器并发(多进程处理如何解决僵死进程)

目录 1.可循环发送数据的代码 2.改成循环之后每次发现只能处理一个客户端 3.服务器端处理并发问题 3.1 思路 3.2 利用多线程实现并发 ​编辑 3.3 利用多进程实现并发 3.3.1 多进程并发产生的僵死进程问题 ​3.3.2 解决僵死进程问题 1.可循环发送数据的代码 服务器代…

vue 在什么情况下在数据发生改变的时候不会触发视图更新

在 Vue 中&#xff0c;通常数据发生变化时&#xff0c;视图会自动更新。但是&#xff0c;有几种情况可能导致数据变化不会触发视图更新&#xff1a; 1.对象属性的添加或删除&#xff1a; Vue 无法检测到对象属性的添加或删除。因为 Vue 在初始化实例时对属性执行了 getter/se…