本人在家练习j2se写贪吃蛇源代码!现在遇到了问题!我看过别人写的源代码他的算法思维跟我的不一样。我现在遇到一个问题希望大家能帮我解决!先说一下我的源代码思路:用一个集合类装构成蛇身体的方块当按下方向键时向那个方向添加一个方块同时remove蛇尾的方块,关于这一块我的程序写好了。但问题也来了现在这只蛇不会自己动就是不按方向键他就不动。请高手给我一点提示我该怎么让这只蛇在不按下方向键的时候也动起来!谢谢了!我简单讲一下我的源代码,我在启动了窗口之后添加了按键监听:如果是按下键则在开始蛇头添加一个方块依次类推其他按键,这是片段代码其中snakes是装蛇身体方块的集合。DIRECTION是枚举里面装的方向。dir是一个DIRECTION的变量。我现在想让蛇自动动起来。可是发现要想动蛇就必须按按键无法像真正的贪吃蛇那样自动动起来!我该怎么让蛇活动不用按键就活动起来!请高手们赐教!//这是主程序类
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;
import java.util.ArrayList;
import java.util.List;
public class Prom extends Frame{
    Direction dir = Direction.r;
    List<Snake> snakes = new ArrayList<Snake>();
    Image offScreenImage = null;
    public static void main(String args[]){
        Prom prom = new Prom();
        prom.LaunchFrame();
    }//主方法
    public void update(Graphics g) {
        if (offScreenImage == null) {
            offScreenImage = this.createImage(800, 600);
        }
        Graphics gOffScreen = offScreenImage.getGraphics();
        Color c = gOffScreen.getColor();
        gOffScreen.setColor(Color.GREEN);
        gOffScreen.fillRect(0, 0, 800, 600);
        gOffScreen.setColor(c);
        paint(gOffScreen);
        g.drawImage(offScreenImage, 0, 0, null);
    }//双缓冲机制让蛇显示的时候不闪,对算法没有影响这一节看不看无所谓
    public void LaunchFrame(){
        setSize(800,600);
        setBackground(Color.green);
        setVisible(true);
        setTitle("Snake Game");
        new Thread(new RP()).start();
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        addKeyListener(new KeyControl());
        snakes.add(new Snake(90,90));
        snakes.add(new Snake(110,90));
        snakes.add(new Snake(130,90));//给最初的蛇添加三个方块
    }//起窗口对算法也没有多大影响。
    public void paint(Graphics g){
        for(int i = 0; i < snakes.size(); i++){
            Snake s = snakes.get(i);
            s.draw(g);
        }
    }//取出集合snakes中的每一个方块并调用draw方法显示蛇的身体
    public class RP implements Runnable{
        public void run(){
            while(true){
                repaint();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }//不断调用repaint方法让蛇动起来
    public class KeyControl extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            int a = e.getKeyCode();
            switch(a){
            case KeyEvent.VK_UP:
                dir = Direction.u;
                break;
            case KeyEvent.VK_DOWN:
                dir = Direction.d;
                break;
            case KeyEvent.VK_LEFT:
                dir = Direction.l;
                break;
            case KeyEvent.VK_RIGHT:
                dir = Direction.r;
                break;
            }
            move();
        }
    }//按键监听并将根据监听得到的按键值给dir(方向)赋值,根据赋值移动蛇
    public void move() {        Snake s = snakes.get(snakes.size() - 1);
        if (dir == Direction.u) {
            snakes.add(new Snake(s.x, s.y - 20));
        }
        if (dir == Direction.d) {
            snakes.add(new Snake(s.x, s.y + 20));
        }
        if (dir == Direction.l) {
            snakes.add(new Snake(s.x - 20, s.y));
        }
        if (dir == Direction.r) {
            snakes.add(new Snake(s.x + 20, s.y));
        }
        snakes.remove(snakes.get(0));
    }//我的核心想法不断去除构成蛇身体的最后一块方块并根据移动方法往蛇的头部添加方块
}
这是snake类
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
public class Snake {
    int x;
    int y;
    Snake(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,y,20,20);
        g.setColor(c);
    }
}
这是枚举类
public enum Direction {
    u,d,l,r
}

解决方案 »

  1.   

    回复楼上的大哥。我刚刚才开始写j2se项目,至于分类还不熟。我现在主要想知道一些算法方面的提示!
      

  2.   

    public class KeyControl 里面的keyPressed(KeyEvent e)只负责改变dir。不要调用move(),move在public class RP 的run方法,repaint()前调用
      

  3.   

    new Thread(new RP()).start()最后放在LaunchFrame()最后面,等所有准备工作做好后再启动线程