求助啊,各位大佬们........

解决方案 »

  1.   

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.*;
    public class Snake {
    private Node head = null;
    private Node tail = null;
    private int size = 0;
    private Node node = new Node(20,30,Dir.L);
    public Snake(){
    head = node;
    tail = node;
    size = 1;
    }

    public void addToTail(){
    Node node = null;
    switch(tail.dir){
    case L:
    node = new Node(tail.rows,tail.cols + 1,tail.dir);
    break;
    case U:
    node = new Node(tail.rows + 1,tail.cols,tail.dir);
    break;
    case R:
    node = new Node(tail.rows,tail.cols - 1,tail.dir);
    break;
    case D:
    node = new Node(tail.rows - 1,tail.cols,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.rows,head.cols - 1,head.dir);
    break;
    case U:
    node = new Node(head.rows - 1,head.cols,head.dir);
    break;
    case R:
    node = new Node(head.rows,head.cols + 1 ,head.dir);
    break;
    case D:
    node = new Node(head.rows + 1,head.cols,head.dir);
    break;
    }
    node.next = head;
    node.prev = node;
    head = node;
    size++;
    }
    //画蛇的方法
    public void draw(Graphics g){
    if(size<=0) return;//蛇的长度小于等于0,即蛇还没创建
    move();
    for(Node node = head;node != null;node = node.next){
    node.draw(g);
    }
    }
    private void move(){
    addToHead();
    deletFromTail();
    }
    private void deletFromTail(){

    if(size == 0) 
    return;

    tail = tail.prev;
    tail.next = null;
    }

    //蛇的一截
    private class Node{
     int w = Yard.BLOCK_SIZE;//蛇的大小
     int h = Yard.BLOCK_SIZE;
     int rows ,cols;//蛇的位置
    Dir dir = Dir.L;//蛇的方向
     Node next = null;
     Node prev = null;

    public Node(int rows,int cols,Dir dir){
    this.rows = rows;
    this.cols = cols;
    this.dir = dir;
    }
    protected void draw(Graphics g){
    Color c = g.getColor();
    g.setColor(Color.BLACK);
    g.fillRect(cols * Yard.BLOCK_SIZE, rows * Yard.BLOCK_SIZE, w, h);
    g.setColor(c);
    }

    }
    public void keyPressed(KeyEvent e){
    int key = e.getKeyCode();
    switch(key){
    case KeyEvent.VK_LEFT:
    head.dir = Dir.L;
    break;
    case KeyEvent.VK_UP:
    head.dir = Dir.U;
    break;
    case KeyEvent.VK_RIGHT:
    head.dir = Dir.R;
    break;
    case KeyEvent.VK_DOWN:
    head.dir = Dir.D;
    break;
    }
    }

    }Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Snake.deletFromTail(Snake.java:76)
    at Snake.move(Snake.java:68)
    at Snake.draw(Snake.java:61)
    at Yard.paint(Yard.java:44)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
    at sun.awt.RepaintArea.paint(RepaintArea.java:240)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347)
    at java.awt.Component.dispatchEventImpl(Component.java:4937)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Snake.deletFromTail(Snake.java:75)
    at Snake.move(Snake.java:68)
    at Snake.draw(Snake.java:61)
    at Yard.paint(Yard.java:44)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
    at sun.awt.RepaintArea.paint(RepaintArea.java:240)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347)
    at java.awt.Component.dispatchEventImpl(Component.java:4937)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Snake.deletFromTail(Snake.java:75)
    at Snake.move(Snake.java:68)
    at Snake.draw(Snake.java:61)
    at Yard.paint(Yard.java:44)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
    at sun.awt.RepaintArea.paint(RepaintArea.java:240)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347)
    at java.awt.Component.dispatchEventImpl(Component.java:4937)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Snake.deletFromTail(Snake.java:75)
    at Snake.move(Snake.java:68)
    at Snake.draw(Snake.java:61)
    at Yard.paint(Yard.java:44)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
    at sun.awt.RepaintArea.paint(RepaintArea.java:240)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347)
    at java.awt.Component.dispatchEventImpl(Component.java:4937)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)