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

图形化界面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;
    }



    }

效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发系列(二十四)·wxml语法·列表渲染·wx:for-item 和 wx:for-index

目录 1. 如果需要对默认的变量名和下标进行修改&#xff0c;可以使用wx:for-item 和 wx:for-index 2. 将 wx:for 用在 标签上&#xff0c;以渲染一个包含多个节点的结构块 方法一 方法二 3. 总结 3.1 wx:for-item 和 wx:for-index总结 3.2 总结 1. 如果需要对默…

从mysql 数据库表导入数据到elasticSearch的几种方式

从MySQL数据库导入数据到Elasticsearch有几种方式&#xff0c;主要包括以下几种&#xff1a; 1. 使用Logstash&#xff1a; Logstash是一个开源的数据收集引擎&#xff0c;可以用来从不同的数据源导入数据到Elasticsearch。它具有强大的数据处理能力和插件生态系统&…

xlsx.js读取本地文件,按行转成数组数据

1.下包 //1. npm install xlsx //2. yarn add xlsx2.结构 <template><input type"file" change"onFileChange" /> </template>3.代码 <script> import * as XLSX from xlsxexport default {methods: {onFileChange (event) {/…

【“双碳”目标】Acrel-2000Z分布式光伏发电监测系统解决方案

1 概述 “十四五”期间&#xff0c;随着“双碳”目标提出及逐步落实&#xff0c;本就呈现出较好发展势头的分布式光伏发展有望大幅提速。就“十四五”光伏发展规划&#xff0c;国家发改委能源研究所可再生能源发展中心副主任陶冶表示&#xff0c;“双碳”目标意味着国家产业结…

【JS逆向学习】猿人学 第五题 js混淆 乱码

逆向目标 网址&#xff1a;https://match.yuanrenxue.cn/match/5接口&#xff1a;https://match.yuanrenxue.cn/api/match/5?page2&m1709806560791&f1709806560000参数&#xff1a; Cookie(m、RM4hZBv0dDon443M)payload(m、f) 逆向过程 老规矩&#xff0c;上来先分…

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…

修改Android打包apk的名字和目录

app打包生成apk后通常需要进行备份&#xff0c;但是要区分好哪个apk是什么版本的、什么时候打包的&#xff0c;以方便以后区分使用。 最开始的想法是把版本号、创建时间这些加在apk文件名上即可&#xff0c;但是公司要求apk使用一个固定的名称&#xff0c;那我怎么保存版本号信…

OpenGL学习——19.模板测试

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

Vue+OpenLayers7入门到实战:OpenLayers鼠标移动事件使用,实现鼠标移动到点位上方后高亮显示点位要素

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上监听鼠标移动事件,并简单实现鼠标移动到点位上方后高亮显示点位要素的功能,带领大家快速上手OpenLayers鼠标移动事件的应用。 二、依赖和使用 "ol": &quo…

趣味看图-Linux 文件系统的组成

/&#xff08;根目录&#xff09;&#xff1a;根目录是Linux文件系统中的顶级目录。所有其他目录都是根目录的子目录&#xff0c;使其成为整个文件系统的父目录。 /bin&#xff1a;包含启动系统和执行基本操作所需的基本二进制可执行文件。这些对所有用户都可用。 /boot&…

利用yaml文件部署NacosXxl-job到阿里云的ACK

背景介绍 随着容器化的技术成熟落地&#xff0c;拥抱各种成熟的容器化集群平台是加速我们落地的必然之路&#xff0c;目前国内以阿里云、华为云、腾讯云为平台的供应商为主&#xff0c;国外则以AWS&#xff0c;Azure为主&#xff0c;让我们借助平台已有的优势进行快速落地提高…

G-LAB郭主任公开课:Docker容器,3月18日开课!

带你一起走进Linux的世界&#xff01; 【G-LAB】 Linux最新技术—Docker容器 免费公开课即将开讲&#xff01; 不容错过&#xff01; 公开课课程为期两天&#xff0c;3月18日&#xff06;3月19日晚20&#xff1a;00 分享主题&#xff1a; —3月18日 Docker概念、安装、架…

MySQL-QA-异常问题及解决方案(持续更新)

MySQL-Q&A(持续更新) 1.1 PID文件找不到 问题描述 错误详情&#xff1a; ERROR&#xff01;The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid) 解决方案 首先排查配置文件&#xff0c;一般路径为&#xff1a;/etc/my.cnf 检查…

centos安装hadoop启动问题解决方案

1、出现了问题localhost: ERROR: JAVA_HOME is not set and could not be found. *解决方案尝试&#xff1a; 修改hadoop-env.sh&#xff08;在etc/hadoop&#xff09; sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh 将原本的JAVA_HOME 替换为绝对路径就可以了 #expo…

RK3588-hdmiin

1. HDMI-IN简介 HDMI IN功能可以通过桥接芯⽚的⽅式实现&#xff0c;将HDMI信号转换成MIPI信号接收RK3588芯⽚平台⾃带HDMI RX模块&#xff0c;可以直接接收HDMI信号&#xff0c;无需通过桥接芯⽚实现。在ArmSoM系列产品中&#xff0c;ArmSoM-W3支持HDMI-IN功能HDMI-IN功能框图…

3.10复试专业课日报【周末总结】

数据结构 考点一&#xff0c;考点二 操作系统 计算机网络 组成原理 1.什么是中断向量 2. 数据库 选择题80-100 1.数据库的逻辑模型&#xff08;数据模型&#xff09; 2.DCL,DML,DQL,DDL 3.数据库特点 算法 1.复习 对称二叉树&#xff0c;二叉树最大深度 2.只出现一…

Mybatis-plus学习之Lombok

何为Lombok Lombok 是一个 Java 库&#xff0c;旨在通过自动生成样板代码来简化 Java 类的编写。它通过使用注解来减少冗长和重复的代码&#xff0c;提高代码的可读性和开发效率。 优点与优势 使用 Lombok&#xff0c;你可以在 Java 类中添加各种注解&#xff0c;从而自动为…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《含海上风电制氢的综合能源系统分布鲁棒低碳优化运行》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Navicat连接数据库出现的问题(3.8)

Navicat使用教程——连接/新建数据库、SQL实现表的创建/数据插入、解决报错【2059-authentication plugin‘caching_sha2_password’……】_2059authentication plugin-CSDN博客