我目前正致力于一个涉及控制各种代理人(在这种情况下是恐龙)的运动的代理项目。每次“转”所有的恐龙都将决定他们需要吃什么“食物”来源以及他们需要移动它们的地方。我已经有了确定下一步的方法 -
public Object wut2Eat(ArrayList<Dinosaur> dinosaurs, ArrayList<Grass> grasses, ArrayList<Water> waters) { //0=dino 1=grass for food type
if(foodStorage >= waterStorage) { //i need 2 eets da foodies
if(isHerbivore()) { //i eet grassies
return closestGrass(grasses);
} else { //i eet dinoes
return closestDinosaur(dinosaurs);
}
} else { //i'm a thirsty mofo
return closestWater(waters);
}
}
最近的DeltaDinosaur / Grass / Water三种方法看起来完全如下:
public Water closestWater(ArrayList<Water> waters) {
Water closestWater = null;
double distance;
double minDistance = MAX_VALUE;
for (Water water : waters) {
distance = calculateDistance(this.getxLoc(), this.getyLoc(), water.getxLoc(), water.getyLoc());
if(distance < minDistance) {
closestWater = water;
minDistance = Double.min(minDistance, distance);
}
}
return closestWater;
}
现在我必须确定当前恐龙的移动方向,并根据它将移动到哪个方向。
public void move(ArrayList<Dinosaur> dinosaurs, ArrayList<Grass> grasses, ArrayList<Water> waters) {
Object food = wut2Eat(dinosaurs, grasses, waters);
}
三个物体(恐龙,草,水)中的每一个都有一个xLoc和yLoc,用于确定它们在场地上的位置。如何获取这些值以便我可以确定当前恐龙应该移动到哪里?我知道无论wut2Eat返回什么,都将是一个带有xLoc和yLoc变量的对象,其中包含setter和getter。我应该把wut2Eat放在移动中吗?
答案 0 :(得分:1)
您需要基本类型,或者您需要其他类型可以实现的接口。
interface Positioned {
int getX();
int getY();
}
class Water implements Positioned {
int getX() { return xLoc; }
...
}
也许是Edible implements Positioned
界面等
然后,wut2Eat()
可以返回Edible
而不是Object
。
这是一个更具体的例子(Java8)
interface Positioned {
int getX();
int getY();
default int distanceTo(Positioned pos) {
int dx = pos.getX() - getX();
int dy = pos.getY() - getY();
return (int) Math.sqrt(dx*dx + dy*dy);
}
}
interface Edible extends Positioned {
int getNutritionalValue();
}
interface Agent extends Positioned {
Edible wat2Eat();
default Edible closestFood(List<Edible> food) {
// code to find closest edible food in given list
}
}
abstract class AbstractFood implements Edible, Positioned {
int locX, locY;
int getX() { return locX; }
// ... etc ...
}
class Water extends AbstractFood {
// ...
}
class Dinosaur extends AbstractFood, implements Agent {
Edible wat2Eat() {
if ( hungry ) {
if (isHerbivore())
return closestFood(grasses);
else
return closestFood(dinosaurs);
else
return closestFood(waters);
// ...
}
无需重复closestGrass()
/ closestDinosaur()
/ closestWater()
中的代码。
根据需要进行调整。