基于JAVA实现的推箱子小游戏

news2024/11/24 17:23:27


Java推箱子小游戏实现:

     推箱子小游戏曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了,甚至在新一代人的印象中都已毫无记忆了。。。但是,这款游戏可以在一定程度上锻炼自己的编程能力。

窗口画面设计:
import javax.swing.*;
import java.awt.event.*;

public class Pushbox extends JFrame implements ActionListener {
    private static final long serialVersionUID = -392323205976303799L;
    Game game;
    JLabel jl = new JLabel("推箱子游戏");
    JTextArea tips = new JTextArea("            游戏规则\n玩家通过上下左右按键\n移动小人推箱子到指定\n"
            + "的箱子归位处,当所有\n箱子都被推至归位处后\n则玩家成功通过该关卡");
    JButton jb1 = new JButton("选择关卡");
    JButton jb2 = new JButton("重新开始");
    JButton jb3 = new JButton("退出游戏");
    JLabel jlt = new JLabel("在下方输入关卡1-3");
    JTextField jt = new JTextField();

    Pushbox() {
        setTitle("推箱子");//设置窗口显示的名字
        setBounds(500, 200, 600, 470);//设置窗口相对于屏幕的显示位置(500200),窗口大小(600,470)
        setVisible(true);// 使窗口显示
        setLayout(null);// 清空布局管理器,之后的控件可自定义坐标位置
        jl.setBounds(265, 10, 100, 20);
        tips.setBounds(430, 40, 120, 120);
        jlt.setBounds(430, 180, 120, 20);
        jt.setBounds(430, 210, 120, 30);
        jb1.setBounds(430, 250, 120, 40);
        jb2.setBounds(430, 300, 120, 40);
        jb3.setBounds(430, 350, 120, 40);
        add(jl);
        add(tips);
        add(jlt);
        add(jt);
        add(jb1);
        add(jb2);
        add(jb3);
        jb1.addActionListener(this);
        jb2.addActionListener(this);
        jb3.addActionListener(this);
        game = new Game();
        add(game);
        game.Load(game.flag);
        game.requestFocus();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jb1) {
            String f = jt.getText();
            game.flag = Integer.parseInt(f) - 1;
            if (game.flag > 2 || game.flag < 0) {
                JOptionPane.showMessageDialog(this, "没有这一关!!!");//弹窗
                jt.setText("");
            } else {
                game.Load(game.flag);
                game.requestFocus();
                jt.setText("");
            }
        }
        if (e.getSource() == jb2) {
            game.Load(game.flag);
            game.requestFocus();
        }
        //如果点击了jb3按钮(退出游戏)
        if (e.getSource() == jb3) {
            System.exit(0);    //退出
        }
    }
}

地图读取及初始点设置:

public class Read {
    public int f, x, y;
    public int[][] map = new int[12][12];

    Read(int n) {
        f = n;
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 12; j++) {
                map[i][j] = Pass.pass[f][i][j];
                if (map[i][j] == 5) {//找到人的位置
                    x = j;//把下标存起来
                    y = i;//把下标存起来
                }
            }
        }
    }

    int[][] getmap() {
        return map;
    }

    int getmx() {
        return x;
    }

    int getmy() {
        return y;
    }
}

游戏地图显示和控件操作:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Game extends JPanel implements KeyListener {
    int len = 30;//地图格子的长度
    Image[] img;//定义图像数组
    public int flag = 0;//定义关数,因为数组下表第一个是0,所以0代表第一关
    int mx, my;//定义任务初始位置下标
    int[][] newmap;//定义目前的地图数组(这个就是实时显示的,会根据移动改变)
    int[][] oldmap;//定义加载的地图数组(这个就是一开始的地图数据,不会改变)
    Read fnewmap;
    Read foldmap;

    Game() {
        setBounds(40, 40, 360, 360);
        setBackground(Color.white);
        addKeyListener(this);
        img = new Image[7];
        for (int i = 0; i < 7; i++) {
            //图片资源存放的相对路径
            img[i] = Toolkit.getDefaultToolkit().getImage(".\\pushing_boxes\\src\\main\\java\\com\\txz\\img\\" + i + ".png");
        }
        setVisible(true);
        Load(flag);
    }

    void Load(int i)//加载地图函数
    {
        fnewmap = new Read(i);//调用Read
        foldmap = new Read(i);//调用Read
        newmap = fnewmap.getmap();//获取地图数据给newmap数组
        mx = fnewmap.getmx();//获取初始人物的X位置
        my = fnewmap.getmy();//获取初始人物的Y位置
        oldmap = foldmap.getmap();//获取地图数据给oldmap数组
        repaint();//刷新界面并绘制地图
    }

    @Override
    public void paint(Graphics g)//绘制地图函数,(自带的库函数),调用repaint()时就会调用这个函数,重写画界面
    {
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 12; j++) {
                g.drawImage(img[newmap[j][i]], i * len, j * len, this);
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e)//键盘响应函数
    {
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            up();
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            down();
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left();
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right();
        }
        if (win()) {
            if (flag == 2) {
                JOptionPane.showMessageDialog(this, "恭喜您通过最后一关!!!");
            } else {
                String a = "恭喜您通过第" + (flag + 1) + "!!!\n是否要进入下一关?";
                String title = "恭喜过关";
                int text = JOptionPane.YES_NO_OPTION;
                int choice = 0;
                choice = JOptionPane.showConfirmDialog(null, a, title, text);
                if (choice == 0) {
                    flag++;
                    Load(flag);
                } else if (choice == 0) {
                    System.exit(0);
                }
            }
        }
    }

    void up()//上移函数
    {
        if (newmap[my - 1][mx] == 2 || newmap[my - 1][mx] == 4) {
            if (oldmap[my][mx] == 4) {
                newmap[my][mx] = 4;
            } else {
                newmap[my][mx] = 2;
            }
            newmap[my - 1][mx] = 5;
            repaint();
            my--;
        } else if (newmap[my - 1][mx] == 3) {
            if (newmap[my - 2][mx] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my - 1][mx] = 5;
                newmap[my - 2][mx] = 6;
                repaint();
                my--;
            } else if (newmap[my - 2][mx] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my - 1][mx] = 5;
                newmap[my - 2][mx] = 3;
                repaint();
                my--;
            }
        } else if (newmap[my - 1][mx] == 6) {
            if (newmap[my - 2][mx] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my - 1][mx] = 5;
                newmap[my - 2][mx] = 6;
                repaint();
                my--;
            } else if (newmap[my - 2][mx] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my - 1][mx] = 5;
                newmap[my - 2][mx] = 3;
                repaint();
                my--;
            }
        }
    }

    void down()//下移函数
    {
        if (newmap[my + 1][mx] == 2 || newmap[my + 1][mx] == 4) {
            if (oldmap[my][mx] == 4) {
                newmap[my][mx] = 4;
            } else {
                newmap[my][mx] = 2;
            }
            newmap[my + 1][mx] = 5;
            repaint();
            my++;
        } else if (newmap[my + 1][mx] == 3) {
            if (newmap[my + 2][mx] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my + 1][mx] = 5;
                newmap[my + 2][mx] = 6;
                repaint();
                my++;
            } else if (newmap[my + 2][mx] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my + 1][mx] = 5;
                newmap[my + 2][mx] = 3;
                repaint();
                my++;
            }
        } else if (newmap[my + 1][mx] == 6) {
            if (newmap[my + 2][mx] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my + 1][mx] = 5;
                newmap[my + 2][mx] = 6;
                repaint();
                my++;
            } else if (newmap[my + 2][mx] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my + 1][mx] = 5;
                newmap[my + 2][mx] = 3;
                repaint();
                my++;
            }
        }
    }

    void left()//左移函数
    {
        if (newmap[my][mx - 1] == 2 || newmap[my][mx - 1] == 4) {
            if (oldmap[my][mx] == 4) {
                newmap[my][mx] = 4;
            } else {
                newmap[my][mx] = 2;
            }
            newmap[my][mx - 1] = 5;
            repaint();
            mx--;
        } else if (newmap[my][mx - 1] == 3) {
            if (newmap[my][mx - 2] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx - 1] = 5;
                newmap[my][mx - 2] = 6;
                repaint();
                mx--;
            } else if (newmap[my][mx - 2] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx - 1] = 5;
                newmap[my][mx - 2] = 3;
                repaint();
                mx--;
            }
        } else if (newmap[my][mx - 1] == 6) {
            if (newmap[my][mx - 2] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx - 1] = 5;
                newmap[my][mx - 2] = 6;
                repaint();
                mx--;
            } else if (newmap[my][mx - 2] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx - 1] = 5;
                newmap[my][mx - 2] = 3;
                repaint();
                mx--;
            }
        }
    }

    void right()//右移函数
    {
        if (newmap[my][mx + 1] == 2 || newmap[my][mx + 1] == 4) {
            if (oldmap[my][mx] == 4) {
                newmap[my][mx] = 4;
            } else {
                newmap[my][mx] = 2;
            }
            newmap[my][mx + 1] = 5;
            repaint();
            mx++;
        } else if (newmap[my][mx + 1] == 3) {
            if (newmap[my][mx + 2] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx + 1] = 5;
                newmap[my][mx + 2] = 6;
                repaint();
                mx++;
            } else if (newmap[my][mx + 2] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx + 1] = 5;
                newmap[my][mx + 2] = 3;
                repaint();
                mx++;
            }
        } else if (newmap[my][mx + 1] == 6) {
            if (newmap[my][mx + 2] == 4) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx + 1] = 5;
                newmap[my][mx + 2] = 6;
                repaint();
                mx++;
            } else if (newmap[my][mx + 2] == 2) {
                if (oldmap[my][mx] == 4) {
                    newmap[my][mx] = 4;
                } else {
                    newmap[my][mx] = 2;
                }
                newmap[my][mx + 1] = 5;
                newmap[my][mx + 2] = 3;
                repaint();
                mx++;
            }
        }
    }

    boolean win()//判断输赢函数
    {
        boolean num = false;
        out:
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 12; j++) {
                if (oldmap[i][j] == 4) {
                    if (newmap[i][j] == 6) {
                        num = true;
                    } else {
                        num = false;
                        break out;
                    }
                }
            }
        }
        return num;
    }
}

运行效果如图:

完整素材及全部代码

代码已上传csdn,0积分下载,觉得这片博文有用请留下你的点赞

基于JAVA的推箱子小游戏,一起来实现自己的趣味小游戏

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

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

相关文章

鸿蒙OpenHarmony【轻量系统 编译】 (基于Hi3861开发板)

编译 OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式&#xff0c;build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。 使用build.sh脚本编译源码 进入源码根目录&#xff0c;执行如下命令进行版本编译。 ./build.sh --product-name name --ccache 说明&…

今日arXiv最热大模型论文:大模型也来看球,还能判断是否犯规

在足球世界&#xff0c;裁判的哨声可谓“千金难买”&#xff0c;因为它能直接决定俱乐部的钱包是鼓是瘪。但球场变化莫测&#xff0c;非常考验裁判的水平。 2022年卡塔尔世界杯上&#xff0c;半自动越位识别技术&#xff08;SAOT&#xff09;闪亮登场&#xff0c;通过12台摄像…

Rabbitmq安装延迟插件rabbitmq_delayed_message_exchange失败

Docker里的Rabbitmq容器安装延迟插件rabbitmq_delayed_message_exchange失败 一启动插件Rabbitmq容器直接停止运行了 rabbitmq-plugins enable rabbitmq_delayed_message_exchange排除了版本问题和端口问题等&#xff0c;发现是虚拟机运行内存不够&#xff0c;增加虚拟机运行内…

游戏新手村18:游戏广告渠道与广告形式

上文我们说到&#xff0c;渠道为王&#xff0c;渠道可以为我们带来流量和用户&#xff0c;进而带来收入。我们可以通过哪些渠道导入用户呢&#xff1f;每个渠道有哪些优劣呢&#xff1f;在进行游戏营销推广的时候我们该如何选择呢&#xff1f; 根据付费性质&#xff0c;我们可…

Dbeaver客户端安装和使用

数据库管理软件&#xff08;DBMS&#xff09;&#xff1a; • 数据是数据库中存储的基本对象&#xff0c;种类包括文字、图形、图像、声音等等 • 数据库&#xff08;database&#xff09;是以某种有组织的方式存储的数据集合&#xff0c;保存有组织的数据的容器&#xff0c;通…

【C语言必刷题】7. 百钱百鸡

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

大模型_ ChatGLM-Med推理及微调部署

文章目录 ChatGLM-Med是什么数据集构建推理部署python环境切换到安装好的conda环境下载github数据切换目录在infer.py修改模型路径启动推理解决infer.py报错修改后再次启动推理完成 微调部署安装evaluate包修改模型路径启动微调 ChatGLM-Med是什么 经过中文医学指令精调/指令微…

echarts地图叠加百度地图底板实现数据可视化

这里写自定义目录标题 echarts地图叠加百度地图实现数据可视化echarts地图叠加百度地图实现数据可视化 实现数据可视化时,个别情况下需要在地图上实现数据的可视化,echarts加载geojson数据可以实现以地图形式展示数据,例如分层设色或者鼠标hover展示指标值,但如果要将echa…

国产麒麟系统下打包electron+vue项目(AppImage、deb)

需要用到的一些依赖包、安装包以及更详细的打包方法word以及麒麟官网给出的文档都已放网盘&#xff0c;链接在文章最后&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&a…

【系统架构师】-选择题(四)

1、“41”视图 ①逻辑视图(Logical View)&#xff0c;设计的对象模型(使用面向对象的设计方法时)。 ②过程视图(Process View)&#xff0c;捕捉设计的并发和同步特征。系统集成师 ③物理视图(Physical View)&#xff0c;描述了软件到硬件的映射&#xff0c;反映了分布式特性。系…

SCI一区级 | Matlab实现BES-CNN-GRU-Mutilhead-Attention多变量时间序列预测

SCI一区级 | Matlab实现BES-CNN-GRU-Mutilhead-Attention秃鹰算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测 目录 SCI一区级 | Matlab实现BES-CNN-GRU-Mutilhead-Attention秃鹰算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测预测效果基本介绍…

命令行启动pytest自动化程序时,程序卡住不动了,不继续往下执行了

一、问题描述 在执行pytestallure自动化测试工具的时候&#xff0c;命令行启动程序时&#xff0c;程序卡住不继续往下执行&#xff0c;如下图所示。 代码主函数如下&#xff1a; 二、解决方法 测试客户项目时遇到2次此类问题&#xff0c;2次问题原因不一样。 原因一&#xf…

【JVM】从i++到JVM栈帧

【JVM】从i到JVM栈帧 本篇博客将用两个代码例子&#xff0c;简单认识一下JVM与栈帧结构以及其作用 从i与i说起 先不急着看i和i&#xff0c;我们来看看JVM虚拟机&#xff08;请看VCR.JPG&#xff09; 我们初学JAVA的时候一定都听到过JAVA“跨平台”的特性&#xff0c;也就是…

XiaodiSec day017 Learn Note 小迪安全学习笔记

XiaodiSec day017 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 17 主要内容&#xff1a; php 框架 thinkPHPyiilaravel 使用 fofa 搜索 thinkphp 市面上 thinkphp5 版本较多 url 结构 域名/.php(文件名)/index(目录)/index(函数名)模块名-控…

律师口才训练技巧课程介绍?

律师口才训练技巧课程介绍 一、课程背景与目标 律师口才作为法律职业的核心能力之一&#xff0c;对于律师在**辩论、法律咨询、谈判协商等场合的表现具有至关重要的作用。然而&#xff0c;许多律师在口才方面存在不足&#xff0c;难以充分发挥自己的专业能力。因此&#xff0c;…

stm32开发之netxduo组件之mqtt客户端的使用记录

前言 1使用mqtt协议的简单示例记录 代码 MQTT服务端(C# 编写,使用MQTTnet提供的示例代码) 主程序 namespace ConsoleApp1;public class Program {public static async Task Main(string[] args){await Run_Server_With_Logging();}}public static async Task Run_Server_Wi…

HarmonyOS ArkUI实战开发—状态管理

一、状态管理 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&…

电子负载仪的远端控制

前言 最近研究了电子负载仪的远端控制&#xff08;区别于前面板控制&#xff09;&#xff0c;主要是用于程序控制&#xff0c;避免繁琐复杂的人工控制&#xff0c;举了南京嘉拓和艾维泰科的例子。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com …

CoReFace:深度人脸识别的样本引导对比正则化

CoReFace: Sample-Guided Contrastive Regularization for Deep Face Recognition 一、摘要 人脸识别对比正则化&#xff08;CoReFace&#xff09;&#xff08;损失函数&#xff09;&#xff0c;将图像级正则化应用于特征表示学习。 具体来说&#xff0c;采用样本引导对比学习…

base64算法

1 介绍 将二进制数据编码为文本字符串的算法 理解&#xff1a;把一个能看懂的明文变成一个看不懂的密文数据统称为加密 2 使用 A 在浏览器控制台使用 加密 window.btoa(加密的数据) 解密 window.atob(MTIzNDQ) B 在VSconde中使用 加密 解密