JAVA练习小游戏——贪吃蛇小游戏 PLUS版

news2024/11/24 20:44:41

目录

基础版本

新增内容

1.添加START开始界面

2.新增背景音乐

3.添加SCORE计分

4.新增游戏机制

代码实现 

实机演示


基础版本

JAVA练习小游戏——贪吃蛇小游戏_timberman666的博客-CSDN博客icon-default.png?t=N4P3https://blog.csdn.net/timberman666/article/details/131046742?spm=1001.2014.3001.5501

新增内容

1.添加START开始界面

点击空格Space即刻开始游戏

2.新增背景音乐

从游戏开始即可尽享音乐直至游戏结束

3.添加SCORE计分

对贪吃蛇吃掉苹果计入分数

4.新增游戏机制

在贪吃蛇超出界面死亡机制基础上增加 贪吃蛇首尾相遇也会判定死亡

代码实现 

import java.awt.*;
import java.awt.event.*;
import java.awt.font.TextLayout;
import javax.swing.*;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.File;
import java.io.IOException;
import java.net.URL;

public class SnakeGame extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private boolean gameStarted = false;
    // 定义游戏区域的大小
    private final int WIDTH = 640;
    private final int HEIGHT = 640;

    // 定义贪吃蛇的初始位置和大小
    private final int DOT_SIZE = 10;
    private final int ALL_DOTS = 900;
    private final int RAND_POS = 30;
    private int[] x = new int[ALL_DOTS];
    private int[] y = new int[ALL_DOTS];
    private int dots;
    private int apple_x;
    private int apple_y;
    private int score = 0;

    // 定义贪吃蛇的移动方向
    private boolean leftDirection = false;
    private boolean rightDirection = true;
    private boolean upDirection = false;
    private boolean downDirection = false;

    // 定义游戏是否结束
    private boolean inGame = true;

    // 定义计时器
    private Timer timer;


    private void loadAudio() {
        try {
            String temp="C:/Users/timberman/Desktop/disco.wav";
            AudioInputStream audioIn = AudioSystem.getAudioInputStream(new File(temp));
            Clip clip = AudioSystem.getClip();
            clip.open(audioIn);
            clip.loop(Clip.LOOP_CONTINUOUSLY);
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            System.err.println("Error: audio file not found or could not be loaded.");
        }
    }
    public SnakeGame() {
        initGame();
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                if (key == KeyEvent.VK_LEFT && !rightDirection) {
                    leftDirection = true;
                    upDirection = false;
                    downDirection = false;
                } else if (key == KeyEvent.VK_RIGHT && !leftDirection) {
                    rightDirection = true;
                    upDirection = false;
                    downDirection = false;
                } else if (key == KeyEvent.VK_UP && !downDirection) {
                    upDirection = true;
                    leftDirection = false;
                    rightDirection = false;
                } else if (key == KeyEvent.VK_DOWN && !upDirection) {
                    downDirection = true;
                    leftDirection = false;
                    rightDirection = false;
                }
            }
        });
        setFocusable(true);
    }

    public void initGame() {
        loadAudio();
        // Initialize game area
        setTitle("SnakeGame");
        setSize(WIDTH, HEIGHT);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        getContentPane().setBackground(Color.black);

        // Add start screen
        JLabel startLabel = new JLabel("Press the space bar to start the game");
        startLabel.setForeground(Color.white);
        startLabel.setBackground(Color.black);
        startLabel.setFont(new Font("Helvetica", Font.BOLD, 20));
        startLabel.setHorizontalAlignment(JLabel.CENTER);
        startLabel.setVerticalAlignment(JLabel.CENTER);
        add(startLabel);

        // Initialize snake and apple positions
        dots = 3;
        for (int i = 0; i < dots; i++) {
            x[i] = 50 - i * DOT_SIZE;
            y[i] = 50;
        }
        locateApple();

        // Initialize timer
        timer = new Timer(140, this);

        // Add key listener to start game
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                if (key == KeyEvent.VK_SPACE && !gameStarted) {
                    // Remove start screen
                    remove(startLabel);
                    gameStarted = true;
                    // Start timer
                    timer.start();
                }
            }
        });

        score = 0;
    }

    public void locateApple() {
        // 随机生成苹果的位置
        int r = (int) (Math.random() * RAND_POS);
        apple_x = r * DOT_SIZE;

        r = (int) (Math.random() * (RAND_POS/2)); // limit apple to top half of game area
        apple_y = r * DOT_SIZE;
    }
    public void checkApple() {
        // 检查贪吃蛇是否吃到了苹果
        if ((x[0] == apple_x) && (y[0] == apple_y)) {
            dots++;
            locateApple();
            score++;
            setTitle("SnakeGame - Score: " + score);
        }
    }

    public void checkCollision() {
        // 检查贪吃蛇是否碰到了边界或自己的身体
        for (int i = dots; i > 0; i--) {
            if ((i > 4) && (x[0] == x[i]) && (y[0] == y[i])) {
                inGame = false;
            }
        }

        if (y[0] >= HEIGHT) {
            inGame = false;
        }

        if (y[0] < 0) {
            inGame = false;
        }

        if (x[0] >= WIDTH) {
            inGame = false;
        }

        if (x[0] < 0) {
            inGame = false;
        }

        if (!inGame) {
            timer.stop();
        }
    }

    public void move() {
        // 移动贪吃蛇
        for (int i = dots; i > 0; i--) {
            x[i] = x[(i - 1)];
            y[i] = y[(i - 1)];
        }

        if (leftDirection) {
            x[0] -= DOT_SIZE;
        }

        if (rightDirection) {
            x[0] += DOT_SIZE;
        }

        if (upDirection) {
            y[0] -= DOT_SIZE;
        }

        if (downDirection) {
            y[0] += DOT_SIZE;
        }
    }

    public void actionPerformed(ActionEvent e) {
        // 计时器触发事件
        if (inGame) {
            checkApple();
            checkCollision();
            move();
            repaint(); // 重绘游戏区域
        }
    }

    public void paint(Graphics g) {

        // 绘制游戏区域
        super.paint(g);

        if (inGame) {
            g.setColor(Color.red);
            g.fillOval(apple_x, apple_y, DOT_SIZE, DOT_SIZE);

            for (int i = 0; i < dots; i++) {
                g.setColor(Color.green);
                g.fillRect(x[i], y[i], DOT_SIZE, DOT_SIZE);
            }
            g.setColor(Color.black);
            Toolkit.getDefaultToolkit().sync();
        } else {
            gameOver(g);
        }
    }

    public void gameOver(Graphics g) {
        // 游戏结束
        String msg = "GAME OVER";
        Font small = new Font("Helvetica", Font.BOLD, 40);
        FontMetrics metr = getFontMetrics(small);

        g.setColor(Color.white);
        g.setFont(small);
        g.drawString(msg, (WIDTH - metr.stringWidth(msg)) / 2, HEIGHT / 2);

        String scoreMsg = "Final Score: " + score;
        Font smallScore = new Font("Helvetica", Font.BOLD, 20);
        FontMetrics scoreMetr = getFontMetrics(smallScore);
        g.setFont(smallScore);
        g.drawString(scoreMsg, (WIDTH - scoreMetr.stringWidth(scoreMsg)) / 2, HEIGHT / 2 + 50);

    }


    public static void main(String[] args) {
        new SnakeGame();
    }
}

实机演示

贪吃蛇PLUS版

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

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

相关文章

xshell使用技巧小节

文章目录 1. 输出日志文件2. 快捷键设置3. 使用ctrlv按键4. 快速命令 1. 输出日志文件 需求&#xff1a;我们使用xshell时会经常需要把xshell中的内容打印到文件中&#xff0c;或者因为内容过多&#xff0c;xshell界面无法显示先显示出的内容&#xff0c;或者需要明确记录文件…

AlterNET Studio v9.0 Crack

AlterNET Studio v9.0 改进了代码编辑器、表单设计器和 Python LSP 解析器。 2023 年 6 月 5 日 - 11:22新版本 特征 代码编辑器 编辑器中添加了 Microsoft Visual Studio 主题。现在包括一个放大镜区域&#xff0c;可以更轻松地浏览文档的内容。带有 alpha 通道的图像现在用于…

汽车电子AUTOSAR之EcuM模块

目录 前言 正文 EcuM模块总体介绍 主要功能 总状态机&#xff08;Flexible 与 Fixed&#xff09; Startup Sequence STARTUP I STARTUP II RUN Sequence RUN II RUN III ShutDown Sequence ShutDown Target Go Sleep Go OFF I Go OFF II Sleep Sequence Sleep…

如何从平面图或蓝图为 ROS 创建地图

如何从平面图或蓝图为 ROS 创建地图 在本教程中&#xff0c;我将向您展示如何从平面图或蓝图为 RViz&#xff08;ROS 的 3D 可视化程序&#xff09;创建地图。为 RViz 创建地图是使机器人能够在环境中自主导航的重要步骤。 我们经常使用机器人的激光雷达来构建地图。这很好&am…

【openeuler】Yocto embedded sig例会 (2023-01-12)

Yocto & embedded sig例会 (2023-01-12)_哔哩哔哩_bilibili

群智能算法-模拟退火

一.基本理念 模拟退火算法(Simulated Annealing,简称SA) 的思想最早是由Metropolis等提出的.其出发点就是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成。 加温过程&#xff1a;我…

AutoHand插件使用指南

一、设置 1.软件包设置 Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。 这里只介绍OpenXR(Action Based),首先作如下设置: 我这里用的是HTC Vive Pro: 找到并导入AutoHand插件中的OpenXR这个包:…

java错题记录(一)

一、观察下类代码&#xff0c;输出正确的是 String s1 "coder"; String s2 "coder"; String s3 "coder" s2; String s4 "coder" "coder"; String s5 s1 s2; System.out.println(s…

SELD2022:(一)数据集收集与组织详解

前言&#xff1a;声音事件检测与定位&#xff08;SELD&#xff09;作为DCASE挑战赛的子任务&#xff0c;从2019年开始已经举办了好几届。该子任务的目标也从2022年开始由原来的在仿真数据集上设计更优声学模型&#xff0c;过渡到了在真实数据集上进行模型优化。相对而言&#x…

Omnipeek 分析wifi包简单介绍

通常打开一个.pkt文件&#xff0c;我们先看到的是如下内容。 这个场景下的数据基本是不能分析的。。 因为抓空口包1分20秒基本有10w包了&#xff0c;所以通常会对所抓的空口包进行过滤然后分析。 写个例子&#xff1a; 我本次抓包的目的是看路由器mesh的wps 组网过程&#xf…

海睿思分享 | 低代码开发直面行业变革:革新,创新?

软件体系结构从单体集群服务时期&#xff0c;历经领域驱动设计、微服务架构等阶段&#xff0c;软件产品的开发过程的变革正在潜移默化地进行。 在软件逻辑架构设计、物理架构设计、构建与部署这一系列化的过程中&#xff0c;存在可缩减的设计与开发成本&#xff0c;曾经看似不可…

力扣高频SQL50题(基础版)——第六天

力扣高频SQL50题(基础版)——第六天 1 平均售价 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 SELECT u.product_id,ROUND(SUM(p.price*u.units)/SUM(u.units),2) average_price FROM UnitsSold u INNER JOIN Prices p ON u.…

Linux :: 文件内容操作【6】:文件中指定中间部分(第多少行 到 第多少行)行内容输出 及 初步认识管道

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 注&#xff…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司&#xff0c;开源了 Whisper 自动语音识别系统&#xff0c;OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型&#xff0c;它使用了大量的多语言和多任务的监督数据来训练&#xff0c;能够在…

Linux中使用ls命令按大小对所有文件进行排序

按大小列出目录中的文件(排序) ls -lSh

AI版女网红“半藏森林”上线,服务项目让人意想不到

目前首批网红明星“AI克隆人”已提前上线&#xff0c;主营业务就是打造各种名人版AI聊天机器人&#xff0c;用户付费便可与之聊天。其后台报名参加AI克隆人的网红明星“全网粉丝总数已超过5亿”。该公司这波上线的网红明星AI克隆人&#xff0c;包括此前因“疑似插足他人恋情”&…

腾讯工作3个月,做测试的一些感悟...

普通二本计算机专业毕业&#xff0c;从毕业后&#xff0c;第一份接触测试的工作是在一家通讯小公司&#xff0c;大部分接触的工作是以功能测试为主&#xff0c;一直都是几千块钱工资&#xff0c;还一度被派出差&#xff0c;以及兼职各种产品、运维、运营的活&#xff0c;感觉自…

TS学习操作

一.TypeScript环境安装与运行 1.全局安装 TypeScript &#xff1a; npm install -g typescript 2.校验 &#xff1a; tsc -v 二.如何运行 1.创建一个day01.ts文件夹 2.使用tsc ./day01.ts 将typescript代码转行成js代码 3.在html页面导入day01.js 4.创建配置文件 tsc --i…

力扣LeetCode算法题 第8题-字符串转换整数 (atoi)

以上为题目要求&#xff1a; /*** params Leetcode_test007* return Leetcode_test007* Author bigeZhong* disc**请你来实现一个myAtoi(string s)函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。** 函数myAtoi(…

java实现打包下载

背景&#xff1a;项目中下载功能单个文件正常下载多个文件或者包含文件夹打压缩包下载 上代码 controller RestController RequestMapping("/file") public class FileController {RequestMapping(value "/downloadFilePack", method RequestMethod.G…