java开发贪吃蛇游戏

package snake;
import javax.swing.JFrame;
public class snake {
	public static void main(String[] args) {
		JFrame fram = new JFrame();
		fram.setTitle("贪吃蛇");//窗口左上角的标识
		fram.setBounds(300, 200, 900, 720);//窗口大小
		fram.setResizable(false);//窗口不能任意改变大小
		fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户单击窗口的关闭按钮时程序执行的操作
		
		SnakePanel panel = new SnakePanel();
		fram.add(panel);
		fram.setVisible(true);//设置窗体可见,没有该语句,窗体将不可见,此语句必须有,否则没有界面就没有如何意义了
	}
}

package snake;

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.beans.ExceptionListener;
import java.util.Random;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.ImageIcon;
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 left = new ImageIcon("left.png");
	ImageIcon right = new ImageIcon("right.png");
	ImageIcon food = new ImageIcon("food.png");
	ImageIcon body = new ImageIcon("body.png");
	ImageIcon title = new ImageIcon("title.jpg");
	//初始化
	int len = 3;//蛇长
	int score = 0;//分数
	int[] snakex = new int[750];
	int[] snakey = new int[750];//画布为750*750
	
	Random x = new Random();
	int foodx = x.nextInt(34)*25+25;
	int foody = x.nextInt(24)*25+75;
	
	String fangxiang = "R";
	
	boolean isStart = false;
	boolean isFail = false;
	boolean isVoice = false;
	
	Timer timer = new Timer(80, this);
	
	public void setUp(){
		isStart = false;
		isFail = false; 
		isVoice = false;
		score = 0;
		len = 3;
		fangxiang = "R";
		snakex[0] = 100;
		snakey[0] = 100;
		snakex[1] = 75;
		snakey[1] = 100;
		snakex[2] = 50;
		snakey[2] = 100;		
	}
	
	public SnakePanel(){//构造器
		this.setFocusable(true);
		this.addKeyListener(this);
		setUp();
	}

	
	public void paint(Graphics g){
		super.paint(g);
		this.setBackground(Color.white);
		title.paintIcon(this, g, 25, 11);
		
		g.fillRect(25, 75, 850, 600);
		
		//snake头
		if(fangxiang.equals("R")){
			right.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(fangxiang.equals("L")){
			left.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(fangxiang.equals("U")){
			up.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(fangxiang.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(isStart == false){
			g.setColor(Color.WHITE);
			g.setFont(new Font("arial",Font.BOLD,30));
			g.drawString("Press space to start/stop", 250, 300);
		}
		
		if(isFail == true){
			g.setColor(Color.WHITE);
			g.setFont(new Font("arial",Font.BOLD,30));
			g.drawString("Game over,Press space to Restart", 250, 300);
		}
		
		food.paintIcon(this, g, foodx, foody);
		
		g.setColor(Color.WHITE);
		g.setFont(new Font("arial",Font.BOLD,15));
		g.drawString("Score:"+score, 800, 30);
		g.drawString("Length:"+len, 800, 50);
		
	}
	public void keyPressed(KeyEvent e) { 
		int keyCode = e.getKeyCode();
		if(keyCode == KeyEvent.VK_SPACE){
			if(isFail){
				setUp();
			}else{
				isStart = !isStart;	
				isVoice = !isVoice;
			}

			timer.start();
		} else if(keyCode == KeyEvent.VK_UP && fangxiang != "D"){
			fangxiang = "U";
		} else if(keyCode == KeyEvent.VK_DOWN && fangxiang != "U"){
			fangxiang = "D";
		} else if(keyCode == KeyEvent.VK_LEFT && fangxiang != "R"){
			fangxiang = "L";
		} else if(keyCode == KeyEvent.VK_RIGHT && fangxiang != "L"){
			fangxiang = "R";
		}
		
	}
	
	public void actionPerformed(ActionEvent e) {
		//1.再定一个闹钟
		timer.start();
		//2.移动数据
		if(isStart && !isFail){
			for(int i = len;i>0;i--){
				snakex[i] = snakex[i-1];
				snakey[i] = snakey[i-1];
			}
			//移动头部
			if(fangxiang.equals("R")){
				snakex[0] =  snakex[0] + 25;
				if(snakex[0]>850) snakex[0]=25;
			}else if(fangxiang.equals("L")){
				snakex[0] =  snakex[0] - 25;
				if(snakex[0]<25) snakex[0]=850;
			}else if(fangxiang.equals("U")){
				snakey[0] =  snakey[0] - 25;
				if(snakey[0]<75) snakey[0]=650;
			}else if(fangxiang.equals("D")){
				snakey[0] =  snakey[0] + 25;
				if(snakey[0]>650) snakey[0]=75;
			}
			if(snakex[0] == foodx && snakey[0] == foody){
				len++;
				score++;
				foodx = x.nextInt(34)*25+25;
				foody = x.nextInt(24)*25+75;
			}
			for(int i=1; i<len; i++ ){
				if(snakex[0] == snakex[i] && snakey[0] == snakey[i]){
					isFail = true;
				}
			}
			

		}
		//3.repaint()
		repaint();
	}
	
	
	//背景音乐
	
	public void playSound() {
			if(isVoice == true){
			new Thread(new Runnable() {
				public void run() {
					
					try {
						Clip clip = AudioSystem.getClip();
						clip.open(AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/time.wav")));
						clip.start();
					} 
					catch (Exception e) {
						e.printStackTrace();
					}
					
				}
			}).start();
			}
		}
	
	public void keyTyped(KeyEvent e) {	
	}
	public void keyReleased(KeyEvent e) {		
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值