📄 snake.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 + -