JAVA实现贪吃蛇小游戏

Java实现贪吃蛇代码

代码参考:B站Java项目 我修改了部分内容和添加了音乐。
在这里插入图片描述
Snake.java 作为项目的启动类

package mysnake;

import javax.swing.JFrame;

public class Snake {

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setTitle("贪吃蛇小游戏");
		frame.setBounds(400, 200, 900, 720);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		SnakePanel panel = new SnakePanel();
		frame.add(panel);
		frame.setVisible(true);
	}
}

snakeJpanel.java作为项目的实现类

package mysnake;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

public class SnakePanel extends JPanel implements KeyListener,ActionListener {
	ImageIcon up = new ImageIcon("up.png");
	ImageIcon down = new ImageIcon("down.png");
	ImageIcon title = new ImageIcon("title.png");
	ImageIcon right = new ImageIcon("right.png");
	ImageIcon left = new ImageIcon("left.png");
	ImageIcon body = new ImageIcon("body.png");
	ImageIcon food = new ImageIcon("food.png");
	
	//定义蛇的数据结构
	int[] snakex = new int[750];
	int[] snakey = new int[750];
	int len = 3;
	String direction = "R";
	
	Random r = new 	Random();
	int foodx = r.nextInt(34)*25+25;
	int foody = r.nextInt(24)*25+75;
	
	
	boolean isstarted = false;
	boolean isfailed = false;
	
	int score=0;

	Timer timer = new Timer(200, this);
	
	 File f1 = new File("music.wav");
	
	public SnakePanel() {
		this.setFocusable(true);
		musicplayer();
		initsnake();
		this.addKeyListener(this);
		timer.start();
	}
	public void musicplayer() {
		
		try {
			URL url = f1.toURL();
			AudioClip ac = Applet.newAudioClip(url);
			ac.loop();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		
	}
    
	public void initsnake() {
		len = 3;
		direction = "R";
		isstarted = false;
		isfailed = false;
		snakex[0] = 100;
		snakey[0] = 100;
		snakex[1] = 75;
		snakey[1] = 100;
		snakex[2] = 50;
		snakey[2] = 100;
		score = 0;
		
		
	}
	
	
	
	
	public void paint(Graphics g) {
		this.setBackground(Color.WHITE);
		g.fillRect(25, 75, 850, 600);
		title.paintIcon(this, g, 25, 11);
		
		
		if(direction.equals("R")) {
			right.paintIcon(this, g, snakex[0], snakey[0]);
		}
		else if (direction.equals("L")) {
			left.paintIcon(this, g, snakex[0], snakey[0]);
		}else if (direction.equals("U")) {
			up.paintIcon(this, g, snakex[0], snakey[0]);
		}else if (direction.equals("D")) {
			down.paintIcon(this, g, snakex[0], snakey[0]);
		}
		for(int i=1;i<len;i++) {
			body.paintIcon(this, g, snakex[i], snakey[i]);
		}
		
		if(!isstarted) {
			g.setColor(Color.WHITE);
			g.setFont(new Font("arial", Font.BOLD, 30));
			g.drawString("Please press space to start", 300, 300);
		}
		food.paintIcon(this, g, foodx, foody);
		if(isfailed) {
			g.setColor(Color.WHITE);
			g.setFont(new Font("arial", Font.BOLD, 30));
			g.drawString("Game over", 300, 300);
		}
		
		g.setColor(Color.black);
		g.setFont(new Font("arial", Font.PLAIN, 15));
		g.drawString("score "+score,750,20);
		g.drawString("len "+len, 750, 40);
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		int keycode = e.getKeyCode();
		if(keycode == KeyEvent.VK_SPACE) {
			if(isfailed) {
				initsnake();
			}else 
			{
			isstarted = !isstarted;
			}
		}
		if(keycode == KeyEvent.VK_UP && !direction.equals("D")) {
			direction = "U";
		}
		if(keycode == KeyEvent.VK_DOWN && !direction.equals("U")) {
			direction = "D";
		}
		if(keycode == KeyEvent.VK_LEFT && !direction.equals("R")) {
			direction = "L";
		}
		if(keycode == KeyEvent.VK_RIGHT && !direction.equals("L")) {
			direction = "R";
		}
	}

	public void actionPerformed(ActionEvent e) {
		timer.start();
		if(isstarted && !isfailed) {
			for(int i=len;i>0;i--) {
				snakex[i] = snakex[i-1];
				snakey[i] = snakey[i-1];
			}
			if(direction.equals("R")) {
				snakex[0] = snakex[0]+25;
				if(snakex[0]>850) {
					JOptionPane.showMessageDialog(this, "撞墙啦");
					initsnake();
				}
			}
			else if (direction.equals("L")) {
				snakex[0] = snakex[0]-25;
				if(snakex[0]<25) {
					JOptionPane.showMessageDialog(this, "撞墙啦");
					initsnake();
				}
			}else if (direction.equals("U")) {
				snakey[0] = snakey[0]-25;
				if(snakey[0]<75) {
					JOptionPane.showMessageDialog(this, "撞墙啦");
					initsnake();
				}
			}else if (direction.equals("D")) {
				snakey[0] = snakey[0]+25;
				if(snakey[0]>650) {
					JOptionPane.showMessageDialog(this, "撞墙啦");
					initsnake();
				}
			}
			if(snakex[0] == foodx && snakey[0] == foody) {
				len++;
				score++;
				foodx = r.nextInt(34)*25+25;
				foody = r.nextInt(24)*25+75;
				
			}
			for(int i=1;i<len;i++) {
				if(snakex[i] == snakex[0]&& snakey[i] == snakey[0]) {
					isfailed = true;
				}
			}
		}
		repaint();
	}

	
	public void keyReleased(KeyEvent arg0) {
	
	}

	public void keyTyped(KeyEvent arg0) {
		
	}
}

源码链接:https://pan.baidu.com/s/1GR4ta81a1_J7dlep0mU42A
提取码:ovuv

运行截图
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现贪吃蛇小游戏可以使用Java Swing和AWT库来实现界面和交互,使用Java集合框架来实现蛇身体的存储和移动,以及使用定时器来控制游戏的速度和刷新。 具体实现步骤如下: 1. 定义一个Snake类代表蛇,包含蛇头的坐标、蛇的长度以及蛇的方向等属性,以及包含蛇身体的坐标列表等属性和方法。 2. 定义一个Food类代表食物,包含食物的坐标等属性和方法。 3. 定义一个GamePanel类代表游戏面板,继承自JPanel类,包含游戏的主要逻辑和交互,如蛇的移动、食物的生成和判断、游戏结束等。 4. 在GamePanel类中,使用定时器Timer来控制游戏的速度和刷新,以及使用Java集合框架来实现蛇身体的存储和移动,以及检测蛇头是否撞墙或撞到自己身体等。 下面是Java代码实现的伪代码: ```java // 定义Snake类 class Snake { // 蛇头的坐标 int x, y; // 蛇的长度 int length; // 蛇的方向 int direction; // 蛇身体的坐标列表 List<Point> body; // 蛇的移动方法 void move(); // 检测蛇头是否撞到自己身体的方法 boolean checkCollision(); } // 定义Food类 class Food { // 食物的坐标 int x, y; // 食物的生成方法 void generate(); } // 定义GamePanel类 class GamePanel extends JPanel implements ActionListener { // 蛇和食物的实例 Snake snake; Food food; // 定时器 Timer timer; // 构造方法 public GamePanel() { // 初始化蛇和食物 snake = new Snake(); food = new Food(); food.generate(); // 创建定时器 timer = new Timer(100, this); timer.start(); } // 绘制游戏界面的方法 void paintComponent(Graphics g); // 处理定时器事件的方法 void actionPerformed(ActionEvent e); // 处理按键事件的方法 void keyPressed(KeyEvent e); // 判断游戏是否结束的方法 boolean isGameOver(); } ``` 上述代码中,Snake类包含蛇头的坐标、长度和方向等属性,以及蛇身体的坐标列表和移动、检测撞墙和撞到自己身体等方法。Food类包含食物的坐标和生成方法。GamePanel类继承自JPanel类,包含游戏的主要逻辑和交互,如蛇的移动、食物的生成和判断、游戏结束等,并使用定时器控制游戏的速度和刷新。在main方法中,创建GamePanel实例并添加到JFrame中即可实现贪吃蛇小游戏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值