⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake_frame.java

📁 一个简单的的贪吃蛇代码,算法简单
💻 JAVA
字号:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;


/**
 * 贪吃蛇的界面类
 * @author HqkHxgHjj
 *
 */
public class Snake_Frame extends JFrame{
	/**
	 * 
	 * @author HqkHxgHjj
	 *
	 */
	class MyKeyProcess implements KeyListener{

		public void keyPressed(KeyEvent e) {
			//先得获得用户到底按下的是什么键
			int keyCode = e.getKeyCode();
			//改变direction变量的方向值
			switch (keyCode) {
				case KeyEvent.VK_LEFT:
					direction = WEST;
					break;
				case KeyEvent.VK_UP:
					direction = NORTH;
					break;
				case KeyEvent.VK_RIGHT:
					direction = EAST;
					break;
				case KeyEvent.VK_DOWN:
					direction = SOUTH;
					break;
			}
		}

		public void keyReleased(KeyEvent arg0) {
			
		}

		public void keyTyped(KeyEvent arg0) {
			
		}
	}
	
	/**
	 * 界面的宽度
	 */
	final static int SNAKE_FRAME_WIDTH = 400;
	/**
	 * 界面的高度
	 */
	final static int SNAKE_FRAME_HEIGHT = 600;
	/**
	 * 蛇身的宽度
	 */
	final static int SNAKE_WIDTH = 8;
	/**
	 * 重绘的速度
	 */
	final static int SPEED = 200;
	/**
	 * 朝东的常量
	 */
	final static int EAST = 0;
	/**
	 * 朝西的常量
	 */
	final static int WEST = 1;
	/**
	 * 朝南的常量
	 */
	final static int SOUTH = 2;
	/**
	 * 朝北的常量
	 */
	final static int NORTH = 3;

	/**
	 * 保存蛇所有节点坐标二维数组
	 */
	int[][] snake = new int[200][2];
	/**
	 * 蛇身长度变量
	 */
	int snake_num = 7;
	/**
	 * 存储方向的变量
	 */
	int direction = EAST;
	/**
	 * 食物的X坐标
	 */
	int foodX;
	/**
	 * 食物的Y坐标
	 */
	int foodY;

	Snake_Frame(){
		//初始化蛇坐标
		init();
		
		//注册事件处理对象
		this.addWindowListener(new MyWindowProcess());
		
		//注册键盘事件处理对象
		this.addKeyListener(new MyKeyProcess());
		
		//随机产生食物的坐标
		generateFood();
	}
	
	/**
	 * 判断食物与蛇头是否重合的函数
	 * 
	 * @return true代表重合 false代表不重合
	 */
	public boolean isSuperposition(){
		if(snake[0][0] == foodX && snake[0][1] == foodY){
			return true;
		}
		return false;
	}
	
	/**
	 * 吃掉食物的函数(当蛇头与食物重合时,加长蛇身)
	 */
	public void eat(){
		//判断食物是否被吃掉
		if(isSuperposition()){
			//当食物被吃掉时加长蛇身
			snake_num++;
			
			//产生新的食物
			generateFood();
		}
		
	}
	
	/**
	 * 随机产生食物坐标的函数
	 */
	public void generateFood(){
		foodX = ((int)(Math.random() * 
				(SNAKE_FRAME_WIDTH - SNAKE_WIDTH))) / 8 * 8;
		foodY = (((int)(Math.random() * 
				(SNAKE_FRAME_HEIGHT - SNAKE_WIDTH - 30))) + 
				30) / 8 * 8;
	}

	/**
	 * 初始化蛇的坐标
	 */
	public void init(){
		//初始化蛇头坐标
		snake[0][0] = 200;
		snake[0][1] = 80;
		//初始化蛇身坐标
		for(int i = 1 ; i < snake_num ; i++){
			snake[i][0] = snake[i - 1][0] + SNAKE_WIDTH;
			snake[i][1] = snake[i - 1][1];
		}
	}
	
	/**
	 * 刷新背景的函数
	 * @param g 用来刷背景的画笔
	 */
	public void flushScreen(Graphics g){
		//改画笔颜色为背景色
		g.setColor(Color.GREEN);
		//刷背景
		g.fillRect(0, 0, 
				Snake_Frame.SNAKE_FRAME_WIDTH, 
				Snake_Frame.SNAKE_FRAME_HEIGHT);
		
		//改画笔颜色为前景色
		g.setColor(Color.BLACK);
	}
	/**
	 * 画蛇的函数
	 * @param g 画蛇的画笔
	 */
	public void drawSnake(Graphics g){
		for(int i = 0 ; i < snake_num ; i++){
			g.drawRect(snake[i][0],snake[i][1],SNAKE_WIDTH,SNAKE_WIDTH);
		}
	}
	/**
	 * 移动蛇的函数
	 */
	public void move(){
		//根据前面的节点坐标改蛇身坐标
		for(int i = (snake_num - 1) ; i > 0 ; i--){
			snake[i][0] = snake[i - 1][0];
			snake[i][1] = snake[i - 1][1];
		}
	   	//先改蛇头坐标
		switch (direction) {
			case WEST:
				snake[0][0] -= SNAKE_WIDTH;
				break;
			case EAST:
				snake[0][0] += SNAKE_WIDTH;
				break;
			case SOUTH:
				snake[0][1] += SNAKE_WIDTH;
				break;
			case NORTH:
				snake[0][1] -= SNAKE_WIDTH;
				break;
		}
		
	}
	/**
	 * 休息的代码
	 */
	public void speed(){
		try {
			Thread.sleep(SPEED);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 画食物的方法
	 * @param g 画笔
	 */
	public void drawFood(Graphics g){
		g.drawRect(foodX, foodY, SNAKE_WIDTH, SNAKE_WIDTH);
	}
	
	/**
	 * 界面类画完自己之后调用的方法
	 * @param g 画笔对象
	 */
	public void paint(Graphics g) {
		//刷新背景开始
		flushScreen(g);
		//刷新背景结束
		
		//画食物
		drawFood(g);
		
		//画蛇
		drawSnake(g);
		
		//移动蛇
		move();
		
		//吃食物
		eat();
		
		//休息一下
		speed();
		
		//重画
		this.repaint();
	}

	public static void main(String[] args) {
		Snake_Frame f = new Snake_Frame();
		f.setSize(Snake_Frame.SNAKE_FRAME_WIDTH, 
				Snake_Frame.SNAKE_FRAME_HEIGHT);
		f.setVisible(true); 
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -