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

📄 snake.java

📁 用java开发的贪吃蛇程序
💻 JAVA
字号:
package com.bjsxt.snake;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.Random;
 
public class Snake {
	Node head = null, tail = null;
	Yard y = null;
	static Random r = new Random();
	public Snake(Yard y) {
		Node n = new Node(10, 10, Dir.D);
		head = tail = n;
		this.y = y;
	} 
	
	public void draw(Graphics g) {
		move();
		for(Node n = head; n != null; n = n.next()) {
			n.draw(g);
		}
	}
	
	private void move() {
		checkDead();
		addHead();
		deleteTail();
	}
	
	private void checkDead() {
		if(head.row < 1 || head.row > Yard.ROWS || head.col < 0 || head.col > Yard.COLS) {
			y.gameOver();
			return;
		}
		for(Node n = head.next(); n != null; n = n.next()) {
			if(head.row == n.row && head.col == n.col) {
				y.gameOver();
				return;
			}
		}
	}
	
	private void deleteTail() {
		tail.getPrev().setNext(null);
		tail = tail.getPrev();
	}
	
	private void addHead() {
		int row = head.row, col = head.col;
		switch(head.getDir()) {
		case L:
			row = head.row;
			col = head.col - 1;
			break;
		case U:
			row = head.row - 1;
			col = head.col;
			break;
		case R:
			row = head.row;
			col = head.col + 1;
			break;
		case D:
			row = head.row + 1;
			col = head.col;
			break;
		}
		Node n = new Node(row, col, head.getDir());
		n.setNext(head);
		head.setPrev(n);
		head = n;
	}
	
	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		switch (key) {
		case KeyEvent.VK_LEFT:
			if(head.getDir() == Dir.R) return;
			head.setDir(Dir.L);
			break;
		case KeyEvent.VK_UP:
			if(head.getDir() == Dir.D) return;
			head.setDir(Dir.U);
			break;
		case KeyEvent.VK_RIGHT:
			if(head.getDir() == Dir.L) return;
			head.setDir(Dir.R);
			break;
		case KeyEvent.VK_DOWN:
			if(head.getDir() == Dir.U) return;
			head.setDir(Dir.D);
			break;
		default:
			break;
		}
	}
	
	public void eat(Egg e) {
		if(this.getRect().intersects(e.getRect())) {
			addHead();
			e.setCol(r.nextInt(Yard.COLS));
			e.setRow(r.nextInt(Yard.ROWS-1) + 1);			
		}
	}
	
	public Rectangle getRect() {
		return new Rectangle(head.col*Yard.BLOCK_SIZE, head.row*Yard.BLOCK_SIZE, Yard.BLOCK_SIZE, Yard.BLOCK_SIZE);
	}
	
	public class Node {
		int row, col;
		private Node next = null;
		private Node prev = null;
		Dir dir;
		
		void draw(Graphics g) {
			Color c = g.getColor();
			g.setColor(Color.BLACK);
			g.fillRect(col*Yard.BLOCK_SIZE, row*Yard.BLOCK_SIZE, Yard.BLOCK_SIZE, Yard.BLOCK_SIZE);
			g.setColor(c);
		}
		
		public Node(int row, int col, Dir dir) {
			this.row = row;
			this.col = col;
			this.dir = dir;
		}

		public Node next() {
			return next;
		}

		public void setNext(Node next) {
			this.next = next;
		}

		public Dir getDir() {
			return dir;
		}

		public void setDir(Dir dir) {
			this.dir = dir;
		}

		public Node getPrev() {
			return prev;
		}

		public void setPrev(Node prev) {
			this.prev = prev;
		}
	}

	
}

⌨️ 快捷键说明

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