我正在尝试为我正在尝试使用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的类。如果有人有任何建议,我会非常感激。
答案 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
数组/或其他一些数据结构类型