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

Java 需要帮助确定我的方法引用的对象吗,java,Java,我正在为我的一个班做一个基于文本的RPG。有一个随机发生战斗的机会,此时玩家必须与随机产生的怪物战斗。我有一个怪物列表,但我遇到了一个问题。如果角色是一级,它将始终与随机选择的四个一级怪物中的一个战斗。例如,角色必须与骷髅战斗,并通过消耗骷髅的生命值0来击败它。现在假设角色再次必须战斗,然后随机生成骨架。战斗被跳过,因为骨架上一次战斗的生命值仍然为0 看起来我的代码引用的是驻留在ArrayList中的对象,但我想做的是实例化Monster的新副本,这样范围就只有创建Monster的方法。 我知道

我正在为我的一个班做一个基于文本的RPG。有一个随机发生战斗的机会,此时玩家必须与随机产生的怪物战斗。我有一个怪物列表,但我遇到了一个问题。如果角色是一级,它将始终与随机选择的四个一级怪物中的一个战斗。例如,角色必须与骷髅战斗,并通过消耗骷髅的生命值0来击败它。现在假设角色再次必须战斗,然后随机生成骨架。战斗被跳过,因为骨架上一次战斗的生命值仍然为0

看起来我的代码引用的是驻留在ArrayList中的对象,但我想做的是实例化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!");
定义游戏中怪物的ArrayList以及检索它们的方法在另一个类中定义:

// 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);
}
//ArrayList包含所有怪物
静态ArrayList怪物=新ArrayList();
//按等级控制怪物的阵列列表
静态ArrayList levelOneMonsters=新ArrayList(0);
静态ArrayList levelTwoMonsters=新ArrayList(0);
静态ArrayList levelThreeMonsters=新ArrayList(0);
公共静态无效声明()
{
添加(新怪物(“骷髅”,1,50,1,4,50,25));
添加(新怪物(“僵尸”,1,75,1,4,60,30);
添加(新怪物(“狂犬”,1,35,2,3,40,20));
一级怪物。添加(新怪物(“地精”,1,65,2,3,75,40));
怪物。添加(一级怪物);
二级怪物。添加(新怪物(“棕熊”,2100,2,6100,40));
二级怪物。添加(新怪物(“地精队长”,2125,4,3,80,35);
添加(新怪物(“巨蛇”,2110,1,3,95,75);
添加(新怪物(“蜥蜴人”,2130,4,4125100);
怪物。添加(两级怪物);
三级怪物。添加(新怪物(“石像鬼”,3150,4,6120100);
三级怪物。添加(新怪物(“精神病农民”,31160,7125);
三级怪物。添加(新怪物(“Cultust”,3,175,1,8,175,200));
三级怪物。添加(新怪物(“变异的哈比”,3180,6,6150,180);
怪物。添加(三级怪物);
}
公共静态怪物检索怪物(整数索引,整数级别)
{
返回怪物。获取(一级)。获取(索引);
}

我希望这个问题有意义。我真诚地感谢任何人能够提供的见解。

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

所以试着改变

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


在阅读了有关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);
}
这样,每次调用该方法时,我都会返回一个新的怪物对象


这篇文章向我透露了clone()方法的一些不一致性:

谢谢你的回复。我之前在玩弄克隆方法,主要是因为它是我能想到的唯一可能的解决方案。不幸的是,我在尝试将clone()添加到return语句末尾时出错。错误:“类型不匹配:无法从对象转换为怪物。”但当我尝试将返回的对象强制转换为怪物时,会出现以下错误:“类型对象的方法clone()不可见”。有什么想法吗?我刚刚意识到clone()方法保护了访问。我想我可以从这里找到答案。^你可以尝试创建一个真正新的怪物()来制作一个深度副本,并在数组中传递你对怪物的值。我不允许对你的答案发表评论,所以我把它放在这里:你的答案就是深度副本
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);
}