需要帮助确定我的方法引用的对象

时间:2014-11-10 06:49:10

标签: java

我正在为我的一个课程开发基于文本的RPG。战斗随机发生的可能性很大,此时玩家必须与随机生成的怪物战斗。我有一个怪物的ArrayList,但我遇到了一个问题。如果角色为1级,它将始终与随机选择的4个1级怪物中的一个战斗。比如说角色必须对抗一个骷髅,并通过将骷髅的生命值消耗为0来击败它。现在说角色再次必须战斗,并且随机生成骷髅。跳过战斗,因为骨架仍然具有来自前一战斗的0生命值

看来我的代码是指ArrayList中的对象,但我想要发生的是实例化Monster的新副本,使得范围只是创建Monster的方法。 我明白出了什么问题,但我并不完全理解为什么,而且我也不知道如何调整我的程序来修复它。我的短期修复是在战斗后将怪物的生命重置为完全,但我想了解我的问题并希望从中学习。

这是启动战斗的方法。我有一种感觉我的问题与我在下面几行中创建Monster对象的方式有关:

public void monsterEncounter(Player player)
{
    Monster monster = World.retrieveMonster(random.nextInt(4), player.getLevel());
    System.out.println("You were ambushed by a " + monster.getName() + "!  Prepare to defend yourself!");

定义游戏中怪物的ArrayLists以及检索它们的方法在另一个类中定义:

// ArrayList holding all monsters
static ArrayList<ArrayList<Monster>> monsters = new ArrayList<ArrayList<Monster>>();

// ArrayLists holding monsters by level
static ArrayList<Monster> levelOneMonsters = new ArrayList<Monster>(0);
static ArrayList<Monster> levelTwoMonsters = new ArrayList<Monster>(0);
static ArrayList<Monster> levelThreeMonsters = new ArrayList<Monster>(0);

public static void declareMonsters()
{
    levelOneMonsters.add(new Monster("Skeleton", 1, 50, 1, 4, 50, 25));
    levelOneMonsters.add(new Monster("Zombie", 1, 75, 1, 4, 60, 30));
    levelOneMonsters.add(new Monster("Rabid Dog", 1, 35, 2, 3, 40, 20));
    levelOneMonsters.add(new Monster("Goblin", 1, 65, 2, 3, 75, 40));
    monsters.add(levelOneMonsters);

    levelTwoMonsters.add(new Monster("Brown Bear", 2, 100, 2, 6, 100, 40));
    levelTwoMonsters.add(new Monster("Goblin Captain", 2, 125, 4, 3, 80, 35));
    levelTwoMonsters.add(new Monster("Giant Snake", 2, 110, 1, 3, 95, 75));
    levelTwoMonsters.add(new Monster("Lizard Man", 2, 130, 4, 4, 125, 100));
    monsters.add(levelTwoMonsters);

    levelThreeMonsters.add(new Monster("Gargoyle", 3, 150, 4, 6, 120, 100));
    levelThreeMonsters.add(new Monster("Psychotic Farmer", 3, 160, 7, 6, 125, 125));
    levelThreeMonsters.add(new Monster("Cultust", 3, 175, 1, 8, 175, 200));
    levelThreeMonsters.add(new Monster("Mutated Harpy", 3, 180, 6, 6, 150, 180));
    monsters.add(levelThreeMonsters);
}

public static Monster retrieveMonster(int index, int level)
{
    return monsters.get(level - 1).get(index);
}

我希望这个问题有道理。我真诚地感谢任何人都可以提供的任何见解。

2 个答案:

答案 0 :(得分:0)

要始终实例化一个新的Monster对象,你必须使用clone()来制作副本,或者(如果你的Monster构造函数对于Object类提供的克隆方法来说太多了)你必须制作一个真实的deep copy你的怪物。

所以尝试改变

public static Monster retrieveMonster(int index, int level)
{
   return monsters.get(level - 1).get(index);
}

public static Monster retrieveMonster(int index, int level)
{
   return monsters.get(level - 1).get(index).clone();
}

答案 1 :(得分:0)

在阅读了一下有关clone()方法之后,我决定采用不同的方法。我可以通过调整retrieveMonster()方法来解决我的问题,如下所示:

public static Monster retrieveMonster(int index, int level)
{
    String monsterName = monsters.get(level - 1).get(index).getName();
    int monsterLevel = monsters.get(level - 1).get(index).getLevel();
    int monsterHealth = monsters.get(level - 1).get(index).getTotalHealth();
    int monsterArmor = monsters.get(level - 1).get(index).getTotalArmor();
    int monsterDamage = monsters.get(level - 1).get(index).getTotalDamage();
    int monsterXP = monsters.get(level - 1).get(index).getExperienceGranted();
    int monsterGP = monsters.get(level - 1).get(index).getMaxGoldGranted();

    return new Monster(monsterName, monsterLevel, monsterHealth, monsterArmor, monsterDamage, monsterXP, monsterGP);
}

这样我每次调用方法时都会返回一个新的Monster对象。

这篇帖子让我想到了clone()方法的一些不一致之处:https://stackoverflow.com/a/2326801/3224659