2013-10-03 42 views
-3

我試圖編譯這個程序,它可以在這裏找到,Java程序......意外的錯誤

http://zetcode.com/tutorials/javagamestutorial/breakout/

但我收到錯誤,

比賽共分七文件。

Commons.java

package breakout; 

public interface Commons { 
    public static final int WIDTH = 300; 
    public static final int HEIGTH = 400; 
    public static final int BOTTOM = 390; 
    public static final int PADDLE_RIGHT = 250; 
    public static final int BALL_RIGHT = 280; 

}

Sprite.java

package breakout; 

import java.awt.Image; 
import java.awt.Rectangle; 

public class Sprite { 

    protected int x; 
    protected int y; 
    protected int width; 
    protected int heigth; 
    protected Image image; 


    public void setX(int x) { 
     this.x = x; 
    } 

    public int getX() { 
     return x; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

    public int getY() { 
     return y; 
    } 

    public int getWidth() { 
     return width; 
    } 

    public int getHeight() { 
     return heigth; 
    } 

    Image getImage() 
    { 
     return image; 
    } 

    Rectangle getRect() 
    { 
     return new Rectangle(x, y, 
      image.getWidth(null), image.getHeight(null)); 
    } 
} 

Brick.java

package breakout; 

import javax.swing.ImageIcon; 


public class Brick extends Sprite { 

    String brickie = "../images/brickie.png"; 

    boolean destroyed; 


    public Brick(int x, int y) { 
     this.x = x; 
     this.y = y; 

     ImageIcon ii = new ImageIcon(this.getClass().getResource(brickie)); 
     image = ii.getImage(); 

     width = image.getWidth(null); 
     heigth = image.getHeight(null); 

     destroyed = false; 
    } 

    public boolean isDestroyed() 
    { 
     return destroyed; 
    } 

    public void setDestroyed(boolean destroyed) 
    { 
     this.destroyed = destroyed; 
    } 

} 

Ball.java

package breakout; 

import javax.swing.ImageIcon; 


public class Ball extends Sprite implements Commons { 

    private int xdir; 
    private int ydir; 

    protected String ball = "../images/ball.png"; 

    public Ball() { 

    xdir = 1; 
    ydir = -1; 

    ImageIcon ii = new ImageIcon(this.getClass().getResource(ball)); 
    image = ii.getImage(); 

    width = image.getWidth(null); 
    heigth = image.getHeight(null); 

    resetState(); 
    } 


    public void move() 
    { 
     x += xdir; 
     y += ydir; 

     if (x == 0) { 
     setXDir(1); 
     } 

     if (x == BALL_RIGHT) { 
     setXDir(-1); 
     } 

     if (y == 0) { 
     setYDir(1); 
     } 
    } 

    public void resetState() 
    { 
     x = 230; 
     y = 355; 
    } 

    public void setXDir(int x) 
    { 
     xdir = x; 
    } 

    public void setYDir(int y) 
    { 
     ydir = y; 
    } 

    public int getYDir() 
    { 
     return ydir; 
    } 
} 

Paddle.java

package breakout; 

import java.awt.event.KeyEvent; 

import javax.swing.ImageIcon; 


public class Paddle extends Sprite implements Commons { 

    String paddle = "../images/paddle.png"; 

    int dx; 

    public Paddle() { 

     ImageIcon ii = new ImageIcon(this.getClass().getResource(paddle)); 
     image = ii.getImage(); 

     width = image.getWidth(null); 
     heigth = image.getHeight(null); 

     resetState(); 

    } 

    public void move() { 
     x += dx; 
     if (x <= 2) 
      x = 2; 
     if (x >= Commons.PADDLE_RIGHT) 
      x = Commons.PADDLE_RIGHT; 
    } 

    public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = -2; 

     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = 2; 
     } 
    } 

    public void keyReleased(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = 0; 
     } 
    } 

    public void resetState() { 
     x = 200; 
     y = 360; 
    } 
} 

Board.java

package breakout; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Point; 
import java.awt.Toolkit; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JPanel; 


public class Board extends JPanel implements Commons { 

    Image ii; 
    Timer timer; 
    String message = "Game Over"; 
    Ball ball; 
    Paddle paddle; 
    Brick bricks[]; 

    boolean ingame = true; 
    int timerId; 


    public Board() { 

     addKeyListener(new TAdapter()); 
     setFocusable(true); 

     bricks = new Brick[30]; 
     setDoubleBuffered(true); 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(new ScheduleTask(), 1000, 10); 
    } 

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

    public void gameInit() { 

     ball = new Ball(); 
     paddle = new Paddle(); 


     int k = 0; 
     for (int i = 0; i < 5; i++) { 
      for (int j = 0; j < 6; j++) { 
       bricks[k] = new Brick(j * 40 + 30, i * 10 + 50); 
       k++; 
      } 
     } 
    } 


    public void paint(Graphics g) { 
     super.paint(g); 

     if (ingame) { 
      g.drawImage(ball.getImage(), ball.getX(), ball.getY(), 
         ball.getWidth(), ball.getHeight(), this); 
      g.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(), 
         paddle.getWidth(), paddle.getHeight(), this); 

      for (int i = 0; i < 30; i++) { 
       if (!bricks[i].isDestroyed()) 
        g.drawImage(bricks[i].getImage(), bricks[i].getX(), 
           bricks[i].getY(), bricks[i].getWidth(), 
           bricks[i].getHeight(), this); 
      } 
     } else { 

      Font font = new Font("Verdana", Font.BOLD, 18); 
      FontMetrics metr = this.getFontMetrics(font); 

      g.setColor(Color.BLACK); 
      g.setFont(font); 
      g.drawString(message, 
         (Commons.WIDTH - metr.stringWidth(message))/2, 
         Commons.WIDTH/2); 
     } 


     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

    private class TAdapter extends KeyAdapter { 

     public void keyReleased(KeyEvent e) { 
      paddle.keyReleased(e); 
     } 

     public void keyPressed(KeyEvent e) { 
      paddle.keyPressed(e); 
     } 
    } 


    class ScheduleTask extends TimerTask { 

     public void run() { 

      ball.move(); 
      paddle.move(); 
      checkCollision(); 
      repaint(); 

     } 
    } 

    public void stopGame() { 
     ingame = false; 
     timer.cancel(); 
    } 


    public void checkCollision() { 

     if (ball.getRect().getMaxY() > Commons.BOTTOM) { 
      stopGame(); 
     } 

     for (int i = 0, j = 0; i < 30; i++) { 
      if (bricks[i].isDestroyed()) { 
       j++; 
      } 
      if (j == 30) { 
       message = "Victory"; 
       stopGame(); 
      } 
     } 

     if ((ball.getRect()).intersects(paddle.getRect())) { 

      int paddleLPos = (int)paddle.getRect().getMinX(); 
      int ballLPos = (int)ball.getRect().getMinX(); 

      int first = paddleLPos + 8; 
      int second = paddleLPos + 16; 
      int third = paddleLPos + 24; 
      int fourth = paddleLPos + 32; 

      if (ballLPos < first) { 
       ball.setXDir(-1); 
       ball.setYDir(-1); 
      } 

      if (ballLPos >= first && ballLPos < second) { 
       ball.setXDir(-1); 
       ball.setYDir(-1 * ball.getYDir()); 
      } 

      if (ballLPos >= second && ballLPos < third) { 
       ball.setXDir(0); 
       ball.setYDir(-1); 
      } 

      if (ballLPos >= third && ballLPos < fourth) { 
       ball.setXDir(1); 
       ball.setYDir(-1 * ball.getYDir()); 
      } 

      if (ballLPos > fourth) { 
       ball.setXDir(1); 
       ball.setYDir(-1); 
      } 


     } 


     for (int i = 0; i < 30; i++) { 
      if ((ball.getRect()).intersects(bricks[i].getRect())) { 

       int ballLeft = (int)ball.getRect().getMinX(); 
       int ballHeight = (int)ball.getRect().getHeight(); 
       int ballWidth = (int)ball.getRect().getWidth(); 
       int ballTop = (int)ball.getRect().getMinY(); 

       Point pointRight = 
        new Point(ballLeft + ballWidth + 1, ballTop); 
       Point pointLeft = new Point(ballLeft - 1, ballTop); 
       Point pointTop = new Point(ballLeft, ballTop - 1); 
       Point pointBottom = 
        new Point(ballLeft, ballTop + ballHeight + 1); 

       if (!bricks[i].isDestroyed()) { 
        if (bricks[i].getRect().contains(pointRight)) { 
         ball.setXDir(-1); 
        } 

        else if (bricks[i].getRect().contains(pointLeft)) { 
         ball.setXDir(1); 
        } 

        if (bricks[i].getRect().contains(pointTop)) { 
         ball.setYDir(1); 
        } 

        else if (bricks[i].getRect().contains(pointBottom)) { 
         ball.setYDir(-1); 
        } 

        bricks[i].setDestroyed(true); 
       } 
      } 
     } 
    } 
} 

和決賽,

Breakout.java

package breakout; 

import javax.swing.JFrame; 

public class Breakout extends JFrame { 

    public Breakout() 
    { 
     add(new Board()); 
     setTitle("Breakout"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(Commons.WIDTH, Commons.HEIGTH); 
     setLocationRelativeTo(null); 
     setIgnoreRepaint(true); 
     setResizable(false); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Breakout(); 
    } 
} 

但我得到這些錯誤,

C:\jdk1.3.0_02\bin>javac Breakout.java 
Breakout.java:9: cannot resolve symbol 
symbol : class Board 
location: class breakout.Breakout 
     add(new Board()); 
       ^
Breakout.java:12: cannot resolve symbol 
symbol : variable Commons 
location: class breakout.Breakout 
     setSize(Commons.WIDTH, Commons.HEIGTH); 
       ^
Breakout.java:12: cannot resolve symbol 
symbol : variable Commons 
location: class breakout.Breakout 
     setSize(Commons.WIDTH, Commons.HEIGTH); 
          ^
Breakout.java:13: cannot resolve symbol 
symbol : method setLocationRelativeTo (<null>) 
location: class breakout.Breakout 
     setLocationRelativeTo(null); 
     ^
Breakout.java:14: cannot resolve symbol 
symbol : method setIgnoreRepaint (boolean) 
location: class breakout.Breakout 
     setIgnoreRepaint(true); 
     ^
5 errors 

C:\jdk1.3.0_02\bin> 

我不明白是什麼導致的問題,因爲我沒有在原代碼中做任何更改。

+0

你怎麼編譯?使用javac?或者使用像eclipse這樣的ide?您的問題肯定是因爲您沒有將.java文件放入您的類路徑中。更簡單的方法是在Eclipse/netbeans /其他IDE中導入IDE中的項目。 – Rudy

+0

爲了您自己的理智,我認真地建議您弄個IDE – MadProgrammer

+0

@ruby看看輸出'C:\ jdk1.3.0_02 \ bin> javac Breakout.java' - 很容易錯過所有的噪音 – MadProgrammer

回答

-1

這是因爲你的java文件不在「breakout」目錄下。

你需要把他們在這樣的目錄,然後編譯它們從上述目錄之外:

C:\jdk1.3.0_02\bin>javac breakout\Breakout.java 
1

這是因爲你運行Breakout.java但是編譯器不知道它也需要考慮編譯Broad.java和其他文件。

您有2個選項來解決這個問題:

  1. 下載IDE,使其更容易添加的類路徑。 (推薦) 您可以安裝Eclipse/Netbeans /其他IDE並將所有java文件導入項目並運行Breakout.java。

  2. 使用-sourcepath參數運行javac。 這不是直截了當的。但你最好看看javac command documentation

    實施例:

    的javac -d C:\ projectsCC \ ETL \ XTRACT \ ADM \共同\類-sourcepath C:\ projectsCC \ ETL \ XTRACT \ ADM \共同\ SRC C:\ IBM \ esmrt \ ADM \共同\ Conductor.java

-sourcepath源路徑指定要搜索的類或接口定義的源代碼路徑。與用戶類路徑一樣,源 路徑條目以分號(;)分隔,可以是目錄, JAR歸檔或ZIP歸檔。如果使用包,目錄或歸檔中的本地路徑 名稱必須反映包名稱。 注意:通過類路徑找到的類可能會自動進行 重新編譯(如果它們的源也被找到)。請參閱搜索 類型。

+0

OP應該使用-cp參數指定什麼? –

+0

我的意思是,由於文件位於當前目錄中,並且自-cp未指定時,當前目錄位於類路徑中,所以我沒有看到您的答案如何解決問題。 –

+0

@EtienneMiret,它應該是-sourcepath(而不是classpath)。 – Rudy