用Java写一个小游戏

2023-11-09

源码地址:
https://pan.baidu.com/s/18y8Et8QnahhDdz7N–0Rsg 提取码: b3tr

游戏开始图片 如下:在这里插入图片描述
游戏胜利图片 如下:
在这里插入图片描述

游戏分析:

       玩家控制键盘上下左右键,当数字按照从小到大依次排列的时候则玩家获胜
游戏功能
1、在游戏的菜单栏中设置了游戏的重新开始案件
2、制作了一个作弊键
3、设置了游戏步数计数器


编写过程用到的小知识点

JFrame、JMenuBar、JMenu、JMenuItem、JLabel、ImageIcon和继承等小知识点


代码示例

第一页代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
//继承JFrame类添加监听器
public class MyJFrame extends JFrame implements KeyListener, ActionListener {
    //创建一个二维数组
    int[][] datas = new int[4][4];
    //创建一个二维数组为胜利情况下的数组用于胜利判断
    int[][] victory = new int[][]{{1, 2, 3 ,4},{5, 6, 7 ,8},{9, 10, 11 ,12},{13, 14, 15 ,0},};
    //计算步骤
    int step = 0;
    int x0 = 0;
    int y0 = 0;
    public MyJFrame(){
        //初始化窗体
        initJFrame();
        //初始化菜单
        initMenu();
        //将创建的有序数组随机排列后重新存入二维数组
        initData();
        //初始化图片
        initImage();
        //创建窗体
        this.setVisible(true);
    }
    //创建初始化窗体方法
    public void initJFrame(){
        //设置窗体宽高
        this.setSize(514,595);
        //将窗体设置在屏幕正中央
        this.setLocationRelativeTo(null);
        //将窗体覆盖过其他窗体
        this.setAlwaysOnTop(true);
        //点击叉子退出程序
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //给窗体设置标题
        this.setTitle("石头迷阵单机版 v1.0");
        //让界面添加键盘监听
        this.addKeyListener(this);
        //取消内部居中放置方式
        this.setLayout(null);
    }
    //创建初始化菜单方法
    public void initMenu(){
        //创建菜单对象
        JMenuBar jMenuBar;
        jMenuBar = new JMenuBar();
        //设置菜单宽高
        jMenuBar.setSize(514,20);
        //创建一个选项
        JMenu jMenu = new JMenu("功能");
        //创建一个条目
        JMenuItem jMenuItem = new JMenuItem("重新游戏");
        //将创建的条目绑定监听器
        jMenuItem.addActionListener(this);
        //把条目放到选项里
        jMenu.add(jMenuItem);
        //把选项放到菜单里
        jMenuBar.add(jMenu);
        //把菜单放到窗体里
        this.setJMenuBar(jMenuBar);
    }
    //创建初始化图片方法
    public void initImage(){
        this.getContentPane().removeAll();
        JLabel label_step = new JLabel("步数" + step);
        label_step.setBounds(50, 20,100,20);
        this.add(label_step);
        if (victory()){
            ImageIcon imageIcon = new ImageIcon("image\\win.png");
            JLabel jLabel = new JLabel(imageIcon);
            jLabel.setBounds(514/2-266/2,230,266,88);
            this.add(jLabel);
        }
        for (int i = 0; i < datas.length; i++){
            for (int j = 0; j < datas[i].length; j++) {
                int data = datas[i][j];
                if (data != 0){
                    ImageIcon imageIcon = new ImageIcon("image\\"+ data +".png");
                    //创建了一个JLabel对象
                    JLabel jLabel = new JLabel(imageIcon);
                    //设置jLabel的宽高坐标
                    jLabel.setBounds(j * 100 + 50,i *100 + 90,100,100);
                    this.add(jLabel);
                }
            }
        }
        //添加背景图片
        ImageIcon  background = new ImageIcon("image\\background.png");
        JLabel backgroundJLabel = new JLabel(background);
        backgroundJLabel.setBounds(26, 30, 450,484);
        this.add(backgroundJLabel);
        //将整个界面重新绘制
        this.getContentPane().repaint();
    }
    //此方法用于判断游戏是否完成
    public boolean victory() {
        //判断数组是否相等datas和victory
        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                if (datas[i][j] != victory[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
    //初始化随机二维数组
    public void initData(){
        int[] temp = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, };
        for (int i = 0; i < temp.length; i++) {
            Random r = new Random();
            //因为temp的长度为16,而.nextInt(temp.length)方法的意思是生成范围为[0,16)的随机数
            int index = r.nextInt(temp.length);
            //当我们获得索引的随机数后,我们需要将索引所在元素和当前循环的元素换位置
            int number = temp[i];
            temp[i] = temp[index];
            temp[index] = number;
        }
        for (int i = 0; i < temp.length; i++) {
            //将已经打乱了后的数组存放于二维数组中保存
            datas[i /4][i % 4] = temp[i];
            if (temp[i] == 0){
                x0 = i / 4;
                y0 = i %4;
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按压
    @Override
    public void keyPressed(KeyEvent e) {

    }
    //松开
    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        move(keyCode);
        //重新绘制界面
        initImage();
    }
    //图片移动方法
    public void move(int keyCode){
        //37代表键盘中的左键
        if (keyCode == 37){
            //防止在最右边的一列还要向右移动报错
            if (y0 == 3){
                return;
            }
            datas[x0][y0] = datas [x0][y0 + 1];
            datas[x0][y0 +1] = 0;
            y0++;
            step++;
        //38代表上
        }else if (keyCode == 38){
            if (x0 == 3){
                return;
            }
            datas[x0][y0] = datas [x0 + 1][y0];
            datas[x0 +1][y0] = 0;
            x0++;
            step++;
        //右
        }else if (keyCode == 39){
            if (y0 == 0){
                return;
            }
            datas[x0][y0] = datas [x0][y0 - 1];
            datas[x0][y0 - 1] = 0;
            y0--;
            step++;
        //下
        }else if (keyCode == 40){
            if (x0 == 0){
                return;
            }
            datas[x0][y0] = datas [x0 - 1][y0];
            datas[x0 - 1][y0] = 0;
            x0--;
            step++;
        }
        //作弊键  一步胜利   w键
        else if (keyCode == 87){
            datas = new int[][]{{1, 2, 3 ,4},{5, 6, 7 ,8},{9, 10, 11 ,12},{13, 14, 15 ,0},};
        }
    }

    @Override
    //重新游戏,把图片随机排列,步数清零
    public void actionPerformed(ActionEvent e) {
        initData();
        step = 0;
        initImage();

    }
}

第二页代码

public class App {
    public static void main(String[] args) {
        MyJFrame jFrame = new MyJFrame();
    }
}

这是我跟着网上的教学一点点写出来的,因为刚学java没多久,写个小项目练习用。
源码下载地址在评论区,免费不收币

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Java写一个小游戏 的相关文章

随机推荐

  • html 线条外阴影,怎么添加阴影边框?

    本文介绍使用CSS添加阴影边框和word文档中添加阴影边框的方法 有一定的参考价值 有需要的朋友可以参考一下 希望对大家有所帮助 CSS添加阴影边框的方法 方法1 使用box shadow属性添加阴影边框 相关推荐 css在线手册 box
  • 程序员最全的Linux命令,不全来找我随时更新!

    一 引言 1 1 Linux引言 Linux是一套免费使用和自由传播的类Unix操作系统 是一个基于POSIX和Unix的多用户 多任务 支持多线程和多CPU的操作系统 伴随着互联网的发展 Linux得到了来自全世界软件爱好者 组织 公司的
  • 常见传感器和芯片的介绍

    文章目录 一 传感器 1 1 KY xxxx系列 KY 002 KY 003 KY 004 KY 005 KY 006 KY 007 KY 008 KY 009 KY 010 KY 011 KY 012 KY 013 KY 014 KY 0
  • 虚拟服务器ftp上传权限设置,13. 为 FTP虚拟用户设置“不同文件目录”和“访问权限”...

    Re FTP 文件传输服务 FTP 服务不论在企业或教学中 是很常用的文件共享方式 它既可以做到匿名访问 也可以做到用户名和密码访问 更可以做到只能提交但不能够访问的特殊要求等等功能 本课程将一一详细演示 FTP 服务器的一般应用场景在 企
  • check allInputDimensionsSpecified() for second profile fail

    目录 yolov7 tensorrt预测时报错 在python代码里 在调用engine推理前做这样的设置即可 yolov7修改后的tenorr
  • Java JUC概述

    Java JUC Java Util Concurrent 是 Java 平台提供的并发编程工具包 它提供了一系列的工具类和接口 用于简化多线程编程 JUC 中的类和接口都是基于 Java 平台的底层并发原语 如锁 信号量 原子变量等 实现
  • 机器视觉及其应用发展

    导读 一 机器视觉的研究和发展动态 机器视觉的研究 发展和应用还远没有达到成熟的程度 机器视觉从诞生到今天才只有短短的三十多年时间 在机器视觉中承担 大脑 作用的图像分析处理 图像理解和模式识别理论和技术基础还非常不完善 甚至 机器视觉的图
  • TextMeshPro 使用及性能

    目录 TextMeshPro 组件介绍 Main Setting Extra Setting 轮廓 阴影 外发光 表情混编使用 表情资源制作 中文字体制作 关于性能 TextMeshPro ps 第一次写博客 排版和表述可能有不尽人意的地方
  • 精选36道SQL练习题解析 from(原50道SQL练习题)

    SQL练习题 友情链接 1 医疗信息管理系统数据库 MySQL 2 邮件管理数据库设计 MySQL 3 SQL Server医疗信息管理系统数据库 英文版 源码 Medical Management System Database 4 SQ
  • 安装Homebrew——各种报错解决(2020-5-4亲测)

    国内安装Homebrew 2020 5 4亲测 今天安装Homebrew时 挂了VPN报错 curl 7 Failed to connect to raw githubusercontent com port 443 Connection
  • Springboot整合redis+jedis

    Spring Boot整合Redis Jedis 1 在pom xml添加Redis依赖Jedis依赖和 示例代码如下
  • YOLOv8不修改源码训练自己数据集最简单做法

    首先 这篇文章是针对不修改源码 只是单纯希望运行YOLOv8对自己数据集进行测试 完成论文部分对比实验部分结果的朋友们 如果需要修改源码仍是需要按照一步步安装源码安装环境进行操作的 由于本人实验时是租借云服务器的 捣鼓好久仍然没有完全安装下
  • Qt 在发送一次信号触发两次槽函数的解决方法

    connect EnterPushButton SIGNAL clicked this SLOT on CreateProject clicked 备注 1 EnterPushButton 是确定按钮 2 一定要写SIGNAL Clicke
  • Unity基础框架从0到1 开篇

    接下来我打算跟大家分享一期关于Unity游戏基础框架的一些内容 希望可以给一些游戏开发初学者提供一点思路 同时也希望借这个机会和大家探讨并继续完善这个框架 框架经过实践的检验才能更加健壮 知识的积累一方面在于自身的学习 一方面在于分享和探讨
  • 该如何在视频里添加文字呢?推荐3个视频加文字的方法

    字幕是一个视频或电影中相当重要的一部分 方便我们更加容易看懂视频所要表达的意思 我们在日常生活中拍摄视频也想添加字幕 那我们该如何在视频里添加文字呢 接下来由我分享几个易上手的方法 方法一 借助视频转文字助手视频转文字助手是一款智能视频 文
  • 我想做一个面向校园消费数据的可视化分析平台的设计与实现

    设计和实现一个面向校园消费数据的可视化分析平台需要满足以下几个步骤 数据收集 首先需要收集校园内各种消费数据 包括但不限于餐饮 购物 娱乐等消费数据 数据清洗 对收集的数据进行清洗 去除重复 缺失 错误等数据 数据存储 将清洗后的数据存储在
  • Ubisoft Connect失去连接解决办法

    Ubisoft Connect失去连接解决办法 原视频地址 育碧平台失去连接100 解决 哔哩哔哩 bilibili 首先打开服务 有两种方式 win R打开命令窗口输入services msc 打开任务管理器切换到服务选项卡 然后找到Sp
  • 基于Python的开源人脸识别库:离线识别率高达99.38%

    项目地址 https github com ageitgey face recognition face recognition 本文的模型使用了C 工具箱dlib基于深度学习的最新人脸识别方法 基于户外脸部数据测试库Labeled Fac
  • mysql innodb引擎什么时候表锁什么时候行锁?

    mysql innodb引擎什么时候表锁什么时候行锁 InnoDB基于索引的行锁 InnoDB行锁是通过索引上的索引项来实现的 这一点 ySQL与Oracle不同 后者是通过在数据中对相应数据行加锁来实现的 InnoDB这种行锁实现特点意味
  • 用Java写一个小游戏

    源码地址 https pan baidu com s 18y8Et8QnahhDdz7N 0Rsg 提取码 b3tr 游戏开始图片 如下 游戏胜利图片 如下 游戏分析 玩家控制键盘上下左右键 当数字按照从小到大依次排列的时候则玩家获胜 游戏