猿问

java贪吃蛇问题(要达到的效果是出现一个蓝色格子在动)

第一个类


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;


public class Snake {
    Node head = null;
    Node tail = null;
    int size = 0;
    Dir dir = Dir.D;
    Node n = new Node(30, 30, Dir.D);
    public Snake(){
        head = n;
        tail = n;
        size = 1;
    }
    
    class Node{
        int row, col;
        Dir dir;
        Node next = null;
        Node prev = null;
        public static final int nodeW = SnakeMain.BLOCK;
        public static final int nodeH = SnakeMain.BLOCK;
        Node(int row, int col, Dir dir ){
            this.row = row;
            this.col = col;
            this.dir = dir;
        }    
        
        void draw(Graphics g){
            Color c = g.getColor();
            g.setColor(Color.BLUE);
            g.fillRect(SnakeMain.BLOCK * col, SnakeMain.BLOCK * row, nodeW, nodeH);
            g.setColor(c);    
        }
    }
    
    public void draw(Graphics g){
        if(size <= 0) return;
        
        for(Node m = head; m != null; m = m.next){
            m.draw(g);
        }
        move();
    }
    
    private void move() {
        addToHead();
        deleteFromTail();

        
    }
    
    private void deleteFromTail() {
        if(size == 0) return;
        tail = tail.prev;
        tail.next = null;
    }
    public void addToTail(){
        Node node = null;
        switch(tail.dir){
        case L:
            node = new Node(tail.row, tail.col + 1, tail.dir);
            break;
        case R:
            node = new Node(tail.row, tail.col - 1, tail.dir);
            break;
        case U:
            node = new Node(tail.row + 1, tail.col, tail.dir);
            break;
        case D:
            node = new Node(tail.row - 1, tail.col, tail.dir);
            break;
        }
        tail.next = node;
        node.prev =  tail;
        tail = node;
        size++;
    }
    
    public void addToHead(){
        Node node = null;
        switch(head.dir){
        case L:
            node = new Node(head.row, head.col - 1, head.dir);
            break;
        case R:
            node = new Node(head.row, head.col + 1, head.dir);
            break;
        case U:
            node = new Node(head.row - 1, head.col, head.dir);
            break;
        case D:
            node = new Node(head.row + 1, head.col, head.dir);
            break;
        }
        node.next = head;
        head.prev = node;
        head = node;
        size++;
    }

    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch(key){
        case KeyEvent.VK_UP:
            head.dir  = dir.U;
            break;
        case KeyEvent.VK_DOWN:
            head.dir = dir.D;
            break;
        case KeyEvent.VK_LEFT:
            head.dir = dir.L;
            break;
        case KeyEvent.VK_RIGHT:
            head.dir = dir.R;
            break;
        }   
     }
}
    
    
    
    
    
   第二个类
import java.awt.*;
import java.awt.event.*;


public class SnakeMain extends Frame {
    public static final int BLOCK = 10;
    public static final int ROW = 60;
    public static final int COLS = 60;
    Snake sn = new Snake();
    Image offScreenImage = null;
    public static void main(String[] args) {
        SnakeMain sm = new SnakeMain();
        sm.launch();
    }
    
    public void launch(){
        setSize(BLOCK * ROW, BLOCK * COLS);
        setBackground(Color.LIGHT_GRAY);
        setResizable(false);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        addKeyListener(new KeyMonitor());
        setVisible(true);
        new Thread(new PaintThread()).start();
    }
    
    public void paint(Graphics g){
        Color c = g.getColor();
        g.setColor(Color.YELLOW);
        for(int i = 1; i < ROW; ++i){
            g.drawLine(0, i * BLOCK, BLOCK * ROW, i * BLOCK);
        }
        for(int j = 1; j < COLS; ++j){
            g.drawLine(j * BLOCK, 0, j * BLOCK, BLOCK * COLS);
        }
        g.setColor(c);
        sn.draw(g);
    }
    
    public void update (Graphics g){
        if(offScreenImage == null) 
            offScreenImage = this.createImage(BLOCK * ROW, BLOCK * COLS);
        Graphics gr = offScreenImage.getGraphics();
        paint(gr);
        g.drawImage(offScreenImage, 0, 0, null);
    }
    
    public class PaintThread implements Runnable{

        public void run() {
            while(true){
                repaint(); 
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        }
        
    }
    
    public class KeyMonitor extends KeyAdapter{

        @Override
        public void keyPressed(KeyEvent e) {
            sn.keyPressed(e);
        }
        
    }

}

    
    
    
    
    
    第三个类
    
public enum Dir {
    D, U, L, R
}


xyxxzsky
浏览 1776回答 0
0回答
随时随地看视频慕课网APP

相关分类

Java
我要回答