2015-06-09 94 views
0

目前我正在學習計算機科學和我的老師要我做一個蛇遊戲陣列。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) { 
    } 
} 
+5

這是從來沒有一個好主意,盲目跟隨別人的代碼 - 從一個老鄉CS的學生。 – Gosu

+0

你第一次遇到你的朋友的代碼時出錯了。 –

+0

這麼多的幻數... –

回答

2

有幾件事情:

  • 您正在使用一個計時器,但你在計時器正在把項目沒有run()方法......這不是如何計時器工作(請參考最後一點爲什麼)。
  • 您正在重繪整個屏幕每一次你打勾。不僅如此荒謬,而且當你長出身體時,這很可能是你前面提到的滯後的原因。修復這將確保您遇到一點到現在增長之間的滯後(雖然,你仍然需要通過改變蛇的速度在以後的生長來補償,這也將讓遊戲更加困難,因爲你去的,就像真正的蛇)。 paint()方法的這種用法可以歸因於與最後一點相同的推理。
  • 你帶了別人的密碼。不要使用不屬於你的代碼 - 它可能工作,並且你很好,或者你可能與其他人有相同的錯誤,現在你已經很好地解釋了爲什麼你有複製其他學生的代碼。

總而言之:如果您想借用代碼,請不要從與您處於相同課程的人借用代碼。最後,查看Java中的Snake遊戲的一些示例。我相信你會發現一些遇到類似問題的人,你可能會從中學習。我希望這可以幫助你,祝你好運!