源碼
- Snack.java
package snack;
import java.util.LinkedList;
import java.util.Random;
public class Snack {
class Node{
private int x;
private int y;
public Node(){}
public Node(int x, int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
public Snack(){
int initX = 200;
int initY = 100;
list.add(new Node(initX,initY));
currentDirector = right;
}
public boolean move(){
int tempX = list.getFirst().getX();
int tempY = list.getFirst().getY();
int moveX = tempX + dir[currentDirector][0]*10;
int moveY = tempY + dir[currentDirector][1]*10;
boolean dead = false;
if(tempX == -10 || tempX== World.WIDTH || tempY == -10 || tempY == World.HEIGHT ){
dead = true;
return dead;
}
for(Node node: list){
if(node == list.getFirst()) continue;
if(node.getX() == tempX && node.getY() == tempY){
dead = true;
return dead;
}
}
if(tempX ==World.foodX && tempY == World.foodY){
Node newNode = list.getLast();
grow(newNode);
}
Node head = new Node(moveX,moveY);
list.removeLast();
list.addFirst(head);
return dead;
}
private void grow(Node newNode){
list.addLast(newNode);
speed += 5;
Random random = new Random();
int seed = random.nextInt(World.FOOD_WIDTH/10);
World.foodX = 10 * seed;
seed = random.nextInt(World.FOOD_HEIGHT/10);
World.foodY = 10 * seed ;
}
public int getSize(){
return list.size();
}
public static final LinkedList<Node> list = new LinkedList<>();
public final int up = 0;
public final int down = 1;
public final int left = 2;
public final int right = 3;
private final int[][] dir = {{0, -1},{0, 1},{-1, 0},{1, 0}};
public int currentDirector;
public static int speed = 5;
}
- World.java
package snack;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import snack.Snack.Node;
public class World extends JPanel implements KeyListener{
public World(){
this.setFocusable(true);
this.addKeyListener(this);
Random random = new Random();
int seed = random.nextInt(FOOD_WIDTH/10);
foodX = 10 * seed;
seed = random.nextInt(FOOD_HEIGHT/10);
foodY = 10 * seed ;
new Thread(new WordThread()).start();
}
@Override
public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRect(X, Y, WIDTH, HEIGHT);
g.setColor(Color.red);
g.drawRect(X, Y, WIDTH, HEIGHT);
g.setColor(Color.green);
g.fillRect(foodX, foodY, 10, 10);
g.setColor(Color.white);
g.fillRect(Snack.list.getFirst().getX(), Snack.list.getFirst().getY(), 10, 10);
for(Node node : Snack.list){
g.drawRect(node.getX(), node.getY(), 10, 10);
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_UP:
if(snack.getSize() > 1 && snack.currentDirector == snack.down)
break;
snack.currentDirector = snack.up;
break;
case KeyEvent.VK_DOWN:
if(snack.getSize() > 1 && snack.currentDirector == snack.up)
break;
snack.currentDirector = snack.down;
break;
case KeyEvent.VK_LEFT:
if(snack.getSize() > 1 && snack.currentDirector == snack.right)
break;
snack.currentDirector = snack.left;
break;
case KeyEvent.VK_RIGHT:
if(snack.getSize() > 1 && snack.currentDirector == snack.left)
break;
snack.currentDirector = snack.right;
break;
default:
}
}
@Override
public void keyReleased(KeyEvent e) {
}
class WordThread implements Runnable{
int speed = 0;
@Override
public void run() {
try {
while(true){
speed = 200-Snack.speed;
if(speed < 50){
speed = 50;
}
Thread.sleep(speed);
if(snack.move()){
JOptionPane.showMessageDialog(World.this, "game over!");
System.exit(0);
}
repaint();
}
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
}
private static final int X = 0;
private static final int Y = 0;
public static final int WIDTH = 780;
public static final int HEIGHT = 550;
static final int FOOD_WIDTH = WIDTH-10;
static final int FOOD_HEIGHT = HEIGHT-10;
static int foodX;
static int foodY;
private static final Snack snack = new Snack();
}
- Main.java
package snack;
import javax.swing.JFrame;
public class Main extends JFrame{
public Main(){
super("eat eat");
this.setSize(WIDTH, HEIGHT);
this.setResizable(false);
this.setVisible(true);
this.setLocation(FRAME_X, FRAME_Y);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(world);
}
public static void main(String[] args) {
new Main();
}
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
private static final int FRAME_X = 200;
private static final int FRAME_Y = 80;
private static final World world = new World();
}
運行截圖