[英]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.