Java蛇游戏体不会增长

时间:2015-06-09 01:53:21

标签: java

目前我正在攻读计算机科学,我的老师希望我用数组进行蛇形游戏。

我的代码与我朋友的代码完全相同,但它只会长出一个体长而且不会长得更长,在食用食物后它开始减慢移动蛇的速度。我不确定我哪里出错了请帮忙。谢谢。

以下是代码:

public class Main extends JPanel implements KeyListener, ActionListener {
    private static final long serialVersionUID = 1L;
    static int dir;
    static int i;
    static int x[] = new int[200]; // Decleare Array of snake on x coordinate
    static int y[] = new int[200]; // Decleare Array of snake on y coordinate
    static int taillength = 1;
    static int sxinc = 20, syinc = 20; // Speed of moving snake
    static int fx = 100, fy = 100; // Declare the position of where food at
    static int f2x = 300, f2y = 300; // Declare the position of where food2 at
    static int fmx = 300, fmy = 100; // Declare the position of where food3 at
    static int score = 0; // Create Score Counter
    static int width = 745, height = 489; // Declare the size of JPanel
    static int nsx, nsy; // The new value of the snake movement
    static int csx = 20, csy = 20; // The value to add/minus on the number to
    static BufferedImage background = null;
    static JFrame f;
    static JFrame g;

    public Main() {
        addKeyListener(this);
    }

    public void addNotify() {
        super.addNotify();
        requestFocus();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(background, 0, 0, width, height, this);
        g.setColor(Color.GREEN);
        g.fillRect(fx, fy, 20, 20);
        g.setFont(new Font("Times New Roman", Font.BOLD, 15));
        g.setColor(Color.GREEN);
        g.drawString("GREEN - Add 1 body length, add 1 score", 0, 429);
        g.setColor(Color.BLUE);
        g.fillRect(f2x, f2y, 20, 20);
        g.setFont(new Font("Times New Roman", Font.BOLD, 15));
        g.setColor(Color.BLUE);
        g.drawString("BLUE - Add 2 body length, add 2 score", 0, 444);
        g.setColor(Color.CYAN);
        g.fillRect(fmx, fmy, 20, 20);
        g.setFont(new Font("Times New Roman", Font.BOLD, 15));
        g.setColor(Color.CYAN);
        g.drawString("CYAN - Minus 1 body length, add 1 score", 0, 459);
        g.setColor(Color.RED);
        for (int j = 0; j < x.length && j < taillength; j++) {
            g.fillRect(x[j], y[j], 20, 20);
            g.setColor(Color.ORANGE);
        }
        g.fillRect(x[0], y[0], 20, 20);
        g.setColor(Color.RED);
        g.setFont(new Font("Times New Roman", Font.BOLD, 25));
        g.setColor(Color.WHITE);
        g.drawString("Score : " + score, 305, 459);

    }

    public void snakenew() {
        for (int i = 0; i < x.length; i++) {
            x[i] = 0;
            y[i] = 0;
        }
    }

    public static void main(String a[]) {
        x[0] = 300;
        y[0] = 220;
        try { // Import Background
            background = ImageIO.read(new File("H:/shutterstock_12730534.jpg"));
        } catch (IOException e) {
        }
        Main p = new Main();
        g = new JFrame();
        g.add(p);
        g.setSize(200, 300);
        g.setVisible(true);
        g.setResizable(false);
        f = new JFrame();
        f.add(p);
        f.setSize(width, height);
        f.setVisible(true);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Timer t = new Timer(60, p);
        t.start();
    }

    public void actionPerformed(ActionEvent e) {
        if ((x[0] + 20 > width) || (x[0] < 0) || (y[0] + 40 > height)
                || (y[0] < 0)) { // Game over when hit the wall
            JOptionPane.showMessageDialog(null, "You hit the wall!", "Game",
                    JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
        }

        if ((taillength > 1) && (x[i] != x[0]) && (y[i] != y[0])) { // Game over
                                                                    // when
                                                                    // touch you
                                                                    // snake
                                                                    // body
            if ((x[0] == x[i]) & (y[0] == y[i])) {
                JOptionPane.showMessageDialog(null, "You ran into yourself!",
                        "Game", JOptionPane.INFORMATION_MESSAGE);
            }
        }

        if (dir == KeyEvent.VK_UP) {
            if (y[0] == y[taillength]) {
                y[0] = y[0] - syinc;
            }
        }

        else if (dir == KeyEvent.VK_DOWN) {
            if (y[0] == y[taillength]) {
                y[0] = y[0] + syinc;
            }
        }

        else if (dir == KeyEvent.VK_LEFT) {
            if (x[0] == x[taillength]) {
                x[0] = x[0] - sxinc;
            }
        }

        else if (dir == KeyEvent.VK_RIGHT) {
            if (x[0] == x[taillength]) {
                x[0] = x[0] + sxinc;
            }
        }
        if (dir == KeyEvent.VK_K) {
            if ((score > 6) && (taillength > 5)) {
                taillength = taillength - 5;
                score = score - 7;
            }
        }

        if ((x[0] == fx) && (y[0] == fy)) { // Food Score and random food
            fx = (int) (Math.random() * 37) * 20;
            fy = (int) (Math.random() * 25) * 20;
            taillength++;
            score++;
        }

        if ((x[0] == f2x) && (y[0] == f2y)) {
            f2x = (int) (Math.random() * 37) * 20;
            f2y = (int) (Math.random() * 25) * 20;
            taillength = taillength + 2;
            score = score + 2;
        }

        if ((x[0] == fmx) && (y[0] == fmy)) {
            if (taillength > 0) {
                fmx = (int) (Math.random() * 37) * 20;
                fy = (int) (Math.random() * 25) * 20;
                taillength--;
                score++;
            }
        }

        for (i = taillength; i > 0; i--) {
            x[i] = x[(i - 1)];
            y[i] = y[(i - 1)];
        }

        f.repaint();
    }

    public void keyPressed(KeyEvent ke) {
        dir = ke.getKeyCode();
    }

    public void keyReleased(KeyEvent arg0) {
    }

    public void keyTyped(KeyEvent arg0) {
    }
}

1 个答案:

答案 0 :(得分:2)

一些事情:

  • 您正在使用计时器,但您在计时器中放置的项目没有run()方法......这不是计时器的工作原理(请参考最后一点说明原因)。
  • 每次勾选时都会重新绘制整个屏幕。这不仅是荒谬的,当你长出身体时,它很可能是你上述滞后的原因。修复此问题将确保您在增长之间几乎没有任何延迟(尽管如此,您仍然需要通过改变蛇的速度来弥补以后的增长;这也会让游戏变得更加困难,就像真实一样蛇)。 paint()方法的这种用法可归因于与最后一点相同的推理。
  • 你拿了别人的代码。不要使用不属于你的代码 - 它可能有效,而你很好,或者你可能和另一个人有同样的错误,现在你已经得到了很高兴解释为什么你有其他学生的复制代码。

总之:如果您想借用代码,请不要向与您在同一课程中的人员借用代码。最后,查看Java中Snake游戏的一些示例。我确定你会发现一些经历过类似问题的人,你可能会从中学到什么。我希望这对你有所帮助,祝你好运!