有些帮助构建我的课程?

时间:2014-01-20 17:42:03

标签: java oop

我正在尝试为我正在尝试使用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;
    }
}

我真的不确定如何处理Terrains的类型,就像我说的那样......

我已经手工制作了游戏板的每个瓷砖的所有连接应该是什么,但我不知道如何将其转换为代码,或者转换为Terrain的类。如果有人有任何建议,我会非常感激。

4 个答案:

答案 0 :(得分:1)

您可以创建一个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;
    }

}

答案 1 :(得分:1)

我认为你对每种地形类型使用子类的直觉是好的,但我不能确定是否有必要。我会问自己这个问题:行为(代码中)是否会根据地形类型而改变?如果是这样,你肯定希望为每种地形类型使用不同的子类(地形基类将是一个抽象类),因为你可以使某些方法成为虚拟,因此在运行时表现不同。这被称为多态性。如果没有,您最好使用enum来存储地形类型,因为它可以使代码更简单。

至于跟踪邻居,我不会在单个地形类中执行此操作。我会有一些数组或外部数据结构,它基本上包含一组地形实例(当然可以是任何子类)和它们的位置。这可能是作为图形实现的,或者是一个链接列表,它引用了左,右,上,下等地形块。或者,也许只是一个2D数组。

这个相同的数据结构也可以保存其他游戏对象的位置,例如生物,建筑物等。希望这有帮助!

答案 2 :(得分:1)

如果子类的属性是相同的多态,则可能是一种过度杀伤力 你可以这样做:

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);
  }
}

这种方法相对于多态的一个优点是,每次创建新地形时,都不必添加/编写新类

答案 3 :(得分:1)

使用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枚举,您可以:

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

Tiles可以再次成为enum并包含其他方法和Terrain数组/或其他一些数据结构类型