如何获取对象列表中的下一个对象?
How to get the next object in a list of objects?
我在我的应用程序中使用地图来存储虚构游戏地图中的每个位置。当前的实现允许我获取起始节点,即 Tiberius
。
但我不确定如何才能到达地图上相对于玩家当前位置的下一个 location
。例如,当我创建地图时,默认情况下我在 "Tiberius",所以我想知道如何创建一个方法来迭代到下一个位置,这将是 "Desert" 而随后调用move()
会将玩家带到 "Jerusalem"。
图表如下所示,每个位置都有一个子位置。
通过快速搜索,我发现列表可以通过 ID 中的字段进行迭代,就像这样 get element by ID 但在这个实现中,我需要获取相对于当前位置的下一个位置。
有谁知道这个方法是如何实现的?
这就是我目前在主 class 中设置地图的方式:
public class Main implements Commands{
public static void main(String[] args) {
//Boolean to signify game state
boolean gameNotOver = true;
//main game loop
while (gameNotOver) {
GameMap playerMap = new GameMap();
playerMap.getStartNode();
Main mainObj = new Main();
//Take in user commands here
//and parse commands
String input = Input.getInput();
if (input.equals("description")) {
System.out.println("Description: " );
} else if (input.equals("move")) {
System.out.println("Moving to the next location in map.. " );
mainObj.move();
}
//Game over
System.out.println("Game Over!");
System.exit(0);
}
//Game player commands inherited from GameCharacterInterface:
public String move() {
//want to create a method here that will call the next
//location based on the current location that the player is in.
// TODO Auto-generated method stub
return null;
}
}
这是用于模拟位置的位置 class:
public class Location {
private Location[] location;
private int id;
private String description;
private String weight;
private String name;
private Item item;
private Exit[] exit;
private boolean visited = false;
private boolean goalLocation;
private int approximateDistanceFromGoal = 0;
private Location parent;
private Map<Location, Integer> children = new HashMap<Location, Integer>();
public Location() {
super();
}
public Location(String name){
this.name = name;
}
public Location(String name, int goalDistance){
this.name = name;
this.approximateDistanceFromGoal = goalDistance;
}
public Location[] children(){
return (Location[]) children.keySet().toArray(new Location[children.size()]);
}
public int getDistance(Location loc){
if(children.get(loc) == null) System.out.println(this.name + ": " + loc.getName());
return children.get(loc);
}
public int getChildLocationCount(){
return children.size();
}
public void addChildLocation(Location child, int distance){
children.put(child, distance);
}
public boolean isLeaf(){
if (children.size() > 0){
return false;
}else{
return true;
}
}
public void removeChild(Location child){
children.remove(child);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescription ()
{
return description;
}
public void setDescription (String description)
{
this.description = description;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String getName ()
{
return name;
}
public void setName (String name)
{
this.name = name;
}
public Exit[] getExit() {
return exit;
}
public void setExit(Exit[] exit) {
this.exit = exit;
}
public Location[] getLocation() {
return location;
}
public void setLocation(Location[] location) {
this.location = location;
}
public boolean isVisited() {
return visited;
}
public void setVisited(boolean visited) {
this.visited = visited;
}
public boolean isGoalLocation() {
return goalLocation;
}
public void setGoalLocation(boolean goalLocation) {
this.goalLocation = goalLocation;
}
public int getApproximateDistanceFromGoal() {
return approximateDistanceFromGoal;
}
public void setApproximateDistanceFromGoal(int approximateDistanceFromGoal) {
this.approximateDistanceFromGoal = approximateDistanceFromGoal;
}
public Location getParent() {
return parent;
}
public void setParent(Location parent) {
this.parent = parent;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
@Override
public String toString() {
return "Location [location=" + Arrays.toString(location) + ", id=" + id
+ ", description=" + description + ", name=" + name + ", item="
+ item + ", exit=" + Arrays.toString(exit) + "]";
}
}
这是显示每个位置和 getStartNode() 的 GameMap:
public class GameMap {
private Location tiberius;
public GameMap() {
//Creating Locations
tiberius = new Location("Tiberius", 200);
tiberius.setDescription("You are in the city of Tiberius. There is a sword on the ground in front of you. You see a long street with high buildings and a castle.You see an exit to the south.");
Location desert = new Location("Desert", 170);
desert.setDescription("You are in hot dreary desert, surrounded by sand dunes and nothingness, you see an exit to the south.");
Location jerusalem = new Location("Jerusalem", 270);
jerusalem.setDescription("You are at battlefield of Jerusalem. You are in awe of your surroundings, you see an exit to the west.");
Location hattin = new Location("Hattin", 120);
hattin.setDescription("You are at battlefield of Hattin. You see the ruination of the battle and fallen comrades...You see an exit to the north.");
Location damascus = new Location("Damascus", 130);
damascus.setDescription("You are in Damascus. You see the some shady characters...you see an exit to the west.");
Location tripoli = new Location("Tripoli", 80);
tripoli.setDescription("You are in Tripoli. You see the some more shady characters...you see an exit to the north.");
Location antioch = new Location("Antioch", 60);
antioch.setDescription("You are in the city of Antioch. You see a long street with high buildings and a castle.. You see the some more shady characters...you see an exit to the north.");
Location sis = new Location("Sis", 100);
sis.setDescription("You are in the city of Sis....exit ahead in the west.");
Location tarsus = new Location("Tarsus", 20);
tarsus.setDescription("You are in the city of Tarsus. ...you see an exit to the south.");
Location cyprus = new Location("Cyprus", 0);
cyprus.setDescription("You have reached the Byzantine Empire, your quest has finished!");
cyprus.setGoalLocation(true);
//Adding child locations
tiberius.addChildLocation(desert, 105);
desert.addChildLocation(jerusalem, 105);
jerusalem.addChildLocation(hattin, 323);
hattin.addChildLocation(damascus, 121);
damascus.addChildLocation(tripoli, 121);
tripoli.addChildLocation(antioch, 220);
antioch.addChildLocation(sis, 126);
sis.addChildLocation(tarsus, 121);
tarsus.addChildLocation(cyprus, 126);
}
public Location getStartNode(){
System.out.println(tiberius.toString());
return tiberius;
}
}
Brian,从位置删除此字段:
Map<Location,Integer> children;
将其替换为两个字段。
Location next;
int goalDistance;
然后,在您的游戏控制器中,保留对角色当前位置的引用。
例如:
Location currentLoc = tiberius;
然后,每次调用 move() 时,只需说
currentLoc = currentLoc.next;
我想你是说你想要在位置 class 上调用 next() 的方法,它将 return 到下一个位置。那么为什么不这样做呢?
public Location next() {
Location nextLocation = null;
for (Location child : children.keySet()) {
nextLocation = child;
break;
}
return nextLocation;
}
当然,这是基于您关于 children 地图中永远只有一个条目的断言。如果这在未来发生变化,您可以添加一个测试(此时设计未知) child 是您想要的:
public Location next() {
Location nextLocation = null;
for (Location child : children.keySet()) {
if (isCorrectChild(child)) {
nextLocation = child;
break;
}
}
return nextLocation;
}
我在我的应用程序中使用地图来存储虚构游戏地图中的每个位置。当前的实现允许我获取起始节点,即 Tiberius
。
但我不确定如何才能到达地图上相对于玩家当前位置的下一个 location
。例如,当我创建地图时,默认情况下我在 "Tiberius",所以我想知道如何创建一个方法来迭代到下一个位置,这将是 "Desert" 而随后调用move()
会将玩家带到 "Jerusalem"。
图表如下所示,每个位置都有一个子位置。
通过快速搜索,我发现列表可以通过 ID 中的字段进行迭代,就像这样 get element by ID 但在这个实现中,我需要获取相对于当前位置的下一个位置。
有谁知道这个方法是如何实现的?
这就是我目前在主 class 中设置地图的方式:
public class Main implements Commands{
public static void main(String[] args) {
//Boolean to signify game state
boolean gameNotOver = true;
//main game loop
while (gameNotOver) {
GameMap playerMap = new GameMap();
playerMap.getStartNode();
Main mainObj = new Main();
//Take in user commands here
//and parse commands
String input = Input.getInput();
if (input.equals("description")) {
System.out.println("Description: " );
} else if (input.equals("move")) {
System.out.println("Moving to the next location in map.. " );
mainObj.move();
}
//Game over
System.out.println("Game Over!");
System.exit(0);
}
//Game player commands inherited from GameCharacterInterface:
public String move() {
//want to create a method here that will call the next
//location based on the current location that the player is in.
// TODO Auto-generated method stub
return null;
}
}
这是用于模拟位置的位置 class:
public class Location {
private Location[] location;
private int id;
private String description;
private String weight;
private String name;
private Item item;
private Exit[] exit;
private boolean visited = false;
private boolean goalLocation;
private int approximateDistanceFromGoal = 0;
private Location parent;
private Map<Location, Integer> children = new HashMap<Location, Integer>();
public Location() {
super();
}
public Location(String name){
this.name = name;
}
public Location(String name, int goalDistance){
this.name = name;
this.approximateDistanceFromGoal = goalDistance;
}
public Location[] children(){
return (Location[]) children.keySet().toArray(new Location[children.size()]);
}
public int getDistance(Location loc){
if(children.get(loc) == null) System.out.println(this.name + ": " + loc.getName());
return children.get(loc);
}
public int getChildLocationCount(){
return children.size();
}
public void addChildLocation(Location child, int distance){
children.put(child, distance);
}
public boolean isLeaf(){
if (children.size() > 0){
return false;
}else{
return true;
}
}
public void removeChild(Location child){
children.remove(child);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescription ()
{
return description;
}
public void setDescription (String description)
{
this.description = description;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String getName ()
{
return name;
}
public void setName (String name)
{
this.name = name;
}
public Exit[] getExit() {
return exit;
}
public void setExit(Exit[] exit) {
this.exit = exit;
}
public Location[] getLocation() {
return location;
}
public void setLocation(Location[] location) {
this.location = location;
}
public boolean isVisited() {
return visited;
}
public void setVisited(boolean visited) {
this.visited = visited;
}
public boolean isGoalLocation() {
return goalLocation;
}
public void setGoalLocation(boolean goalLocation) {
this.goalLocation = goalLocation;
}
public int getApproximateDistanceFromGoal() {
return approximateDistanceFromGoal;
}
public void setApproximateDistanceFromGoal(int approximateDistanceFromGoal) {
this.approximateDistanceFromGoal = approximateDistanceFromGoal;
}
public Location getParent() {
return parent;
}
public void setParent(Location parent) {
this.parent = parent;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
@Override
public String toString() {
return "Location [location=" + Arrays.toString(location) + ", id=" + id
+ ", description=" + description + ", name=" + name + ", item="
+ item + ", exit=" + Arrays.toString(exit) + "]";
}
}
这是显示每个位置和 getStartNode() 的 GameMap:
public class GameMap {
private Location tiberius;
public GameMap() {
//Creating Locations
tiberius = new Location("Tiberius", 200);
tiberius.setDescription("You are in the city of Tiberius. There is a sword on the ground in front of you. You see a long street with high buildings and a castle.You see an exit to the south.");
Location desert = new Location("Desert", 170);
desert.setDescription("You are in hot dreary desert, surrounded by sand dunes and nothingness, you see an exit to the south.");
Location jerusalem = new Location("Jerusalem", 270);
jerusalem.setDescription("You are at battlefield of Jerusalem. You are in awe of your surroundings, you see an exit to the west.");
Location hattin = new Location("Hattin", 120);
hattin.setDescription("You are at battlefield of Hattin. You see the ruination of the battle and fallen comrades...You see an exit to the north.");
Location damascus = new Location("Damascus", 130);
damascus.setDescription("You are in Damascus. You see the some shady characters...you see an exit to the west.");
Location tripoli = new Location("Tripoli", 80);
tripoli.setDescription("You are in Tripoli. You see the some more shady characters...you see an exit to the north.");
Location antioch = new Location("Antioch", 60);
antioch.setDescription("You are in the city of Antioch. You see a long street with high buildings and a castle.. You see the some more shady characters...you see an exit to the north.");
Location sis = new Location("Sis", 100);
sis.setDescription("You are in the city of Sis....exit ahead in the west.");
Location tarsus = new Location("Tarsus", 20);
tarsus.setDescription("You are in the city of Tarsus. ...you see an exit to the south.");
Location cyprus = new Location("Cyprus", 0);
cyprus.setDescription("You have reached the Byzantine Empire, your quest has finished!");
cyprus.setGoalLocation(true);
//Adding child locations
tiberius.addChildLocation(desert, 105);
desert.addChildLocation(jerusalem, 105);
jerusalem.addChildLocation(hattin, 323);
hattin.addChildLocation(damascus, 121);
damascus.addChildLocation(tripoli, 121);
tripoli.addChildLocation(antioch, 220);
antioch.addChildLocation(sis, 126);
sis.addChildLocation(tarsus, 121);
tarsus.addChildLocation(cyprus, 126);
}
public Location getStartNode(){
System.out.println(tiberius.toString());
return tiberius;
}
}
Brian,从位置删除此字段:
Map<Location,Integer> children;
将其替换为两个字段。
Location next;
int goalDistance;
然后,在您的游戏控制器中,保留对角色当前位置的引用。
例如:
Location currentLoc = tiberius;
然后,每次调用 move() 时,只需说
currentLoc = currentLoc.next;
我想你是说你想要在位置 class 上调用 next() 的方法,它将 return 到下一个位置。那么为什么不这样做呢?
public Location next() {
Location nextLocation = null;
for (Location child : children.keySet()) {
nextLocation = child;
break;
}
return nextLocation;
}
当然,这是基于您关于 children 地图中永远只有一个条目的断言。如果这在未来发生变化,您可以添加一个测试(此时设计未知) child 是您想要的:
public Location next() {
Location nextLocation = null;
for (Location child : children.keySet()) {
if (isCorrectChild(child)) {
nextLocation = child;
break;
}
}
return nextLocation;
}