(day8) 自学Java——拼图小游戏

news2025/2/27 6:16:36

GUI(图形用户接口),是指采用图形化的方式显示操作界面。

Java中包含两套完整体系:AWT包,Swing包

一.代码

package com.abc.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
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, ActionListener {
    //创建一个二维数组,用来管理数据
    int[][]arrTow=new int[3][3];
    //定义一个变量记录图片路径
    String path="E:\\java学习\\day2\\src\\com\\abc\\ui\\ran\\";
    //定义一个正确的二维数组
    int[][]win={
            {1,2,3},
            {4,5,6},
            {7,8,0}
    };
    //定义一个变量,存储步数
    int step=0;
    //条目
    JMenu changePicture=new JMenu("更换图片");
    JMenuItem grilPicture=new JMenuItem("美女");
    JMenuItem animalPicture=new JMenuItem("动物");
    JMenuItem morenPicture=new JMenuItem("默认");
    JMenuItem rePlayGame=new JMenuItem("重新游戏");
    JMenuItem reLogin=new JMenuItem("重新登录");
    JMenuItem closeGame=new JMenuItem("关闭游戏");
    JMenuItem checkMa=new JMenuItem("公众号");

    int x=0;
    int y=0;

    public  GameJFrame(){
        //初始化界面
        initJFrame();
        //初始化菜单
        initJMenuBar();
        //初始化数据(打乱图片)
        initData();
        //初始化图片,就是将图片加载到界面中
        initImage();
        //显示界面,建议写在后面
        this.setVisible(true);
    }

    //打乱数据,并将数据存到二维数组
    private void initData() {
        int[]arr={0,1,2,3,4,5,6,7,8};
        Random r=new Random();

        //打乱数字排列
        for (int i = 0; i < arr.length; i++) {
            int randomIndex=r.nextInt(9);
            int temp=arr[i];
            arr[i]=arr[randomIndex];
            arr[randomIndex]=temp;
        }
        //将打乱后的一维数组数据,存储到二维数组中
        int index=0;
        for (int i = 0; i < arrTow.length; i++) {
            for (int i1 = 0; i1 < arrTow.length; i1++) {
                if (arr[index]==0){
                    x=i;
                    y=i1;
                    System.out.println(x+","+y);
                }
                arrTow[i][i1] = arr[index];
                index++;
            }
        }
    }
    //初始化图片
    private void initImage() {
        //清除原始数据
        this.getContentPane().removeAll();
        //判断胜利
        if (victory()){
            this.getContentPane().removeAll();
            JLabel winJlabel=new JLabel(new ImageIcon("E:\\java学习\\day2\\src\\com\\abc\\ui\\image\\4.jpg"));
            winJlabel.setBounds(6,27,600,600);
            this.getContentPane().add(winJlabel);

        }
        //载入图片
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                //创建一个JLabel的对象(管理容器),设置图片的长宽和坐标位置(左上角坐标)
                JLabel jlabel=new JLabel(new ImageIcon(path+arrTow[i][j]+".jpg"));
                jlabel.setBounds(150*j+80,150*i+100,150,150);
                //把管理容器添加到界面中
                //        this.add(jlabel);
                jlabel.setBorder(new BevelBorder(0));
                this.getContentPane().add(jlabel);
            }
        }
        //设置背景
        JLabel jLabel=new JLabel(new ImageIcon("E:\\java学习\\day2\\src\\com\\abc\\ui\\ran\\1.jpg"));
        jLabel.setBounds(6,27,600,600);
        this.getContentPane().add(jLabel);
        this.getContentPane().repaint();
        //设置步数显示
        JLabel stepJLabel=new JLabel("步数: "+step);
        stepJLabel.setBounds(50,30,100,20);
        this.getContentPane().add(stepJLabel);
    }
    //菜单目录
    public void initJMenuBar() {
        JMenuBar jmenueBar=new JMenuBar();
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");

        functionJMenu.add(rePlayGame);
        functionJMenu.add(reLogin);
        functionJMenu.add(closeGame);
        functionJMenu.add(changePicture);
        aboutJMenu.add(checkMa);
       //添加菜单
        jmenueBar.add(functionJMenu);
        jmenueBar.add(aboutJMenu);
        //给整个界面设置菜单
        this.setJMenuBar(jmenueBar);
        //添加子菜单
        changePicture.add(grilPicture);
        changePicture.add(animalPicture);
        changePicture.add(morenPicture);
        //给条目绑定事件
        rePlayGame.addActionListener(this);
        reLogin.addActionListener(this);
        closeGame.addActionListener(this);
        checkMa.addActionListener(this);
        grilPicture.addActionListener(this);
        animalPicture.addActionListener(this);
        morenPicture.addActionListener(this);
    }
    //框架
    public void initJFrame() {
        this.setSize(603,680);
        //设置界面标题
        this.setTitle("拼图 单机版v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消隐藏容器的默认居中设置,图片才可以按照xy轴的方式排列
        this.setLayout(null);
        //添加键盘监听
        this.addKeyListener(this);
    }
    //判断胜利
    public boolean victory(){
        for (int i = 0; i < arrTow.length; i++) {
            for (int j = 0; j < arrTow.length; j++) {
                if (arrTow[i][j]!=win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    //键盘监听
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        //A的ascii码为65
        if (code==65){
            //删除界面中的所有图片
            this.getContentPane().removeAll();
            JLabel jbAll=new JLabel(new ImageIcon(path+"2.jpg"));
            jbAll.setBounds(40,40,500,500);
            this.getContentPane().add(jbAll);
            //背景
            JLabel jLabel=new JLabel(new ImageIcon(path+"1.jpg"));
            jLabel.setBounds(40,40,500,500);
            this.getContentPane().add(jLabel);
            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //如果胜利则不运行以下代码
        if (victory()){
            //直接结束方法
            return;
        }
        //对上下左右做判断并移动
        //左37,上38,右39,下40
        int code=e.getKeyCode();
        if (code==37){
            //左
            System.out.println("左");
            //解决数组范围的bug
            if (y==2){
                return;
            }else {
                arrTow[x][y]=arrTow[x][y+1];
                arrTow[x][y+1]=0;
                //0的x坐标要变
                y++;
                step++;
                //调用方法,以最新排列方式加载
                initImage();
            }
        }
        else if (code==38){
            //上
            System.out.println("上");
            if (x==2){
                return;
            }
            else{
                arrTow[x][y]=arrTow[x+1][y];
                arrTow[x+1][y]=0;
                //0的x坐标要变
                x++;
                step++;
                //调用方法,以最新排列方式加载
                initImage();
            }
        }
        else if (code==39){
            //右
            System.out.println("右");
            if (y==0){
                return;
            }
            else {
                arrTow[x][y]=arrTow[x][y-1];
                arrTow[x][y-1]=0;
                //0的x坐标要变
                y--;
                step++;
                //调用方法,以最新排列方式加载
                initImage();
            }

        }
        else if (code==40) {
            //下
            System.out.println("下");
            if (x == 0) {
                return;
            }
            else{
                arrTow[x][y] = arrTow[x - 1][y];
                arrTow[x - 1][y] = 0;
                //0的x坐标要变
                x--;
                step++;
                //调用方法,以最新排列方式加载
                initImage();
            }
        }
        else if (code==65){
            initImage();
        }
        else if (code==87){
            arrTow=new int[][]{
                    {1,2,3},
                    {4,5,6},
                    {7,8,0}
            };
            initImage();
        }
    }
    //动作监听
    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();
        if (obj==rePlayGame){
            System.out.println("重新游戏");
            //清除步数
            step=0;
            //再打乱数组数据
            initData();
            //重新加载图片
            initImage();

        }else if (obj==reLogin){
            System.out.println("重新登陆");
            //关闭当前游戏界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();
        }else if (obj==closeGame){
            System.out.println("关闭游戏");
            //直接关闭虚拟机
            System.exit(0);
        }else if (obj==checkMa){
            System.out.println("公众号");
            //创建一个弹框对象
            JDialog jDialog=new JDialog();
            //创建一个管理图片的容器对象
            JLabel jlable=new JLabel(new ImageIcon("E:\\java学习\\day2\\src\\com\\abc\\ui\\image\\5.jpg"));
            jlable.setBounds(0,0,258,258);
            jDialog.getContentPane().add(jlable);
            //设置弹框大小
            jDialog.setSize(344,344);
            //弹框置顶
            jDialog.setAlwaysOnTop(true);
            //弹框居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭,无法进行其他操作
            jDialog.setModal(true);
            //显示弹框
            jDialog.setVisible(true);
        }else if (obj==grilPicture){
            step=0;
            path="E:\\java学习\\day2\\src\\com\\abc\\ui\\gril\\";
            initData();
            initImage();
        }
        else if (obj==animalPicture){
            step=0;
            path="E:\\java学习\\day2\\src\\com\\abc\\ui\\animal\\";
            initData();
            initImage();
        }
        else if (obj==morenPicture){
            step=0;
            path="E:\\java学习\\day2\\src\\com\\abc\\ui\\ran\\";
            initData();
            initImage();
        }
    }
}

二.过程分析 

1.创建主界面

.练习:创建主界面1 (使用JFrame)

到idea中创建一个宽603像素,高680像素的游戏主界面

到idea中创建一个宽488像素,高480像素的登陆界面

到idea中创建一个宽488像素,高500像素的注册界面

2.菜单制作

 3.添加图片

将图片放到JLable中 ,JLable可以管理图片和文字。

创建一个ImageIcon对象,并指定图片在电脑中的位置。

图片,文字,进度条都称为组件。

4.打乱顺序

将一维数组打乱再添加进二维数组中

 5.事件

事件是可以被组件识别的操作。

当你对组件干了某件事情之后,就会执行相应的代码。

动作监听:只有点击和空格

鼠标监听:划入动作,按下动作,松开动作,划出动作

键盘监听:按下不放,释放,键入键

动作监听

 简化代码,使用了,匿名内部类(JButton按钮)

 

this的意思是,执行本类里对应的代码

鼠标监听

 

 键盘监听

 6.美化界面

添加游戏背景

先加载的图片在上方,背景图片要在最后添加

 7.移动图片

8.查看完整图片、作弊码、判断胜利

9.计步和菜单业务实现

10.练习 一

11.练习二

 

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

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

相关文章

JavaEE day5 初识CSS 2

选择器 基本选择器&#xff1a;id选择器、类选择器、元素选择器 复合选择器&#xff1a;并列选择器、子孙选择器、孩子选择器 通配符选择器 *{.....} 任意元素&#xff1a;书写一些全局的规则时使用&#xff0c;就等于是一个全局都要遵守的规则 伪类选择器&#xff1a;针…

Lab 3: Midterm Review

Lab3 部分questionQ5&#xff1a;Its Always a Good PrimeQ6&#xff1a;Church numeralsQ5&#xff1a;It’s Always a Good Prime Implement div_by_primes_under, which takes in an integer nand returns an n-divisibility checker. An n-divisibility-checker is a funct…

【蓝桥杯选拔赛真题35】python回文数升级 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python输出N除以3的商 一、题目要求 1、编程实现 2、输入输出

二叉树22:二叉搜索树中的搜索

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;700. 二叉搜索树中的搜索 题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数…

变量的了解

1、普通局部变量 -------------定义形式&#xff1a;在{}里面定义的 普通变量 叫做 普通局部变量 -------------作用范围&#xff1a;所在的 {} 复合语句之间有效 -------------生命周期&#xff1a;所在的 {} 复合语句之间有效 -------------存储区域&#xff1a;栈区 ---…

2.6 JAVA运算符

文章目录1.运算符概述2.运算符具体功能3.基本四则运算符4.取余运算符5.自增自减运算符6.比较运算符7.逻辑运算符8.三目运算符9.赋值运算符10.综合练习&#xff1a;求平年闰年1.运算符概述 运算符用于连接表达式的操作数&#xff0c;并对操作数执行运算。 例如&#xff0c;表达…

使用java来创建es索引(基于es7.8)

1、先引入pom依赖&#xff1a; <dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> …

零基础学JavaWeb开发(二十四)之 springmvc入门到精通(4)

三、整合前端layui 前后端分离架构模式 前端---页面编写好 数据源来自于 后端接口 layui或者vue等 将接口编写好即可&#xff08;springmvc&#xff09; 1、使用layui画出首页界面 html/js/css 表格 - 页面元素 - Layui 引入css <!-- 引入layui css --> <link …

MySQL优化(1)执行计划explain中type属性详解

系列文章目录1.初始化测试数据1.初始化表格&#xff08;user表&#xff09;2.初始化表格&#xff08;product表&#xff09;3.初始化表格&#xff08;user表数据初始化&#xff09;4.初始化表格&#xff08;product表函数&#xff09;5.初始化表格&#xff08;product表数据初始…

雷达编程实战之信号处理流程

信号处理_MatlabAD数据幅相校准1DFFT2DFFT由射频前端发射、接收信号&#xff0c;至获得目标径向距离、径向速度、径向角度、RCS等目标属性信息&#xff0c;这个过程&#xff0c;我们谓之&#xff0c;FMCW毫米波雷达信号处理流程。 VCO为压控振荡器(Voltage Controlled Oscilla…

从技术角度看Android大系统的构成

最近因为工作需要&#xff0c;再次捡起了放下多年的Android开发。说起Android&#xff0c;还是要感谢这个时代&#xff0c;感谢开源。这个时代&#xff0c;让我们开发者&#xff0c;可以通过开源&#xff0c;通过开源的Android&#xff0c;学到很多东西。有如此感慨&#xff0c…

基本二叉树

文章目录接口实现三种基本遍历方式获取节点个数获取叶子节点个数获取树的高度返回第K层节点个数返回x所在节点二叉树的销毁OJ二叉树知识点及选择题N0 N2 1由中序和前序&#xff08;或后序&#xff09;确定结构的方法有N个元素的完全二叉树的深度是 logN 1选择题&#xff1a;…

Linux常用命令——sftp命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sftp 交互式的文件传输程序 补充说明 sftp命令是一款交互式的文件传输程序&#xff0c;命令的运行和使用方式与ftp命令相似&#xff0c;但是&#xff0c;sftp命令对传输的所有信息使用ssh加密&#xff0c;它还…

预处理【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;#define如何定义宏&#xff0c;宏替换的规则&#xff0c;为什么宏定义时不要吝啬我们的括号&#xff0c;为什么宏的参数不能带有副作用&#xff0c;宏和函数的区别。还讲解了预处理符号#和##&#xff0c;#undef指令&#xff0c;众多…

Swift(4)

目录 Dictionary集合 组合赋值符号 区间运算符 字符串字面量里的特殊字符 操作字符 Dictionary集合 相当于java中的Map集合 函数与闭包 函数也可以内嵌 函数其实就是闭包的一种特殊形式&#xff1a;一段可以被随后调用的代码块。闭包中的代码可以访问其生效范围内的变量和…

SpringMVC的@RequestMapping注解

SpringMVC的RequestMapping注解RequestMapping注解的功能RequestMapping注解的位置RequestMapping注解的value属性RequestMapping注解的method属性RequestMapping注解的params属性RequestMapping注解的headers属性什么是headers属性RequestMapping注解的功能 从注解名称上我们…

二叉树23:验证二叉搜索树

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;344. 反转字符串 题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。…

26. 命名空间

前言&#xff1a;如果你接触过c/c/c#/java&#xff0c;那么对于python中的命名空间也是如此&#xff0c;只不过在些许地方存在细微差异&#xff0c;不过倒无伤大雅。 1. 定义 命名空间(Namespace)是从名称到对象的映射&#xff0c;大部分的命名空间都是通过 python 字典来实现…

lamda表达式

lamda表达式可以看作是一个匿名函数。编译器在编译的时候&#xff0c;会将lamda表达式处理成一个仿函数类&#xff0c;类名是类名是不重复的随机名称&#xff08;因为一个作用域中可能存在多个仿函数&#xff09;&#xff0c;返回该仿函数的对象。 lamda既然可以看作是一个匿名…

文件操作(C语言)

目录 1、为什么使用文件 2、什么是文件 程序文件 数据文件 文件名 3、文件的打开和关闭 文件指针 文件的打开和关闭 4、文件的顺序读写 文件读写介绍 文件读写函数 fputc&#xff08;字符 输出/写 函数&#xff09; fgetc&#xff08;字符 输入/读 函数&#xff09; fputs&…