java贪吃蛇

贪吃蛇自己做的才有意思

在这里插入代码片
package entiy;

import javax.swing.JFrame;

public class snake {
	
	public static  void main(String[] args){
		JFrame frame =new JFrame();//创建窗口
		frame.setBounds(400, 200, 900, 720);//设置x、y、长、宽
		frame.setResizable(false);//窗口不可移动
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//在窗口关闭时程序退出
		
		//创建画布
		snakePanel panel=new snakePanel();
		
		//添加画布
		frame.add(panel);
		
		frame.setVisible(true);//显示窗体
		
		
	}
}
在这里插入代码片
package entiy;

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 snakePanel extends JPanel implements KeyListener, ActionListener {

	// 加载所有图片
	ImageIcon up = new ImageIcon("up.png");
	ImageIcon body = new ImageIcon("body.png");
	ImageIcon down = new ImageIcon("down.png");
	ImageIcon food = new ImageIcon("food.png");
	ImageIcon left = new ImageIcon("left.png");
	ImageIcon right = new ImageIcon("right.png");
	ImageIcon title = new ImageIcon("title.jpg");

	// 设计蛇
	int[] snakex = new int[750];// 横坐标
	int[] snakey = new int[750];// 纵坐标
	int len = 3;
	String direction = "R";// R右L左U上D下

	// 食物的随机生成
	Random r = new Random();
	int foodx = r.nextInt(34) * 25 + 25;
	int foody = r.nextInt(24) * 25 + 75;

	// 游戏是否开始
	boolean isStarted = false;

	// 游戏是否失败
	boolean isFaild = false;
	
	//统计分数
	int score =0;
	
	Timer timer = new Timer(150, this);

	public snakePanel() {
		// 获取焦点,才能进行上下左右操作
		this.setFocusable(true);
		// 防止静态的蛇
		initSnake();
		// 添加键盘监听接口
		this.addKeyListener(this);
		// 开起监听器
		timer.start();
	}

	// 蛇的初始化
	public void initSnake() {
		len = 3;
		direction = "R";
		snakex[0] = 100;
		snakey[0] = 100;
		snakex[1] = 75;
		snakey[1] = 100;
		snakex[2] = 50;
		snakey[2] = 100;
		
		isStarted=false;
		isFaild=false;
	}

	// 写一个画画的方法(参数是画笔)
	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);
		
		//画分数和长度统计
		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) {
		// TODO Auto-generated method stub
		int keyCode = e.getKeyCode();
		if (keyCode == KeyEvent.VK_SPACE) {
			if(isFaild){
				initSnake();
			}else{
			isStarted = !isStarted;
			}
			// 重新画改变isStarted的状态,只有为false 才可以使得提示语言有效
			//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

	}

	// 实现蛇移动的监听,动作的执行
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		// 重新定闹钟
		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;
				//如果食物出现在身体里则重新产生食物
				for(int i=0;i<len;i++){
					if(snakex[i] == foodx && snakey[i] == foody){
						foodx = r.nextInt(34) * 25 + 25;
						foody = r.nextInt(24) * 25 + 75;
					}
				}
			}
			// 头部碰到身体判断为死亡
			for (int i = 1; i < len; i++) {
				if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
					isFaild = true;
				}
			}
		}
		repaint();

	}

}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200425151412873.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2huZXdvX3BkYXll,size_16,color_FFFFFF,t_70)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值