Java课程设计之推箱子

这篇具有很好参考价值的文章主要介绍了Java课程设计之推箱子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  推箱子游戏是一个比较古老的游戏,深受广大游戏爱好者的欢迎,它在带来乐趣的同时也能培养我们的反应力以及严谨的思维能力。

  游戏规则是要求角色将地图中所有放置的箱子推到指定目标位置,只有合理安排移动次序和位置 ,才能顺利完成任务。

  项目任务是用java语言设计并实现一个推箱子游戏,旨在培养学生面向对象编程思维方式,开发小型桌面应用程序的能力。

  系统功能模块设计

  其中系统可以分为初始化模块,绘制地图模块,移动箱子模块、移动小人模块,音乐播放模块,功能控制模块。

程序设计

主要分为四个类:BattleField类,Music类,Window类和Gameload类。

1. Battlefield类:内含BattleField构造方法,paint方法。其中paint方法重写了Graphics类中的paint方法,承载了绘制地图的作用,对内置的box、field、hero、target和wall等图片进行图像绘制。BattleField方法承载着初始化图片的作用,从相应的位置提取图片并存储到相应的图片存储单元中。

2. Music类:内置run方法和play方法。其中run方法调用了play方法使得其能够在调用run方法的时候进行音乐的播放。Play方法读取文件、存储到相应的存储单元中,最后通过player对象实现音乐文件的播放。

3. Window类:作为主方法,其中包含了了GUI界面的设计。建立了多个JPanel作为容器存储相关的JButton、JTextField和JLabel,以及相应的监视器,来确定在组件响应的时候所执行的操作,包括按钮监听,键盘监听等监视器。

4. Gameload类:初始化地图,通过读取地图文件来绘制地图。包含了moveLeft、moveRight、moveUp和moveDown等方法,以及判断游戏是否结束的isEnd方法。

项目文件位于GitHub上,在此处仅粘贴相关代码。

GitHub仓库链接

Music.java

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.*;

class Play0 extends Thread {
    Player player;
    String music;

    public Play0(String file) {
        this.music = file;
    }

    public void run() {
        try {
            play();
        } catch (FileNotFoundException | JavaLayerException e) {
            e.printStackTrace();
        }
    }
    public void play() throws FileNotFoundException, JavaLayerException {
        BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(music));
        player = new Player(buffer);
        player.play();
    }
}

Window.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class Window extends JFrame {
    private Gameload Gameload;
    private BattleField canvas;int sum=1;//设置关卡数目
    JFrame frame=new JFrame();
    public Window()
    {

        Play0 pl=new Play0("music.mp3");
        pl.start();//打开时就开始播放音乐
        Gameload=new Gameload(sum);
        canvas=new BattleField(Gameload);


        frame.setLayout(new BorderLayout());
        frame.add(canvas,BorderLayout.CENTER);
        frame.setSize(700,690);//设置窗口大小

        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton exit=new JButton("退出");//设置退出游戏按钮
        exit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
                pl.stop();
                exit.setFocusable(false);
            }
        });//设置窗口关闭
        JButton next=new JButton("下一关");//设置下一关按钮

        JButton refresh=new JButton("重新开始");//设置重新开始按钮
        refresh.addActionListener(new ActionListener() {//按下”重新开始“按钮的监视器
            @Override
            public void actionPerformed(ActionEvent e) {
                Gameload.init(sum);
                canvas.repaint();
                refresh.setFocusable(false);
            }
        });
        JButton musicstop=new JButton("关闭音乐");//设置关闭音乐的按钮

        JPanel buttons=new JPanel();//新建一个JPanel 容纳所有的按钮
        JPanel lbadtxt=new JPanel(new BorderLayout());//显示相关字体和文本框
        JPanel txtandfield=new JPanel();//新建



        JTextField mission=new JTextField(2);
        mission.setEditable(false);
        JLabel missions=new JLabel("关卡数");
        mission.setText(String.valueOf(sum));//显示相关的关卡数
        txtandfield.add(missions);
        txtandfield.add(mission);

        JLabel titles=new JLabel("<html>狼<br>狼<br>追<br>羊<br>羊<br>",JLabel.CENTER);//设置标题按钮
        Font f=new Font("微软雅黑",Font.BOLD,40);//设置字体
        titles.setFont(f);
        titles.setForeground(Color.red);

        lbadtxt.add(titles,BorderLayout.CENTER);
        lbadtxt.add(txtandfield,BorderLayout.NORTH);


        buttons.add(exit);//设置按钮控件,并放置在button panel里
        buttons.add(next);
        buttons.add(refresh);
        buttons.add(musicstop);



        next.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sum++;//关卡数控件


                if(sum<=2){
                    mission.setText(String.valueOf(sum));//显示相关的关卡数
                Gameload.init(sum);
                canvas.repaint();
                    next.setFocusable(false);

                }
                else{
                    JOptionPane.showMessageDialog(null, "关卡数超出,程序退出", "ERROR",
                            JOptionPane.ERROR_MESSAGE);
                    System.exit(0);

                }
                next.setFocusable(false);
            }
        });//控件

        musicstop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pl.stop();
                musicstop.setFocusable(false);
            }
        });



        frame.add(buttons,BorderLayout.SOUTH);//放在界面的南部(即下部)

        frame.add(lbadtxt,BorderLayout.EAST);//放在界面的东部(即右部)


        frame.addKeyListener(new KeyListener(){//创建监视器
            public void keyPressed(KeyEvent event) {
                if(event.getKeyCode()==KeyEvent.VK_UP)
                {
                    Gameload.moveUp();//监控键盘,如果按下方向上键,则执行向上走的方法

                }else if(event.getKeyCode()==KeyEvent.VK_DOWN)
                {
                    Gameload.moveDown();

                }else if(event.getKeyCode()==KeyEvent.VK_LEFT)
                {
                    Gameload.moveLeft();

                }else if(event.getKeyCode()==KeyEvent.VK_RIGHT)
                {
                    Gameload.moveRight();
                }
                canvas.repaint();
                if(Gameload.isEnd()) {
                    JOptionPane.showMessageDialog(null, "游戏结束");
                    System.exit(0);

                }
            }
            public void keyReleased(KeyEvent event) {
            }
            public void keyTyped(KeyEvent event) {
            }

        });


        frame.setVisible(true);
        frame.setFocusable(true);
    }
    public static void main(String[] args) {
        Window show=new Window();

    }
}

Gameload.Java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Gameload {
    private boolean exist=true;
    // 游戏角色的坐标位置
    private int x;
    private int y;
    // 游戏为20x20的地图
    private String field[][] = new String[20][20];
    // 记录推箱子的目标位置
    private String target[][] = new String[20][20];
    public void init(int num) {
        try {


            BufferedReader reader = new BufferedReader(new FileReader("field" + String.valueOf(num) + ".txt"));
            // 读取文件的一行
            String line = reader.readLine();
            int j = 0;
            while (line != null) {
                // 以空格为分隔符号,分割一行数据;
                String strs[] = line.split(" ");
                for (int i = 0; i < 20; i++) {//初次设计的是20*20矩阵 以后根据要求重新编辑文件
                    field[i][j] = strs[i];
                    if (strs[i].equals("T")) {
                        // 记录目标位置
                        target[i][j] = "T";
                    } else {
                        // 非目标位置记为O
                        target[i][j] = "O";
                    }
                    // 记录角色的初始位置
                    if (strs[i].equals("H")) {
                        this.x = i;
                        this.y = j;
                    }
                }
                line = reader.readLine();
                j++;
            }
            reader.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Gameload(int num) {
        // 从field文件加载地图信息
        try {
            BufferedReader reader = new BufferedReader(new FileReader("field" + String.valueOf(num) + ".txt"));
            // 读取文件的一行
            String line = reader.readLine();
            int j = 0;
            while (line != null) {
                // 以空格为分隔符号,分割一行数据;
                String strs[] = line.split(" ");
                for (int i = 0; i < 20; i++) {//初次设计的是20*20矩阵 以后根据要求重新编辑文件
                    field[i][j] = strs[i];
                    if (strs[i].equals("T")) {
                        // 记录目标位置
                        target[i][j] = "T";
                    } else {
                        // 非目标位置记为O
                        target[i][j] = "O";
                    }
                    // 记录角色的初始位置
                    if (strs[i].equals("H")) {
                        this.x = i;
                        this.y = j;
                    }
                }
                line = reader.readLine();
                j++;
            }
            reader.close();
        }
         catch (Exception e) {
            e.printStackTrace();
        }
    }
    //角色向左移动
    public void moveLeft() {
        int a = x;
        int b = y;
        if (!field[a - 1][b].equals("W")) {//判断二维数组前一位是否为墙壁
            if (field[a - 1][b].equals("B")) {
                if (!field[a - 2][b].equals("B") && !field[a - 2][b].equals("W")) {
                    if (target[a][b].equals("T")) {//如果任务位置为目标位置
                        field[a - 1][b] = "H";//将人物向左平移一格
                        field[a][b] = "T";//将目标位置定在原来人物位置上
                        field[a - 2][b] = "B";
                        x = a - 1;//将人物位置x坐标平移一位
                    } else {//否则将人物向左平移
                        field[a - 1][b] = "H";
                        field[a][b] = "E";//将背景赋值为
                        field[a - 2][b] = "B";//将箱子向左平移两个
                        x = a - 1;
                    }
                }
            } else {//如果人物位置的左边不为墙壁位置
                if (target[a][b].equals("T")) {
                    field[a - 1][b] = "H";//当位置为目标位置时,将H向左移动
                    field[a][b] = "T";//将位置设置为T
                    x = a - 1;//向左位置设置
                } else {
                    field[a - 1][b] = "H";//不为目标位置时,将H向左移动
                    field[a][b] = "E";//将位置设置为背景
                    x = a - 1;//向左位置设置
                }
            }
        }
    }
    //角色向右移动
    public void moveRight() {
        int a = x;
        int b = y;
        if (!field[a + 1][b].equals("W")) {
            if (field[a + 1][b].equals("B")) {
                if (!field[a + 2][b].equals("B") && !field[a + 2][b].equals("W")) {
                    if (target[a][b].equals("T")) {
                        field[a + 1][b] = "H";
                        field[a][b] = "T";
                        field[a + 2][b] = "B";
                        x = a + 1;
                    } else {
                        field[a + 1][b] = "H";
                        field[a][b] = "E";
                        field[a + 2][b] = "B";
                        x = a + 1;
                    }
                }
            } else {
                if (target[a][b].equals("T")) {
                    field[a + 1][b] = "H";
                    field[a][b] = "T";
                    x = a + 1;
                } else {
                    field[a + 1][b] = "H";
                    field[a][b] = "E";
                    x = a + 1;
                }
            }
        }
    }
    //角色向上移动
    public void moveUp() {
        int a = x;
        int b = y;
        if (!field[a][b - 1].equals("W")) {
            if (field[a][b - 1].equals("B")) {
                if (!field[a][b - 2].equals("B") && !field[a][b - 2].equals("W")) {
                    if (target[a][b].equals("T")) {
                        field[a][b - 1] = "H";
                        field[a][b] = "T";
                        field[a][b - 2] = "B";
                        y = b - 1;
                    } else {
                        field[a][b - 1] = "H";
                        field[a][b] = "E";
                        field[a][b - 2] = "B";
                        y = b - 1;
                    }
                }
            } else {
                if (target[a][b].equals("T")) {
                    field[a][b - 1] = "H";
                    field[a][b] = "T";
                    y = b - 1;
                } else {
                    field[a][b - 1] = "H";
                    field[a][b] = "E";
                    y = b - 1;
                }
            }
        }
    }
    //角色向下移动
    public void moveDown() {
        int a = x;
        int b = y;
        if (!field[a][b + 1].equals("W")) {
            if (field[a][b + 1].equals("B")) {
                if (!field[a][b + 2].equals("B") && !field[a][b + 2].equals("W")) {
                    if (target[a][b].equals("T")) {
                        field[a][b + 1] = "H";
                        field[a][b] = "T";
                        field[a][b + 2] = "B";
                        y = b - 1;
                    } else {
                        field[a][b + 1] = "H";
                        field[a][b] = "E";
                        field[a][b + 2] = "B";
                        y = b + 1;
                    }
                }
            } else {
                if (target[a][b].equals("T")) {
                    field[a][b + 1] = "H";
                    field[a][b] = "T";
                    y = b + 1;
                } else {
                    field[a][b + 1] = "H";
                    field[a][b] = "E";
                    y = b + 1;
                }
            }
        }
    }
    //判断游戏是否结束
    public boolean isEnd() {
        for (int i = 0; i < 20; i++)
            for (int j = 0; j < 20; j++) {
                if (field[i][j].equals("T"))
                    return false;
            }
        return true;
    }
    public String[][] getfield() {
        return field;
    }

}

Battlefield.java

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

//游戏使用的场地初始化,即战场
public class BattleField extends JPanel {
    private BufferedImage box;
    private BufferedImage field;
    private BufferedImage hero;
    private BufferedImage target;
    private BufferedImage wall;
    private Gameload gl;
    public Graphics g;
    public BattleField(Gameload gl){
        this.gl=gl;

        try{
            box= ImageIO.read(new File("box.png"));
            field=ImageIO.read(new File("field.png"));
            hero=ImageIO.read(new File("hero.png"));
            target=ImageIO.read(new File("target.png"));
            wall=ImageIO.read(new File("wall.png"));
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    public void paint(Graphics g){
        this.g=g;

        BufferedImage image=null;
        for(int j=0;j<20;j++)
            for(int i=0;i<20;i++)
            {
                if(gl.getfield()[i][j].equals("B"))
                {
                    image=box;//将图像设置为box
                }else if(gl.getfield()[i][j].equals("E"))
                {
                    image=field;//将图像设置为底图
                }else if(gl.getfield()[i][j].equals("H")) {
                    image = hero;//将图像设置为人物
                }
                else if(gl.getfield()[i][j].equals("W")) {
                    image = wall;//将图像设置为墙面
                }
                else if (gl.getfield()[i][j].equals("T")){
                    image=target;//将图像设置为目标位置
                        }

                g.drawImage(image, 0+i*image.getWidth(), 0+j*image.getHeight(),null);
            }
    }

}

学习不易,请勿随意转载。文章来源地址https://www.toymoban.com/news/detail-482690.html

到了这里,关于Java课程设计之推箱子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 毕业设计 单片机推箱子游戏(AT89C51)

    一、电路设计 此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。 LCD12864显示模块 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置

    2024年02月21日
    浏览(69)
  • 走迷宫之推箱子

    在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。 迷宫的组成要素无非就是:墙、路、入口、出口,根据这些要素我们可以设置一个

    2024年01月17日
    浏览(53)
  • 【c语言】推箱子

    所需知识:c语言枚举,数组,for循环,while循环,switch,case语句,图形库相关函数 将printmap()在main中调用 为了让程序不会输入字符后退出,加上while循环 为了保证游戏的美观性,我们将对应的数字转化为好看的图案 使用两层循环遍历二维数组,在使用switch已经将对应的数字用

    2024年02月08日
    浏览(47)
  • 1263. 推箱子

    题目: 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。 现在你将作为玩家参与游戏,按规则将箱子 ‘B’ 移动到目标位置 ‘T’ : 玩家用字符 ‘S’ 表

    2024年02月10日
    浏览(34)
  • 简单的推箱子游戏实战

    目录 项目分析  地图初始化 背景图片 游戏场景图片: 热键控制  按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 但是一直执行循环块很占用CPU ,消耗很大很严重资源(使用

    2024年01月22日
    浏览(37)
  • 【LeetCode困难】1263. 推箱子

    「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。 现在你将作为玩家参与游戏,按规则将箱子 ‘B’ 移动到目标位置 ‘T’ : 玩家用字符 ‘S’ 表示,只要

    2024年02月04日
    浏览(28)
  • c++推箱子小游戏

    上代码: 由于写游戏时间较长,更新较慢,请大佬们理解一下

    2024年02月09日
    浏览(37)
  • 推箱子大冒险(SDL/C)

    欢迎来到小K的SDL专栏第三小节,本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解,这里也为大家上传了源码和图片资源,需要的自取看完以后,希望对你有所帮助 ✨效果如下 2023-05-26-14-19-21推箱子 ✨ 第一步 ,我们先用枚举把下图中的元素表示出来,分别为 空地、墙

    2024年02月06日
    浏览(33)
  • python小游戏——推箱子代码开源

    ♥️ 作者:小刘在这里 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。 目录 一.效果呈现  二.主代码 三.cfg 四.README \\\'\\\'\\\'配置文件\\\'\\\'\\\' imp

    2024年02月02日
    浏览(42)
  • C/C++项目实战-推箱子小游戏

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包