public class Snake {
Node head;
Node tail;
Dir d = Dir.D;

Snake() {
head = tail = new Node(10,10);
}

public void addHead() {
Node n = null;
switch(d) {
case U :
n = new Node(head.x, head.y-1);
break;
case D :
n = new Node(head.x, head.y+1);
break;
case L :
n = new Node(head.x-1, head.y);
break;
case R :
n = new Node(head.x+1, head.y);
break;
}
n.next = head;
head.prev = n;
head = n;
}

public void addTail() {

}
public void draw(Graphics g) {
for(Node n=head;n!=null;n=head.next) {
n.draw(g);
}

move();//调用这里就程序就死
} private void move() {
addHead();

} public void keyPressed(KeyEvent arg0) {
switch(arg0.getKeyCode()) {
case KeyEvent.VK_UP :
d = d.U;
break;
case KeyEvent.VK_DOWN :
d = d.D;
break;
case KeyEvent.VK_LEFT :
d = d.L;
break;
case KeyEvent.VK_RIGHT :
d = d.R;
break;
}
} private class Node {
int x,y;
int h = Yard.BLOCK_SIZE;
int w = Yard.BLOCK_SIZE;
Node next ;
Node prev ;

Node(int x, int y) {
this.x = x;
this.y = y;
}

public void draw(Graphics g){
Color c = g.getColor();
g.setColor(Color.black);
g.fillRect(x * Yard.BLOCK_SIZE, y * Yard.BLOCK_SIZE, w, h);
g.setColor(c);
}
}}

解决方案 »

  1.   

    在move前写一句输出看看有没有输出,没有说明是之前的部分挂了
      

  2.   

    我试验过的  是Move里面的问题  addHead这个方法一掉用就出问题
      

  3.   

    addHead到第几行挂了呢?
    Move你确定进去了吗?挂了肯定报异常吧?你能说清楚点吗。。
      

  4.   

    没有Exception 就是程序没反映  我把全部代码发上来吧 
      

  5.   

    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;/**
     * 游戏的主窗口
     * @author Administrator
     *
     */
    public class Yard extends Frame {

    private static Image offImage= null;
    /**
     * 窗口的行
     */
    public static final int ROWS = 50;
    /**
     * 窗口的列
     */
    public static final int COLS = 50;
    /**
     * 窗口每一小各的大小
     */
    public static final int BLOCK_SIZE = 10;
    private Snake s = new Snake();
    /**
     * @param 暂时没用
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Yard().lunch();
    }

    /**
     * 游戏窗口的设置
     */
    public void lunch() {
    setLocation(400, 100);
    setSize(ROWS * BLOCK_SIZE, COLS * BLOCK_SIZE);
    setBackground(Color.GREEN);

    addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {
    System.exit(0);
    }

    }); new Thread(new PaintThread()).start();
    addKeyListener(new KeyMonity());
    setVisible(true);
    }

    public void paint(Graphics g) {
    Color c = g.getColor();
    g.setColor(Color.GRAY);
    g.fillRect(0, 0, ROWS * BLOCK_SIZE, COLS * BLOCK_SIZE);
    g.setColor(Color.DARK_GRAY);
    for(int i=1;i<COLS;i++) {
    g.drawLine(0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS, BLOCK_SIZE * i);
    }
    for(int i=1;i<COLS;i++) {
    g.drawLine(BLOCK_SIZE * i, 0,BLOCK_SIZE * i, BLOCK_SIZE * COLS);
    }
    s.draw(g);
    g.setColor(c);
    }

    @Override
    public void update(Graphics arg0) {
    if(offImage == null) {
    offImage = this.createImage(ROWS * BLOCK_SIZE, COLS * BLOCK_SIZE);
    }
    Graphics goff = offImage.getGraphics();
    paint(goff);
    arg0.drawImage(offImage, 0, 0, null);
    }

    private class PaintThread implements Runnable {
    public void run() {
    while(true) {
    repaint();
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

    } private class KeyMonity extends KeyAdapter { @Override
    public void keyPressed(KeyEvent arg0) {
    s.keyPressed(arg0);
    }

    }
    }
      

  6.   

    public enum Dir {
    U,D,L,R
    }
    一共就这三个类
      

  7.   

    addHead时,如果d没有走进case里,那么n就是null,那么
    n.next = head; //这里就挂了
      

  8.   

    public void addHead() {
    Node n = null;
    switch(d) {
    case U :
    n = new Node(head.x, head.y-1);
    break;
    case D :
    n = new Node(head.x, head.y+1);
    break;
    case L :
    n = new Node(head.x-1, head.y);
    break;
    case R :
    n = new Node(head.x+1, head.y);
    break;
    }
    if(n == null) return;
    n.next = head;
    head.prev = n;
    head = n;
    }我把那段该成这样 但还是不行
      

  9.   

    private void move() {
    addHead();
    delTail();
    } private void delTail() {
    if(tail.prev == null) return;
    tail = tail.prev;
    tail.next =null;
    }
    加上这一段程序就Ok啦 但不知道是什么原因