贪吃蛇游戏

代码分为3部分
1.界面部分`

package com.luban.snake02;

import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;

public class Snake02 {

	public static void main(String[] args) throws InterruptedException {
          JFrame frame=new JFrame("贪吃蛇");
          frame.setBounds(400,200,900,720);
          frame.setResizable(false);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          SnakePanel02 panel=new SnakePanel02();
          frame.add(panel);          
          frame.setVisible(true);
          Sound player = new Sound("D:/CloudMusic/tan.wav");   //创建音乐播放器
          player.start(true);//以开始以循环的形式播放,player(false)为不循环播放   
          TimeUnit.SECONDS.sleep(5);
          player.stop();                       //暂停播放音频
          TimeUnit.SECONDS.sleep(4);
          player.continues();                //继续开始播放音频
  	
	}

}

2.游戏功能部分

package com.luban.snake02;

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.lang.ProcessBuilder.Redirect;
import java.util.Random;

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

public class SnakePanel02 extends JPanel implements KeyListener,ActionListener {
	//加载所有的图片
	ImageIcon up = new ImageIcon("up.png");
	ImageIcon down = new ImageIcon("down.png");
	ImageIcon left = new ImageIcon("left.png");
	ImageIcon right = new ImageIcon("right.png");
	ImageIcon title = new ImageIcon("title.jpg");
	ImageIcon food = new ImageIcon("food.png");
	ImageIcon body = new ImageIcon("body.png");
	ImageIcon wall = new ImageIcon("wall.jpg");
	
	//蛇的数据结构的设计
	int[] snakex = new int[750];
	int[] snakey = new int[750];
	int len=3;
	String direction = "R"; //R右 L左 U上 D下
	//障碍物的数据
	int[] wallx = new int[200];
	int[] wally = new int[325];
	//食物的数据
	Random r = new Random();
	int foodx = r.nextInt(34)*25+25;//这是食物随机产生的范围,34个格子25的像素加前面空着的25
	int foody = r.nextInt(24)*25+75;
	
	//游戏是否开始
	boolean isStarted = false;
	
	//游戏是否失败
	boolean isFaild = false;
	
	Timer timer = new Timer(150, this);
	
	//统计分数 
	int score =0;
	
	
	
	
	public SnakePanel02(){
		this.setFocusable(true);
		initSnake();//放置静态蛇
		this.addKeyListener(this);//添加键盘监听接口
		timer.start();
	}
	
	//初始化蛇
	public void initSnake(){
		isStarted = false;
		isFaild=false;
		len=3;
		direction="R";
		snakex[0] = 100;
		snakey[0] = 100;
		snakex[1] = 75;
		snakey[1] = 100;
		snakex[2] = 50;
		snakey[2] = 100;
		wallx[0] = 200;
		wally[0] = 200;
	}
	
	public void paint(Graphics g){
		//设置画布的背景颜色
		this.setBackground(Color.BLACK);
		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("Press Space to Start/Pause", 300, 300);
		}
		
		//画失败提示语
		if(isFaild){
			g.setColor(Color.WHITE);
			g.setFont(new Font("arial", Font.BOLD, 30));
			g.drawString("Game Over, Press Space to Start", 300, 300);
		}
		//画食物
		food.paintIcon(this, g, foodx, foody);
		
		//设置障碍物
		wall.paintIcon(this, g, 200, 200);
		//分数和长度的统计
		g.setColor(Color.WHITE);
		g.setFont(new Font("arial",Font.PLAIN,15));
		g.drawString("Score:"+score, 750, 30);
		g.drawString("Length:"+len, 750, 50);
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
    //实现一个按空格键的方法
	@Override
	public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if(keyCode == KeyEvent.VK_SPACE){
			if(isFaild){
				initSnake();
			}else{
				isStarted = !isStarted;
			}
			
//			repaint();
		}else if(keyCode == KeyEvent.VK_UP && !direction.equals("D")){
			direction="U";
		}else if(keyCode == KeyEvent.VK_DOWN && !direction.equals("U")){
			direction="D";
		}else if(keyCode == KeyEvent.VK_LEFT && !direction.equals("R")){
			direction="L";
		}else if(keyCode == KeyEvent.VK_RIGHT && !direction.equals("L")){
			direction="R";
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	/*
	 * 1.重新定个闹钟
	 * 2.蛇移动
	 * 3.重画
	 * */
	@Override
	public void actionPerformed(ActionEvent e) {
		
		timer.start();
		
		if(isStarted && !isFaild){
			//移动身体
			for(int i=len;i>0;i--){
				snakex[i] = snakex[i-1];
				snakey[i] = snakey[i-1];
			}
			//头移动
			if(direction.equals("R")){
				//横坐标 +25
				snakex[0] = snakex[0]+25;
				if(snakex[0] >850){
					snakex[0] = 25;
				}
				
			}else if(direction.equals("L")){
				//横坐标 -25
				snakex[0] = snakex[0]-25;
				if(snakex[0] <25){
					snakex[0] = 850;
				}
				
			}else if(direction.equals("U")){
				//纵坐标 -25
				snakey[0] = snakey[0] -25;
				if(snakey[0] <75){
					snakey[0] = 650;
				}
				
			}else if(direction.equals("D")){
				//纵坐标 +25
				snakey[0] = snakey[0] +25;
				if(snakey[0]>650){
					snakey[0] = 75;
				}
			}
			//吃食物的逻辑
			if(snakex[0] == foodx && snakey[0] == foody){
				len++;
				score++;
				foodx = r.nextInt(34)*25+25;
				foody = r.nextInt(24)*25+75;
			}
			
			if(isStarted && !isFaild) {
			//障碍物的范围
			for(int w=0;w<13;w++) {
				wallx[0]=200;
				wally[w]=200+w*25;
				if(snakex[0]==wallx[0]&&snakey[0]==wally[w]) {
					isFaild = true;
				}
			}
		}
			//判断游戏失败
			for(int i=1;i<len;i++){
				if(snakex[0] == snakex[i] && snakey[0] == snakey[i]){
					isFaild = true;
				}
			}
		}
		repaint();
		
	}

}

3音乐部分

package com.luban.snake02;







/**
*
* Description: 简易音频播放器(只支持AU,RA,WAV)
* 			   在不使用JMF的情况下快速实现音频播放
* 
*/
import javax.sound.sampled.*;
import java.io.*;
import java.util.concurrent.TimeUnit;
 
public class Sound {
	private String musicPath; //音频文件
	private volatile boolean run = true;  //记录音频是否播放
	private Thread mainThread;   //播放音频的任务线程
	
	private AudioInputStream audioStream;
	private AudioFormat audioFormat;
	private SourceDataLine sourceDataLine;
	
	public Sound(String musicPath) {
		this.musicPath = musicPath;
		prefetch();
	}
	
	//数据准备
	private void prefetch(){
		try{
		//获取音频输入流
	    audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
		//获取音频的编码对象
		audioFormat = audioStream.getFormat();
		//包装音频信息
		DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,
				audioFormat,AudioSystem.NOT_SPECIFIED);
		//使用包装音频信息后的Info类创建源数据行,充当混频器的源
		sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
		
		sourceDataLine.open(audioFormat);
		sourceDataLine.start();
		
		}catch(UnsupportedAudioFileException ex){
			ex.printStackTrace();
		}catch(LineUnavailableException ex){
			ex.printStackTrace();
		}catch(IOException ex){
			ex.printStackTrace();
		}
		
	}
	//析构函数:关闭音频读取流和数据行
	protected void finalize() throws Throwable{
		super.finalize();
		sourceDataLine.drain();
		sourceDataLine.close();
		audioStream.close();
	}
	
	//播放音频:通过loop参数设置是否循环播放
	private void playMusic(boolean loop)throws InterruptedException {
		try{
				if(loop){
					while(true){
						playMusic();
					}
				}else{
					playMusic();
					//清空数据行并关闭
					sourceDataLine.drain();
					sourceDataLine.close();
					audioStream.close();
				}
			
		}catch(IOException ex){
			ex.printStackTrace();
		}
		
		
	}
	private void playMusic(){
		try{
			synchronized(this){
				run = true;
			}
			//通过数据行读取音频数据流,发送到混音器;
			//数据流传输过程:AudioInputStream -> SourceDataLine;
			audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
			int count;
			byte tempBuff[] = new byte[1024];
			
				while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){
					synchronized(this){
					while(!run)
						wait();
					}
					sourceDataLine.write(tempBuff,0,count);
							
			}
 
		}catch(UnsupportedAudioFileException ex){
			ex.printStackTrace();
		}catch(IOException ex){
			ex.printStackTrace();
		}catch(InterruptedException ex){
			ex.printStackTrace();
		}
		
	}
	
	
	//暂停播放音频
	private void stopMusic(){
		synchronized(this){
			run = false;
			notifyAll();
		}
	}
	//继续播放音乐
	private void continueMusic(){
		synchronized(this){
			 run = true;
			 notifyAll();
		}
	}
	
	
	//外部调用控制方法:生成音频主线程;
	public void start(boolean loop){
		mainThread = new Thread(new Runnable(){
			public void run(){
				try {
					playMusic(loop);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		mainThread.start();
	}
	
	//外部调用控制方法:暂停音频线程
	public void stop(){
		new Thread(new Runnable(){
			public void run(){
				stopMusic();
				
			}
		}).start();
	}
	//外部调用控制方法:继续音频线程
	public void continues(){
		new Thread(new Runnable(){
			public void run(){
				continueMusic();
			}
		}).start();
	}

  
 }


游戏实现图片![在这里插入图片描述](https://img-blog.csdnimg.cn/20210715221330621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUxNzA1MDU0,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210715221351602.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUxNzA1MDU0,size_16,color_FFFFFF,t_70#pic_center)


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值