贪吃蛇游戏:随机音效提升游戏体验
在贪吃蛇游戏中增加蛇吃到食物随机发出一个音效的功能
本教程将指导您如何在贪吃蛇游戏中添加随机音效,为游戏增添趣味性和活力。通过简单的代码修改,您可以让蛇在吃到食物时发出不同的声音,提升玩家的游戏体验。
实现步骤:
-
声明音效路径数组
在
SnakeGame类中声明一个数组,用来存放音效的路径:java private final String[] soundPaths = { 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\emmmm__(van)_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\I love that_ (van)_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\oh!夜色!_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\务必让螳螂乱摸_(van)_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\啊_this good_(van)_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\啊?快哉!(王)_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\来!_1.WAV', 'C:\Users\彭 杨\IdeaProjects\untitled\src\snake\洞子大(van)_1.WAV' }; -
在初始化食物时随机选择音效路径
在
initFood()方法中,通过随机数选择一个音效路径:// 随机选择一个音效并播放 String soundPath = soundPaths[random.nextInt(soundPaths.length)]; playMusic(soundPath); } ``` -
在蛇吃到食物时播放音效
在
moveSnake()方法中,当蛇吃到食物时,随机选择一个音效路径并播放:// 随机选择一个音效并播放 String soundPath = soundPaths[random.nextInt(soundPaths.length)]; playMusic(soundPath); } else { snake.add(0, head); snake.remove(snake.size() - 1); } ```
**完整代码:**javapackage game;
import javax.sound.sampled.;import javax.swing.;import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Random;
public class SnakeGame extends JFrame implements KeyListener { // 游戏界面大小 private final int WIDTH = 800; private final int HEIGHT = 840; // 网格大小 private static final int GRID_SIZE = 40; // 贪吃蛇移动速度 private static final int SNAKE_SPEED = GRID_SIZE; // 贪吃蛇 private final ArrayList
public SnakeGame() { // 设置窗口大小和标题 setSize(WIDTH, HEIGHT); setTitle('贪吃蛇小游戏'); // 设置窗口居中 setLocationRelativeTo(null); // 添加键盘监听器 addKeyListener(this); // 初始化贪吃蛇和食物
initSnake(); initFood(); this.add(j);
// 播放背景音乐 playMusic('C:\Users\彭 杨\IdeaProjects\untitled\src\G0tch_ - 托马斯臭火车_1_1.WAV');
// 显示窗口 setVisible(true); }
// 初始化贪吃蛇 private void initSnake() { // 初始长度为3 snake.add(new Point(4, 2)); snake.add(new Point(3, 2)); snake.add(new Point(2, 2)); }
// 初始化食物 private void initFood() { Random random = new Random(); int x = random.nextInt((WIDTH-2*GRID_SIZE) / GRID_SIZE); int y = random.nextInt((HEIGHT-2*GRID_SIZE) / GRID_SIZE); food = new Point(x+1, y+1);
// 随机选择一个音效并播放 String soundPath = soundPaths[random.nextInt(soundPaths.length)]; playMusic(soundPath); }
// 绘制游戏界面 @Override public void paint(Graphics g) { // 清空画布 g.clearRect(0, 0, WIDTH, HEIGHT);
// 绘制贪吃蛇 g.setColor(Color.red); for (Point p : snake) { g.fillOval(p.x * GRID_SIZE, p.y * GRID_SIZE, GRID_SIZE, GRID_SIZE); } // 绘制蛇头
j.setBounds(snake.get(0).x*GRID_SIZE-7,snake.get(0).y*GRID_SIZE-30,40,40); // 绘制网格 g.setColor(Color.blue); for (int i = 0; i < WIDTH / GRID_SIZE; i++) { g.drawLine(i * GRID_SIZE, 0, i * GRID_SIZE, HEIGHT); } for (int i = 0; i < HEIGHT / GRID_SIZE; i++) { g.drawLine(0, i * GRID_SIZE, WIDTH, i * GRID_SIZE); } // 绘制食物 g.setColor(Color.PINK); g.fillOval(food.x * GRID_SIZE, food.y * GRID_SIZE, GRID_SIZE, GRID_SIZE); // 显示得分 g.setColor(Color.darkGray); g.setFont(new Font('微软雅黑', Font.PLAIN, 20)); g.drawString('得分:' + score, 650, 100); //绘制黑色方格边框 g.setColor(Color.black); for (int i = 0; i <WIDTH/GRID_SIZE ; i++) { g.fillRect(i*GRID_SIZE,0,40,40); g.fillRect(i*GRID_SIZE,800,40,40); g.fillRect(0,i*GRID_SIZE,40,40); g.fillRect(760,i*GRID_SIZE,40,40); } }
// 重写 update() 方法,调用 paint() 方法 @Override public void update(Graphics g) { paint(g); }
// 贪吃蛇移动 private void moveSnake() { // 计算新的蛇头位置 Point head = new Point(snake.get(0).x + direction.x, snake.get(0).y + direction.y); // 判断是否撞墙 if (head.x < 1 || head.x >= (WIDTH / GRID_SIZE)-1 || head.y < 1 || head.y >= (HEIGHT / GRID_SIZE)-1) { JOptionPane.showMessageDialog(this, '你是真的菜,才'+score+'分'); System.exit(0); } // 判断蛇头是否与蛇身相撞 for (int i = 1; i < snake.size(); i++) { if (head.equals(snake.get(i))) { JOptionPane.showMessageDialog(this, '你是真的菜,才'+score+'分'); System.exit(0); } } // 判断是否吃到食物 if (head.equals(food)) { snake.add(0, head); initFood(); // 如果吃到食物,则将 score 的值加上 10 score += 10;
// 随机选择一个音效并播放 String soundPath = soundPaths[random.nextInt(soundPaths.length)]; playMusic(soundPath); } else { snake.add(0, head); snake.remove(snake.size() - 1); } // 刷新游戏界面 repaint(); }
// 键盘按下事件处理 @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if (direction.y != 1) { direction.x = 0; direction.y = -1; } break; case KeyEvent.VK_DOWN: if (direction.y != -1) { direction.x = 0; direction.y = 1; } break; case KeyEvent.VK_LEFT: if (direction.x != 1) { direction.x = -1; direction.y = 0; } break; case KeyEvent.VK_RIGHT: if (direction.x != -1) { direction.x = 1; direction.y = 0; } break; } }
// 必须实现的方法 @Override public void keyTyped(KeyEvent e) { }
// 必须实现的方法 @Override public void keyReleased(KeyEvent e) { }
// 播放音乐 private void playMusic(String filePath) { File musicFile = new File(filePath); try { AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicFile); Clip clip = AudioSystem.getClip(); clip.open(audioStream); clip.start(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { e.printStackTrace(); } }
public static void main(String[] args) {
SnakeGame game = new SnakeGame(); // 游戏循环 while (true) { game.moveSnake(); try { Thread.sleep(8000 / SNAKE_SPEED); } catch (InterruptedException i) { i.printStackTrace(); } } // 关闭旧的界面
原文地址: https://www.cveoy.top/t/topic/op2S 著作权归作者所有。请勿转载和采集!