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

news/2024/11/16 8:35:17/

目录

基础版本

新增内容

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() {@Overridepublic 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 areasetTitle("SnakeGame");setSize(WIDTH, HEIGHT);setResizable(false);setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);getContentPane().setBackground(Color.black);// Add start screenJLabel 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 positionsdots = 3;for (int i = 0; i < dots; i++) {x[i] = 50 - i * DOT_SIZE;y[i] = 50;}locateApple();// Initialize timertimer = new Timer(140, this);// Add key listener to start gameaddKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();if (key == KeyEvent.VK_SPACE && !gameStarted) {// Remove start screenremove(startLabel);gameStarted = true;// Start timertimer.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 areaapple_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.ppmy.cn/news/230544.html

相关文章

libVLC 抓取视频帧并渲染(OpenGL)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在前面,我们写了几篇文章《libVLC 抓取视频帧并渲染(QWidget)》和《libVLC 抓取视频帧并渲染(QGraphicsView)》,分别介绍了QWidget 和 QGraphicsView 对视频帧的渲染,除了这些方式之外,还有一种最常…

国产手机为何败给了苹果?因为它们已没有性价比优势

去年的iPhone13上市以来热销到春节&#xff0c;近期虽然销量有所下滑&#xff0c;但是在电商平台依然碾压众多国产手机&#xff0c;如今iPhone13进一步降价之后性价比优势凸显&#xff0c;国产手机要与iPhone竞争至少降价三分之一至一半才具有与iPhone相当的性价比。 一、国产手…

《最高人民法院 最高人民检察院 公安部关于办理信息网络犯罪案件适用刑事诉讼程序若干问题的意见》

最高人民法院 最高人民检察院 公安部关于办理信息网络犯罪案件适用刑事诉讼程序若干问题的意见 发布时间&#xff1a;2022年8月30日 为依法惩治信息网络犯罪活动&#xff0c;根据《中华人民共和国刑法》《中华人民共和国刑事诉讼法》以及有关法律、司法解释的规定&#xff0c…

nginx系统优化和内核优化

nginx系统优化 一&#xff1a;隐藏nginx版本号 方法一&#xff1a;修改配置文件 vim /usr/local/nginx/conf/nginx.confnginx -t systemctl restart nginx curl -I http://192.168.52.108方法二&#xff1a;修改源代码 vim /opt/nginx-1.24.0/src/core/nginx.h ##配置文件里…

【Spark】实验四:SparkStreaming编程初级实践

实验准备 实验目的 掌握使用 Socket编程掌握Spark Streaming的基本操作掌握Spark Streaming updateStateByKey的使用 实验内容 使用Spark Streaming构建实时数据计算系统&#xff0c;通过使用socket编程模拟用户浏览商品信息时产生的数据&#xff0c;使用Spark Streaming应用实…

微信小程序项目实例——密码管理器

今日推荐&#x1f481;‍♂️ 自疫情后武林广场的音乐喷泉再次开启⛲⛲⛲ 坐在最佳视角下观赏了一场久违的表演&#x1f386;&#x1f386;&#x1f386; &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;往期优质项目实例&#x1f52e;&#x1f52e;&…

2020-10-15

大佬们&#xff0c;这道编程题怎么写呢&#xff1f; 计算圆球体积 (7分) 设圆球的半径为r&#xff0c;计算并输出圆球体积v。输出结果保留2位小数。提示&#xff1a;计算圆球的体积公式为&#xff1a;v​3​​4​​ πr​3​​ (π3.14)输入格式:输入第一行给出一个正整数半径r…

2020.10.5

**应朱老师要求&#xff0c;我将第一周所学教予我的“徒弟”。**教授内容为用c语言编译器绘制出某个图案。个人认为比较简单&#xff0c;但上下限差距较大。我们先从简单的小画幅图案做起&#xff0c;目标是画一颗松树类似物。 但当我给出朱老师的范本后&#xff0c;在手机上显…