java 300行代码 冒险闯关小游戏(代码+讲解)

这篇具有很好参考价值的文章主要介绍了java 300行代码 冒险闯关小游戏(代码+讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java 300行代码 冒险闯关小游戏(代码+讲解)

         作为一个男孩子,从小就喜欢晚一些游戏。今天就用java写一个类似马里奥的冒险闯关小游戏,但这也不是一两天能完成的事情,我将会持续更新这个游戏(有什么好的介意也非常欢迎大家提出来,也能在我的基础上自己接着写)。目前完成的功能有:人物的流畅运动、跳跃以及自由下落,障碍物(地面)的添加,怪物的添加、移动以及死亡。(代码基本上是完整的,直接粘贴复制就能用)


游戏介绍

和马里奥差不太多,左右键控制移动,空格跳,碰到怪物死亡,可以踩死怪物。目前也就这些功能,也会不断添加新的功能。

代码讲解

java 300行代码 冒险闯关小游戏(代码+讲解)
目录结构

view里面是创建页面,handle里写控制方法,pic里存一些需要的图片。

创建Frame

没啥好讲的。

import javax.swing.*;

public class GameFrame {
    public static void main(String[] args) {
        JFrame jf = new JFrame("冒险闯关小游戏");

        jf.add(new GamePanel());

        jf.setSize(806,600);
        jf.setLocationRelativeTo(null);     //居中
        jf.setResizable(false);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }
}

 JPanel

这里定义了玩家、怪物、障碍物的一些属性,然后将他们画出来。其实更好的方法是定义三个类,用的时候实例化一下就行,这里后面我也会改。

import game2.handle.MonsterMove;
import game2.handle.MoveHandle;

import javax.swing.*;
import java.awt.*;
import java.util.Vector;

public class GamePanel extends JPanel {
    ImageIcon b = new ImageIcon("src\\game2\\pic\\b.jpg");
    ImageIcon xyq = new ImageIcon("src\\game2\\pic\\xyq.png");
    public boolean up = false;
    public boolean down = false;
    public boolean left = false;
    public boolean right = false;

    public int hero_x;
    public int hero_y;
//    public int hero_width = xyq.getIconWidth();
//    public int hero_height = xyq.getIconHeight();
    public int hero_width = 30;
    public int hero_height = 60;

    public Vector<int[]> v = new Vector<>();
    int[] f0 = {0,500,800,10};
    int[] f1 = {300,500-80,200,10};
    int[] f2 = {500,500-40,50,40};
    int[] f3 = {100,500-150,80,30};
    int[] f4 = {200,500-250,340,10};
    {
        v.add(f0);
        v.add(f1);
        v.add(f2);
        v.add(f3);
        v.add(f4);
    }

    public Vector<int[]> ms = new Vector<>();    //怪物列表
    public int[] m0 = {600,500-40,40,40,600,750,1}; //x,y,w,h,起点,终点,速度
    public int[] m1 = {0,500-40,40,40,0,100,1};
    {
        ms.add(m0);
        ms.add(m1);
    }
    public boolean mIsDie = false;


    public GamePanel() {
        setFocusable(true);

        MoveHandle moveHandle = new MoveHandle(this);
        addKeyListener(moveHandle);
        Thread thread = new Thread(moveHandle);
        thread.start();

        MonsterMove monsterMove = new MonsterMove(this);
        Thread thread2 = new Thread(monsterMove);
        thread2.start();

        init();
    }

    public void init() {
        hero_x = 200;
        hero_y = 500-hero_height;
    }

    @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
        b.paintIcon(this,g,0,0);
        g.setColor(Color.blue);
        g.fillRect(hero_x, hero_y, hero_width, hero_height);
//        xyq.paintIcon(this,g,hero_x,hero_y);
        g.setColor(Color.red);
        for(int i=0;i<ms.size();i++){
            g.fillRect(ms.get(i)[0],ms.get(i)[1],ms.get(i)[2],ms.get(i)[3]);
        }
        paintRect(g,v);
    }

    private void paintRect(Graphics g,Vector<int[]> v){
        g.setColor(Color.black);
        for(int i = 0; i<v.size(); i++){
            int[] f = v.get(i);
            g.fillRect(f[0],f[1],f[2],f[3]);
        }
    }
}

MoveHandle

我觉得我这里最好的一点代码就在这里面,其实从学写swing时候,就发现如果用键盘控制人物移动的时候它的移动并不顺畅。我这里是用线程的方法做成了顺畅移动。

简单讲,就是创建一个进程,一直让他循环执行,每当按下右(左)键,就会一直循环执行向右(左)走的方法,每次运行方法中间间隔几毫秒(不然移动的太快根本看不到)。

然后中间再添加一些其他判断,如是否碰到障碍物,是否碰到怪物等。

import game2.view.GamePanel;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class MoveHandle implements KeyListener, Runnable {

    GamePanel gamePanel;
    JumpHandle jump;

    public MoveHandle(GamePanel gamePanel) {
        this.gamePanel = gamePanel;
        jump = new JumpHandle(gamePanel);
        Thread thread1 = new Thread(jump);
        thread1.start();
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        switch (code) {
            case KeyEvent.VK_LEFT:
                gamePanel.left = true;
                break;
            case KeyEvent.VK_RIGHT:
                gamePanel.right = true;
                break;
            case KeyEvent.VK_SPACE:
                jump.isSky = true;
                if (jump.c < 2) {
                    jump.isJump = true;
                }
                break;
            default:
                break;
        }

        gamePanel.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        switch (code) {
            case KeyEvent.VK_LEFT:
                gamePanel.left = false;
                break;
            case KeyEvent.VK_RIGHT:
                gamePanel.right = false;
                break;
            default:
                break;

        }
    }

    @Override
    public void run() {
        while (true) {
            move();
            if (!jump.isSky) {
                loop:
                while (true) {
                    for (int i = 0; i < gamePanel.v.size(); i++) {
                        if (gamePanel.hero_x + gamePanel.hero_width > gamePanel.v.get(i)[0]
                                && gamePanel.hero_x < gamePanel.v.get(i)[0] + gamePanel.v.get(i)[2]) {
                            if (gamePanel.hero_y == gamePanel.v.get(i)[1] - gamePanel.hero_height) {
                                break loop;
                            }
                        }
                    }
                    gamePanel.hero_y += 1;
                    for(int i=0;i<gamePanel.ms.size();i++) {
                        if (gamePanel.hero_y + gamePanel.hero_height == gamePanel.ms.get(i)[1]
                                && gamePanel.hero_x + gamePanel.hero_width > gamePanel.ms.get(i)[0]
                                && gamePanel.hero_x < gamePanel.ms.get(i)[0] + gamePanel.ms.get(i)[2]) {
                            gamePanel.ms.remove(i);
                            break ;
                        }
                    }
                    gamePanel.repaint();
                    try {
                        Thread.sleep(3);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    move();
                }
            }
            gamePanel.repaint();
            try {
                Thread.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private void move() {
        if (gamePanel.right) {
            if (gamePanel.hero_x + gamePanel.hero_width < 800 && isMoveRight()) {
                gamePanel.hero_x += 1;
            }
        } else if (gamePanel.left) {
            if (gamePanel.hero_x > 0 && isMoveLeft()) {
                gamePanel.hero_x -= 1;
            }
        }
        isDie();
    }

    private boolean isMoveRight() {
        for (int i = 0; i < gamePanel.v.size(); i++) {
            if (gamePanel.hero_x + gamePanel.hero_width == gamePanel.v.get(i)[0]
                    && gamePanel.hero_y + gamePanel.hero_height > gamePanel.v.get(i)[1]
                    && gamePanel.hero_y < gamePanel.v.get(i)[1] + gamePanel.v.get(i)[3]) {
                return false;
            }
        }
        return true;
    }

    private boolean isMoveLeft() {
        for (int i = 0; i < gamePanel.v.size(); i++) {
            if (gamePanel.hero_x == gamePanel.v.get(i)[0] + gamePanel.v.get(i)[2]
                    && gamePanel.hero_y + gamePanel.hero_height > gamePanel.v.get(i)[1]
                    && gamePanel.hero_y < gamePanel.v.get(i)[1] + gamePanel.v.get(i)[3]) {
                return false;
            }
        }
        return true;
    }

    private void isDie() {
        for(int i=0;i<gamePanel.ms.size();i++) {
            int[] m = gamePanel.ms.get(i);
            if ((gamePanel.hero_x + gamePanel.hero_width == m[0] || gamePanel.hero_x == m[0] + m[2])
                    && gamePanel.hero_y + gamePanel.hero_height > m[1]
                    && gamePanel.hero_y < m[1] + m[3]) {
                gamePanel.init();;
            }
        }
    }
}

JumpHandle

这段是用来实现跳跃的功能,我这里设置的上下跳跃是匀速的,可以自己改一下,让它符合真实物理情况。

这里我设置了最多跳两次。

并且在下降的时候增加了两个判断:1是是否落到实体障碍物上,2是是否踩到怪物,踩到怪物就被判断死亡。

import game2.view.GamePanel;

import java.util.Arrays;

public class JumpHandle implements Runnable {
    GamePanel gamePanel;
    boolean isJump = false;
    boolean isSky = false;
    int c;

    public JumpHandle(GamePanel gamePanel) {
        this.gamePanel = gamePanel;
    }

    @Override
    public void run() {
        while (true) {
            c = 0;

            if (isJump) {
                isJump = false;
                jumpUp();
                jumpDown();
            }
            try {
                Thread.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private void jumpDown() {
        loop:
        while (true) {
            for (int i = 0; i < gamePanel.v.size(); i++) {
                if (gamePanel.hero_x  + gamePanel.hero_width> gamePanel.v.get(i)[0]
                        && gamePanel.hero_x < gamePanel.v.get(i)[0] + gamePanel.v.get(i)[2]) {
                    if (gamePanel.hero_y == gamePanel.v.get(i)[1] - gamePanel.hero_height) {
                        isSky = false;
                        break loop;
                    }
                }
            }
            if (isJump && c < 2) {
                isJump = false;
                jumpUp();
            }
            gamePanel.hero_y += 1;
            for(int i=0;i<gamePanel.ms.size();i++) {
                if (gamePanel.hero_y + gamePanel.hero_height == gamePanel.ms.get(i)[1]
                        && gamePanel.hero_x + gamePanel.hero_width > gamePanel.ms.get(i)[0]
                        && gamePanel.hero_x < gamePanel.ms.get(i)[0] + gamePanel.ms.get(i)[2]) {
                    gamePanel.ms.remove(i);
                    break ;
                }
            }
            try {
                Thread.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private void jumpUp() {
        c++;
        for (int i = 0; i < 80; i++) {
            if (isJump && c < 2) {
                isJump = false;
                jumpUp();
                break;
            }
            if(!isJumpD()){
                break;
            }
            gamePanel.hero_y -= 1;

            try {
                Thread.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private boolean isJumpD() {
        for (int i = 0; i < gamePanel.v.size(); i++) {
            if (gamePanel.hero_y == gamePanel.v.get(i)[1] + gamePanel.v.get(i)[3]
                    && gamePanel.hero_x  + gamePanel.hero_width> gamePanel.v.get(i)[0]
                    && gamePanel.hero_x < gamePanel.v.get(i)[0] + gamePanel.v.get(i)[2]) {
                return false;
            }
        }
        return true;
    }
}

MonsterMove

这里是实现怪物的移动。文章来源地址https://www.toymoban.com/news/detail-451347.html

import game2.view.GamePanel;

public class MonsterMove implements Runnable {
    GamePanel gamePanel;

    public MonsterMove(GamePanel gamePanel) {
        this.gamePanel = gamePanel;
    }

    @Override
    public void run() {

        while(true) {
            for (int i = 0; i < gamePanel.ms.size(); i++) {
                gamePanel.ms.get(i)[0]+=gamePanel.ms.get(i)[6];
                if(gamePanel.ms.get(i)[0]==gamePanel.ms.get(i)[4]||gamePanel.ms.get(i)[0]+gamePanel.ms.get(i)[2]==gamePanel.ms.get(i)[5]){
                    gamePanel.ms.get(i)[6] = -gamePanel.ms.get(i)[6];
                }
            }
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

到了这里,关于java 300行代码 冒险闯关小游戏(代码+讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java超级玛丽小游戏制作过程讲解 第三天 创建并完成常量类02

    今天我们继续完成常量类的创建! 定义了一个名为 `obstacle` 的静态变量,它的类型是 `ListBufferedImage` ,即一个存储 `BufferedImage` 对象的列表。 - `obstacle`: 这是一个列表(List)类型的变量,用于存储多个障碍物的图像。列表是一种数据结构,可以容纳多个元素,并且具有动态

    2024年02月14日
    浏览(59)
  • Java超级玛丽小游戏制作过程讲解 第五天 创建并完成常量类04

    今天继续完成常量的创建。 这段代码是用于加载游戏中的图片资源。代码使用了Java的ImageIO类来读取图片文件,并将其添加到相应的集合中。 首先,代码创建了一个`obstacle`列表,用于存储障碍物的图片资源。然后,使用try-catch语句块来捕获可能发生的IO异常。 在try块中,通

    2024年02月14日
    浏览(43)
  • 2048小游戏 java版(代码+注释)

            一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏。写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来。(需要用的可直接粘贴复制)(轻喷) 目录 游戏展示 讲解  代码        

    2024年02月09日
    浏览(52)
  • Java小游戏练习---超级玛丽代码实现

    B站教学视频: 01_超级玛丽_创建窗口_哔哩哔哩_bilibili 素材提取: 【超级会员V2】我通过百度网盘分享的文件:Java游戏项目… 链接:百度网盘 请输入提取码 提取码:k6j1 复制这段内容打开「百度网盘APP 即可获取」 百度网盘 请输入提取码 百度网盘为您提供文件的网络备份、同

    2024年02月06日
    浏览(61)
  • 基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

    本项目是一套基于Python开发的玛丽冒险小游戏程序,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,确保可以运行! 本系统的软件开发及运行环境

    2024年02月09日
    浏览(51)
  • 五子棋小游戏 java版(代码+详细注释)

    游戏展示         这周闲来无事,再来写个五子棋小游戏。基本功能都实现了,包括人人对战、人机对战。界面布局和功能都写的还行,没做到很优秀,但也不算差。如有需要,做个java初学者的课程设计或者自己写着玩玩也都是不错的(非常简单,小白照着就能写出来)。

    2024年02月07日
    浏览(47)
  • 六一用代码找回童心,花几分钟开发JAVA小游戏

    😄😄个人介绍 光子郎.进行开发工作七年以上,目前涉及全栈领域并进行开发。会经常跟小伙伴分享前沿技术知识,java后台、web前端、移动端(Android,uniapp, 小程序 )相关的知识以及经验体会,不定期会有源码及框架的分享,如果你有相关的知识想要及时了解或者讨论,

    2024年02月07日
    浏览(40)
  • Java实现俄罗斯方块小游戏。(附完整源代码)

    大家好,我是百思不得小赵。 创作时间:2022 年 5 月 12 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN的第1167天。觉得有帮助麻烦👏点赞、🍀评论、❤️收藏 目录 一、游戏背景 二、功能实现 三、效果

    2024年02月03日
    浏览(72)
  • 实现用java做一个简易版《羊了个羊》小游戏(附源代码)

    该项目是跟着这个b站视频一步一步写出来的,初学java有些地方我看不是很明白,但是讲解很仔细,大家可以看原视频,我没有添加背景音乐和背景图片,做出来的效果也勉勉强强。 代码已经上传到github上了,大家可以去github上直接下载代码,附上链接:点击进入github源码链接

    2024年02月04日
    浏览(92)
  • 教你使用Java开发一款简单的扫雷小游戏 附实例代码

    相信很多小伙伴都知道也玩过扫雷游戏,本篇文章将和大家分享一篇关于如何使用Java来实现一款简单的扫雷小游戏,这有助于大家对于Java相关知识的学习有一定的参考价值,下面是详情内容。 学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识。 编写这个

    2024年02月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包