2013-03-05 76 views
2

附上一些源代碼爲貪吃蛇的遊戲,我想創建:類的Java蛇遊戲沒有編制

package Snake; 

import java.awt.*; 
import Snake.GameBoard.*; 

public enum TileType { 
    SNAKE(Color.GREEN), 
    FRUIT(Color.RED), 
    EMPTY(null), 

    private Color tileColor; 

    private TileType(Color color) { 
    this.tileColor = color; 
    } 

    // @ return 

    public Color getColor() { 
    return tileColor; 
    } 

    private TileType[] tiles; 

    public void GameBoard() { 
    tiles = new TileType[MAP_SIZE * MAP_SIZE]; 
    resetBoard(); 
    } 

    // Reset all of the tiles to EMPTY. 

    public void resetBoard() { 
    for(int i = 0; i < tiles.length; i++) { 
     tiles[i] = TileType.EMPTY; 
    } 
    } 

    // @ param x The x coordinate of the tile. 
    // @ param y The y coordinate of the tile. 
    // @ return The type of tile. 

    public TileType getTile(int x, int y) { 
    return tiles[y * MAP_SIZE + x]; 
    } 

    /** 
    * Draws the game board. 
    * @param g The graphics object to draw to. 
    */ 
    public void draw(Graphics2D g) { 

    //Set the color of the tile to the snake color. 
    g.setColor(TileType.SNAKE.getColor()); 

    //Loop through all of the tiles. 
    for(int i = 0; i < MAP_SIZE * MAP_SIZE; i++) { 

     //Calculate the x and y coordinates of the tile. 
     int x = i % MAP_SIZE; 
     int y = i/MAP_SIZE; 

     //If the tile is empty, so there is no need to render it. 
     if(tiles[i].equals(TileType.EMPTY)) { 
     continue; 
     } 

     //If the tile is fruit, we set the color to red before rendering it. 
     if(tiles[i].equals(TileType.FRUIT)) { 
     g.setColor(TileType.FRUIT.getColor()); 
     g.fillOval(x * TILE_SIZE + 4, y * TILE_SIZE + 4, TILE_SIZE - 8, TILE_SIZE - 8); 
     g.setColor(TileType.SNAKE.getColor()); 
     } else { 
     g.fillRect(x * TILE_SIZE + 1, y * TILE_SIZE + 1, TILE_SIZE - 2, TILE_SIZE - 2); 
     } 
    } 
    } 
}  

很多這工作得很好。然而,它說'私人顏色tileColor;',我得到'我得到'令牌tileColor'的語法錯誤,請刪除令牌',但是當我刪除它會導致更多的紅色在我的IDE(我使用Eclipse)。

而且,只要MAP_SIZE和TILE_SIZE出現,它說,儘管事實上它們存在於下面的類不能被解析爲一個變量:

包蛇;

public class GameBoard { 
    public static final int TILE_SIZE = 25; 
    public static final int MAP_SIZE = 20; 
} 

在同一個包中,因此編譯器應該很容易找到。

+0

看起來'TILE_SIZE'和'MAP_SIZE'屬於不同的類('GameBoard')。嘗試'GameBoard.TILE_SIZE'和'GameBoard.MAP_SIZE'。 – mostruash 2013-03-05 21:29:46

+0

嘗試將'EMPTY(null)'改爲'EMPTY(null);'(注意從逗號變爲分號)。 – OldCurmudgeon 2013-03-05 23:20:19

回答

7

你需要一個分號這裏:

SNAKE(Color.GREEN), 
FRUIT(Color.RED), 
EMPTY(null); <-- 

這是必需的enums含有不是簡單的常量定義更多。從docs

當有字段和方法時,枚舉常量列表必須以分號結尾。


MAP_SIZETILE_SIZE,因爲他們在不同的類存在不能得到解決,GameBoard。這裏有2種選擇:

  • 使用合格的名稱,即GameBoard.MAP_SIZE & GameBoard.TILE_SIZE

  • 作爲enums可以實現接口:請GameBoard接口實施的界面。這些變量將成爲成員變量。
+0

謝謝,但我仍然得到MAP_SIZE和TILE_SIZE不能解析爲變量。我該怎麼分類呢? – 2013-03-05 21:28:30

+0

你需要把他們的類名放在他們面前,像這樣: GameBoard.MAP_SIZE – 2013-03-05 21:30:12

+0

好吧我剛剛試過'公共枚舉TileType實現GameBoard {'。我現在已經使GameBoard成爲一個界面,它說'類型GameBoard不能是TileType的超級界面;一個超級接口必須是一個接口'。這有什麼辦法嗎?或者我誤解你的建議? – 2013-03-05 22:07:54