贪吃蛇-java实现

源码

  1. Snack.java
package snack;

import java.util.LinkedList;
import java.util.Random;

/**
 *
 * @author cxy
 */
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;
}
  1. 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;

/**
 *
 * @author cxy
 */
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();
    
}
  1. Main.java
package snack;

import javax.swing.JFrame;

/**
 *
 * @author cxy
 */
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) {
        // TODO code application logic here
        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();
}

运行截图

snack

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值