基于java的贪吃蛇游戏

贪吃蛇的游戏开发
实验内容:
1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右
控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,
蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏
结束界面。
2)进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。
实验准备:
eclipse 下载地址
java jdk11.0.6下载地址
一、基本图形界面设计:
1、awt包的主要类,如事件类(event.KeyAdapter、event.KeyEvent)、Graphics类。
事件类主要提供了按键的绑定和监控的功能;
Graphics类最主要提供了一些基本几何图形的绘制方法;
2、util包Stack类和Random类
java.util是包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期时间工具等各类常用工具包。
Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法。它可以产生int、long、float、double以及Goussian等类型的随机数。这也是它与java.lang.Math中的方法Random()最大的不同之处,后者只产生double型的随机数。
3、swing包的JFrame组件、JPanel组件、JOptionPane组件;

代码如下:

```java
import javax.swing.JFrame;

public class Snake {

	public static void main(String[] args) {
		JFrame frame=new JFrame(); 
		frame.setBounds(10,10,900,720);//设置大小
		frame.setResizable(false);//不可移动
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮
		frame.add(new MPanel());
		
		frame.setVisible(true);

	}

}

设置键盘监听器

this.addKeyListener(this);

设置按键反应

public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if(keyCode == KeyEvent.VK_SPACE) {
			if(isFailed) {
				isFailed = false;
				initSnake();
			} else {
				isStarted = !isStarted;
			}
			repaint();
		}else if(keyCode == KeyEvent.VK_LEFT) {
			fx = "L";
		}else if(keyCode == KeyEvent.VK_RIGHT) {
			fx = "R";
		}else if(keyCode == KeyEvent.VK_UP) {
			fx = "U";
		}else if(keyCode == KeyEvent.VK_DOWN) {
			fx = "D";
		}
	}

设置fail条件

public void actionPerformed(ActionEvent e) {
		if(isStarted && !isFailed) {
			for(int i=len-1; i>0; i--) {
				snakex[i]=snakex[i-1];
				snakey[i]=snakey[i-1];
			}
			if(fx == "R") {
				snakex[0] = snakex[0] + 25;
				if(snakex[0] > 850) isFailed = true;
			}else if(fx == "L") {
			 	snakex[0] = snakex[0] - 25;
				if(snakex[0] < 25) isFailed = true;
			}else if(fx == "U") {
				snakey[0] = snakey[0] - 25;
				if(snakey[0] < 75) isFailed = true;
			}else if(fx == "D") {
				snakey[0] = snakey[0] + 25;
				if(snakey[0] > 670) isFailed = true;
			}

Mpanel类代码如下:

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.util.Random;

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

public class MPanel extends JPanel implements KeyListener, ActionListener {
	ImageIcon title = new ImageIcon("title.jpg");
	ImageIcon body = new ImageIcon("body.png");
	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");
	
	int len = 3;//设置初始长度
	int score = 0;
	int[] snakex = new int[816];//边界
	int[] snakey = new int[816];
	String fx = "R"; //方向:R, L, U, D
	boolean isStarted = false;
	boolean isFailed = false;
	Timer timer = new Timer(160 , this);//蛇运动的速度
	int foodx;//食物初始位置
	int foody;
	Random rand = new Random();
	
	public MPanel() {
		initSnake();
		this.setFocusable(true);
		this.addKeyListener(this);
		timer.start();
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		this.setBackground(Color.WHITE);
		title.paintIcon(this, g, 25, 11);
		g.fillRect(25, 75, 850, 600);
		g.setColor(Color.WHITE);
		g.drawString("Len " + len, 750, 35);
		g.drawString("Score " + score, 750, 50);
		
		if(fx == "R") {
			right.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(fx == "L") {
			left.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(fx == "D") {
			down.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(fx == "U") {
			up.paintIcon(this, g, snakex[0], snakey[0]);
		}
		for(int i=1; i< len; i++) {
			body.paintIcon(this, g, snakex[i], snakey[i]);
		}
		
		food.paintIcon(this, g, foodx, foody);
		
		if(isStarted == false) {
			g.setColor(Color.WHITE);
			g.setFont(new Font("微软雅黑", Font.BOLD, 40));
			g.drawString("按空格键开始游戏", 270, 300);
		}
		if(isFailed) {
			g.setColor(Color.RED);
			g.setFont(new Font("宋体", Font.BOLD, 200));
			g.drawString("死", 350, 450);
		}

	}
	
	public void initSnake() {
		//初始化蛇的位置
		len = 3;
		snakex[0] = 100;
		snakey[0] = 100;
		snakex[1] = 75;
		snakey[1] = 100;
		snakex[2] = 50;
		snakey[2] = 100;
		foodx = 25 + 25 * rand.nextInt(34);
		foody = 75 + 25 * rand.nextInt(24);
		fx = "R";
		score = 0;
	}
	@Override
	public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if(keyCode == KeyEvent.VK_SPACE) {
			if(isFailed) {
				isFailed = false;
				initSnake();
			} else {
				isStarted = !isStarted;
			}
			repaint();
		}else if(keyCode == KeyEvent.VK_LEFT) {
			fx = "L";
		}else if(keyCode == KeyEvent.VK_RIGHT) {
			fx = "R";
		}else if(keyCode == KeyEvent.VK_UP) {
			fx = "U";
		}else if(keyCode == KeyEvent.VK_DOWN) {
			fx = "D";
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(isStarted && !isFailed) {
			for(int i=len-1; i>0; i--) {
				snakex[i]=snakex[i-1];
				snakey[i]=snakey[i-1];
			}
			if(fx == "R") {
				snakex[0] = snakex[0] + 25;
				if(snakex[0] > 850) isFailed = true;//snakex[0] = 25;
			}else if(fx == "L") {
			 	snakex[0] = snakex[0] - 25;
				if(snakex[0] < 25) isFailed = true;//snakex[0] = 850;
			}else if(fx == "U") {
				snakey[0] = snakey[0] - 25;
				if(snakey[0] < 75) isFailed = true;//snakey[0] = 650;
			}else if(fx == "D") {
				snakey[0] = snakey[0] + 25;
				if(snakey[0] > 670) isFailed = true;//snakey[0] = 75;
			}
			
			if(snakex[0] == foodx && snakey[0] == foody) {
				len++;
				score = score + 10;
				foodx = 25 + 25 * rand.nextInt(34);
				foody = 75 + 25 * rand.nextInt(24);
			}
			
			for(int i=1; i<len; i++) {
				if(snakex[i]==snakex[0] && snakey[i]==snakey[0]) {
					isFailed = true;
				}
			}
			
			repaint();
		}
		
		timer.start();
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值