Snake.javaimport java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Snake implements KeyListener{
int theLengthOfSnake;
int hdirection,sdirection;
int headx ,heady;
int snailx ,snaily;

static int[][] s = new int [16][16];

static Drawpanel drawpanel = new Drawpanel();

static int record = 1;

int[] x = {4,4,4,hdirection};

public Snake(){
headx = 3;
heady = 0;
snailx = 1;
snaily = 0;

s[0][1] = s[0][2] = s[0][3] = 1;
theLengthOfSnake = 3;
hdirection = 4;
sdirection = 4;
}

public static void main(String[] args){
Snake snake = new Snake();
JFrame frame = new JFrame("snake");

frame.getContentPane().add(BorderLayout.CENTER,drawpanel);
frame.setVisible(true);
frame.setSize(600,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.addKeyListener(snake);

while(true){
snake.move();
}
}

public void move(){

switch(hdirection){
case 1:heady = heady-1;break;//将对应位置设为1
case 2:headx = headx-1;break;
case 3:heady = heady+1;break;
case 4:headx = headx+1;break;
}

switch(sdirection){
case 1:snaily = snaily-1;break;
case 2:snailx = snailx-1;break;
case 3:snaily = snaily+1;break;
case 4:snailx = snailx+1;break;
}

setTheSnail();

try{
Thread.sleep(500);
}catch(Exception e){}


drawpanel.getdata(record,snailx,snaily,headx,heady);
drawpanel.repaint();


record++;
}


public void setTheSnail(){
for(int i=0;i<3;i++){
x[i] = x[i+1];
}

x[3] = hdirection;
sdirection = x[0];
}
//写一个测试是否失败的类;


@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
switch(e.getKeyCode()){
case KeyEvent.VK_UP:hdirection = 1;
case KeyEvent.VK_LEFT:hdirection = 2;
case KeyEvent.VK_DOWN:hdirection = 3;
case KeyEvent.VK_RIGHT:hdirection = 4;
}
} @Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
switch(e.getKeyCode()){
case KeyEvent.VK_UP:hdirection = 1;
case KeyEvent.VK_LEFT:hdirection = 2;
case KeyEvent.VK_DOWN:hdirection = 3;
case KeyEvent.VK_RIGHT:hdirection = 4;
}
} @Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
switch(e.getKeyCode()){
case KeyEvent.VK_UP:hdirection = 1;
case KeyEvent.VK_LEFT:hdirection = 2;
case KeyEvent.VK_DOWN:hdirection = 3;
case KeyEvent.VK_RIGHT:hdirection = 4;
}
}
}//碰到蛋时,尾部的move不会产生,数组头部加一个与原位置相同的数;drawpanel.javaimport javax.swing.*;
import java.awt.*;public class Drawpanel extends JPanel{
int x,m,n,i,j;

public void getdata(int x,int m,int n,int i,int j){
this.x = x;
this.m = m;
this.n = n;
this.i = i;
this.j = j;
}

public void paintComponent(Graphics g){
while(x <= 3){
g.setColor(Color.white);
g.fillRect(0,0,this.getWidth(),this.getHeight());

g.setColor(Color.black);
g.fillRect(160,0,120,40);
}

g.setColor(Color.black);
g.fillRect(i*40,j*40,40,40);
g.setColor(Color.white);
g.fillRect(m*40,n*40,40,40);

}


}

解决方案 »

  1.   

    应该是线程的文件,你没有新建一个线程,相当于你的main函数都一直没有停止掉。
    public class Snake implements KeyListener, Runnable{    //加一个线程借口//实现线程借口的方法
    public void run() {
    while(true){
        move();//就是说这个线程是持续处理蛇移动的
    }
    }原来死循环调用move方法的地方换成
    Thread t = new Thread(this);
    t.start();可能会有些异常处理的问题。你先试试吧
      

  2.   

    是case后面忘加break了import java.awt.BorderLayout;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JFrame;
    public class Snake implements KeyListener{
    int theLengthOfSnake;
    int hdirection,sdirection;
    int headx ,heady;
    int snailx ,snaily;

    static int[][] s = new int [16][16];

    static Drawpanel drawpanel = new Drawpanel();

    static int record = 1;

    int[] x = {4,4,4,hdirection};

    public Snake(){
    headx = 3;
    heady = 0;
    snailx = 1;
    snaily = 0;

    s[0][1] = s[0][2] = s[0][3] = 1;
    theLengthOfSnake = 3;
    hdirection = 4;
    sdirection = 4;
    }

    public static void main(String[] args){
    Snake snake = new Snake();
    JFrame frame = new JFrame("snake");

    frame.getContentPane().add(BorderLayout.CENTER,drawpanel);
    frame.setVisible(true);
    frame.setSize(600,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.addKeyListener(snake);

    while(true){
    snake.move();
    }
    }

    public void move(){

    switch(hdirection){
    case 1:heady = heady-1;break;//将对应位置设为1
    case 2:headx = headx-1;break;
    case 3:heady = heady+1;break;
    case 4:headx = headx+1;break;
    }

    switch(sdirection){
    case 1:snaily = snaily-1;break;
    case 2:snailx = snailx-1;break;
    case 3:snaily = snaily+1;break;
    case 4:snailx = snailx+1;break;
    }

    setTheSnail();

    try{
    Thread.sleep(500);
    }catch(Exception e){}


    drawpanel.getdata(record,snailx,snaily,headx,heady);
    drawpanel.repaint();


    record++;
    }


    public void setTheSnail(){
    for(int i=0;i<3;i++){
    x[i] = x[i+1];
    }

    x[3] = hdirection;
    sdirection = x[0];
    }
    //写一个测试是否失败的类;


    @Override
    public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
    switch(e.getKeyCode()){
    case KeyEvent.VK_UP:hdirection = 1;break;//case后面没有加break
    case KeyEvent.VK_LEFT:hdirection = 2;break;
    case KeyEvent.VK_DOWN:hdirection = 3;break;
    case KeyEvent.VK_RIGHT:hdirection = 4;break;
    }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
    switch(e.getKeyCode()){
    case KeyEvent.VK_UP:hdirection = 1;break;
    case KeyEvent.VK_LEFT:hdirection = 2;break;
    case KeyEvent.VK_DOWN:hdirection = 3;break;
    case KeyEvent.VK_RIGHT:hdirection = 4;break;
    }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub
    switch(e.getKeyCode()){
    case KeyEvent.VK_UP:hdirection = 1;break;
    case KeyEvent.VK_LEFT:hdirection = 2;break;
    case KeyEvent.VK_DOWN:hdirection = 3;break;
    case KeyEvent.VK_RIGHT:hdirection = 4;break;
    }
    }
    }//碰到蛋时,尾部的move不会产生,数组头部加一个与原位置相同的数;