簡體   English   中英

對安排班級有幫助嗎?

[英]Some help structuring my class?

我正在嘗試為嘗試用Java構建的棋盤游戲創建一個名為Terrain的類,但是我將嘗試使該帖子盡可能通用,以便可以用任何OOP語言以偽代碼進行解釋。

該游戲包含36個十六進制形狀的圖塊,每個圖塊是一個不同的地形。 地形有8種類型,例如沼澤,森林,山脈等。每個地形都可以控制您進行多少移動,還可以容納生物和建築物(這是兩個不同的類),或者至少具有與特定地形相關聯的生物和建築物。

我不確定我是否希望枚舉代表8種類型的地形,或者是否有必要。

從本質上講,我想要對此類進行處理的內容是這樣的:

Terrain t0 = new Swamp();
Terrain t1 = new Forest();

然后,我希望能夠將每個地形的鄰居與該特定地形相關聯,如下所示:

//terrain 0, neighbour 0
t0.n0 = t1;
//terrain 0, neighbour 1
t0.n1 = t7;
//terrain 0, neighbour 2
t0.n2 = t8;
//terrain 0, neighbour 3
t0.n3 = t2;
//terrain 0, neighbour 4
t0.n4 = t23;
//terrain 0, neighbour 5
t0.n5 = t22;

等等

我認為應該是這樣的:

public class Terrain{
    public int moves = 0;  
    public Terrain(int m){
        moves = m;
    }
}

我真的不知道該如何處理地形類型...

我已經手工確定了游​​戲板上每個圖塊的所有連接應該是什么,但是我不確定如何將其轉換為代碼或Terrain類。 如果有人有任何建議,我將不勝感激。

您可以創建一個interface Terrain ,其中包含所有地形通用的變量和方法。 然后,您可以創建實現Terrain接口的類,並為接口中的抽象方法提供定義。

大致情況:

public interface Terrain{
    int getMoves();
}

public class Forest implements Terrain{

    final String NAME = "FOREST";
    private int someMovesLikeTheJagger = -1;

    public Forest(int moves){
        someMovesLikeTheJagger = moves;
    }

    @Override
    public void getMoves(){
        return someMovesLikeTheJagger;
    }

}

我認為您對每種地形類型都使用子類的本能很好,但是我不能確定是否必要。 我會問自己一個問題:(代碼中的) 行為是否隨地形類型而變化? 如果是這樣,您肯定要為每種地形類型使用不同的子類(地形基類將是抽象類),因為您可以將某些方法虛擬化,從而在運行時表現不同。 這稱為多態性。 如果不是這樣,最好使用enum來存儲terrain類型,因為它會使代碼更簡單。

至於跟蹤鄰居,我不會在單個地形類別中執行此操作。 我將擁有某種數組或外部數據結構,這些結構或結構基本上可以容納地形實例(當然可以是任何子類)及其位置的集合。 這可能以圖形或鏈接列表的形式實現,該列表在左側,右側,頂部,底部等處引用了地形塊。或者,可能只是2D數組。

此相同的數據結構還可以潛在地保留其他游戲對象(例如生物,建築物等)的位置。希望這會有所幫助!

如果子類的屬性具有相同的多態性,則可能是一個過大的殺傷力,您可以執行以下操作:

public class Terrain {

  private List<Terrain> neighbors = new ArrayList<Terrain>;      

  private List<Creature> creatures = new ArrayList<Creature>();

  private List<Building> buildings = new ArrayList<Building>();

  //you can replace this with ENUM style coding but this is simpler 
  private String type;

  public Terrain(String type){
    this.type=type;
  }

  public addTerrain(Terrain t) {
    this.neighbors.add(t); 
  }

  public static void main(String [] args) {
    Terrain forest = new Terrain("forest");
    Terrain swamp  = new Terrain("swamp");
    swamp.addNeighbor(forest);
  }
}

與多態相比,此方法的一個優點是,每次創建新地形時,您不必添加/編碼新類

使用enum定義地形(在Java中):

enum Terrain {    
    Forest(12), Mountain(9);         // And other Terrain types...
    private int move;    
    private Terrain(int mo) {
        move=mo;
    }
    public int getMove(){
        return move;
    }
}

使用地形枚舉,您可以執行以下操作:

    Terrain t0= Terrain.Forest;
    Terrain t2= Terrain.Mountain;
    Terrain t6= .....

Tiles可以再次是一個enum並包含其他方法和Terrain數組/或某些其他數據結構類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM