Java 在我的rpg游戏中,静态最终对象的滥用是什么?

Java 在我的rpg游戏中,静态最终对象的滥用是什么?,java,Java,所以我一直在做一个非常简单的基于文本的游戏。它由用户输入和一些选项驱动。我已经让游戏运行并进行了调试,但是我遇到了一个bug,我似乎找不到问题的根源 只要你的“警戒”状态足够高,敌人就会在我的游戏中繁殖。因为我有不同的敌人和不同的属性,所以我只使用静态的最终对象和他们自己的特定属性,如图所示 public static final Monsters CRAWLER = new Monsters("Crawler", 15, 5, 100, 3); public static final Mons

所以我一直在做一个非常简单的基于文本的游戏。它由用户输入和一些选项驱动。我已经让游戏运行并进行了调试,但是我遇到了一个bug,我似乎找不到问题的根源

只要你的“警戒”状态足够高,敌人就会在我的游戏中繁殖。因为我有不同的敌人和不同的属性,所以我只使用静态的最终对象和他们自己的特定属性,如图所示

public static final Monsters CRAWLER = new Monsters("Crawler", 15, 5, 100, 3);
public static final Monsters HOWLER = new Monsters ( "Howler", 20, 10, 50, 4);
public static final Monsters PROWLER = new Monsters ( "Prowler", 30, 15, 150, 5);
public static final Monsters MANTIS = new Monsters ( "Mantis", 40, 20, 200, 8);
public static final Monsters GOLEM = new Monsters ("Golem", 60, 25, 300, 10);
public static final Monsters DOGS = new Monsters ( "Group of Dogs", 10 ,5, 40, 2 );
这段代码位于一个名为Monsters的类中,它扩展了一个抽象类字符,因为它们共享实例变量Name、health、alert、atk和xp

然后我将这些敌人放入怪物对象Arraylist和战斗中怪物的另一个Arraylist中

ArrayList<Monsters> allenemy = new ArrayList<Monsters>();
ArrayList<Monsters> currentenemy = new ArrayList<Monsters>();
ArrayList allenemy=new ArrayList();
ArrayList currentForeign=新的ArrayList();
allenemy阵列中有上述怪物及其统计数据,当前敌人是玩家与之战斗的敌人。战斗立即发生,玩家和怪物都会使用getAtk、setHealth和getHealth受到伤害。如果玩家的健康值变为0,则显示游戏结束消息。另一方面,如果敌人的生命值变为0,则会显示不同的消息,并将敌人从当前敌人中移除。然而,当遇到相同的敌人(相同的名字)时,敌人立即死亡。唯一可行的方法是如果敌人的生命值为0,所以我认为这一定与公共静态最终怪物对象有关。有人能帮我吗?下面是一些更具体的代码

敌人产卵方法: 公共静态字符串espawn(播放器1){

int-enemychance=(int)(Math.random()*101);
怪物电流=零;
如果(enemychance>=0&&enemychance 25&&enemychance 50&&enemychance 70&&enemychance 85&&enemychance 95&&enemychance=15){//产卵怪物的阈值
if(0&&one.getHealth()>0){
逃跑=(int)((Math.random()*4)+1);//1-5表示逃跑
攻击1=(int)((Math.random()*9)+1);//你的攻击几率为1-10
攻击2=(int)((Math.random()*9)+1);//敌人的攻击几率为1-10
攻击3=(int)((Math.random()*9)+1);//敌人逃跑时的攻击几率为1-10
System.out.print(“\n”+Interaction.combatmenu(一个)+“\n”);
int check2=reader.nextInt();
如果(检查2==1){

如果(攻击1你怀疑静态变量是对的。你只有一个狗的实例。当你第一次与它战斗时,它的生命值降为零。下次与一群狗战斗时,你将把同一个对象放入敌人列表中。

我不完全理解你的代码,但最近我处理了一个类似的问题在尝试快速创建多面体类时,请使用

您真正应该看的是两件事:工厂模式和复杂枚举。也就是说,使用初始值设定项的枚举和
create()
方法,它返回一个描述你的怪物的对象的新实例。你是对的,某些东西肯定是从以前遗留下来的,我们希望这样的材料只是垃圾收集

例如:

interface Monsters {
    …
}

interface MonstersFactory {
    public Monsters create();
}

enum StockMonstersFactory implements MonstersFactory {
    CRAWLER("Crawler", 15, 5, 100, 3),
    HOWLER( "Howler", 20, 10, 50, 4),
    PROWLER( "Prowler", 30, 15, 150, 5),
    MANTIS( "Mantis", 40, 20, 200, 8),
    GOLEM("Golem", 60, 25, 300, 10),
    DOGS( "Group of Dogs", 10 ,5, 40, 2 );

    private StockMonstersFactory(String name, /*…other initialization options…*/) {
        //…
        //standard initializer, set enum constants to what you need them 
将来 //… }

    public Monsters create() {
        Monsters monsters = new Monsters(/*Initialization constants stored in enumeration fields*/);
        return monsters;
    }
}
我希望你明白了这个想法?当你需要一个新怪物时,而不是简单地使用
current=one.allenemy.get(#);
-这几乎肯定是问题所在-你会使用
current=stockmonsters工厂。[选中的怪物].create();
,它将为您提供一个完全全新的对象,对以前发生的任何事情都没有记忆

当然,还有其他方法可以得到你想要的东西,但这就是我想到的。如果你能为我们提供更具体的代码来说明这些怪物是如何被实例化的,这可能也会有所帮助;
one.allenemy.get(…)
可以专门扩展


无论如何,这类事情是创建枚举的主要原因。

当怪物从当前怪物数组列表中移除时,尝试重置怪物的生命值。我相信,因为这些是静态的,所以你没有正确地实例化新怪物。这就是生命值保持为0的原因。

我还没有了解或遇到过这样的事情在应用你的解决方案之前,我会花更多的时间自己学习这个。我第一次看到它的理解方式是它是一种类?我也不明白为什么会有两个接口Monsters和MonstersFactory。另外,我会保留我的静态最终对象吗?如果是,到底发生了什么StockMonstersFactory内部的ning?是私人StockMonstersFactory(构造器?)在枚举器内部?对于这么多问题,我深表歉意,但我对此一无所知。感谢您的帮助。在深入研究了枚举器之后,我对上面的代码有了更多的了解,但当我尝试编写create方法时,我不确定到底要在参数中添加什么。我尝试使用字符串名称、int health等。但blueJ给我一个错误:')“expectedA工厂模式是一种提供特定对象的设计模式。由于您需要创建的类数量有限且已设置,因此我建议在枚举中实现工厂功能。(对我来说,它是柏拉图式实体;对你来说,它是你的怪物。)看到这个:和这个:这应该会对你有所帮助。我想,由于一个狗的实例被添加到Current敌军arraylist中,所以使用set和get方法只会修改Current敌军arraylist中的怪物对象。然后,一旦新怪物诞生,具有特定统计信息的怪物将从添加到currentenemyarraylist中尚未修改的allenemy arraylist。
interface Monsters {
    …
}

interface MonstersFactory {
    public Monsters create();
}

enum StockMonstersFactory implements MonstersFactory {
    CRAWLER("Crawler", 15, 5, 100, 3),
    HOWLER( "Howler", 20, 10, 50, 4),
    PROWLER( "Prowler", 30, 15, 150, 5),
    MANTIS( "Mantis", 40, 20, 200, 8),
    GOLEM("Golem", 60, 25, 300, 10),
    DOGS( "Group of Dogs", 10 ,5, 40, 2 );

    private StockMonstersFactory(String name, /*…other initialization options…*/) {
        //…
        //standard initializer, set enum constants to what you need them 
    public Monsters create() {
        Monsters monsters = new Monsters(/*Initialization constants stored in enumeration fields*/);
        return monsters;
    }
}