在我的RPG游戏中滥用静态最终对象有什么用途?

时间:2015-05-19 05:00:04

标签: java

所以我一直在研究一款非常简单的基于文本的游戏。它受用户输入和一些选项的驱动。我已经让游戏运行并且一直在调试,但我遇到了一个我似乎无法找到问题根源的错误。

只要您的“警报”属性足够高,只要您移动,敌人就会在我的游戏中产生。因为我有不同的敌人和不同的统计数据,所以我只使用静态的最终对象及其特定的统计数据,如下所示。

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的类中,它扩展了一个抽象类Character,因为它们共享实例变量Name,health,alert,atk和xp。

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

ArrayList<Monsters> allenemy = new ArrayList<Monsters>();
ArrayList<Monsters> currentenemy = new ArrayList<Monsters>();

淫乱阵列有上述怪物的统计数据,而当前的怪物是玩家打架的。战斗立即发生,玩家和怪物都会被getAtk,setHealth和getHealth损坏。如果玩家的健康状况变为0,则显示游戏结束消息。另一方面,如果敌人的健康状况变为0,则显示不同的消息并从敌人身上移除敌人。然而,在遇到同一个敌人(同名)时,敌人立即死亡。唯一可行的方法是,如果敌人的生命值为0,那么我认为它必须与公共静态最终怪物对象有关。谁能帮我?下面是一些更具体的代码。

敌人产卵方法:     public static String espawn(Player one){

    int enemychance = (int)(Math.random()*101);
    Monsters current= null;
    if ( enemychance >= 0 && enemychance <= 25 ) current = one.allenemy.get(5); //end if enemychance is from 0 to 25
    if ( enemychance > 25 && enemychance <= 50 ) current = one.allenemy.get(0); //end if enemychance is from 26 to 50
    if ( enemychance > 50 && enemychance <= 70 ) current = one.allenemy.get(1); //end if enemychance is from 51 to 70
    if ( enemychance > 70 && enemychance <= 85 ) current = one.allenemy.get(2); //end if enemychance is from 71 to 85
    if ( enemychance > 85 && enemychance <= 95 ) current = one.allenemy.get(3); //end if enemychance is from 86 to 95
    if ( enemychance > 95 && enemychance <= 100) current = one.allenemy.get(4); //end if enemychance is from 96 to 100
    one.currentenemy.add(current);
    String espawn = "\nA " + current.getName() + " has appeared.";
    return espawn;
} //end static espawn method

战斗循环:

if ( one.getAlert() >= 15){ //threshold for spawning monsters
            if ( enemy <= 30 ){ //chance for encountering enemies
                System.out.print ( Interaction.espawn(one) + "\n");
                while (one.currentenemy.get(0).getHealth() > 0 && one.getHealth() > 0){
                    flee =  (int)((Math.random()*4)+1); //1-5 for fleeing
                    attack1 = (int)((Math.random()*9)+1); //1-10 for your attack chance
                    attack2 = (int)((Math.random()*9)+1); //1-10 for enemy attack chance
                    attack3 = (int)((Math.random()*9)+1); //1-10 for enemy attackchance while fleeing
                    System.out.print ("\n" + Interaction.combatmenu ( one) + "\n");
                    int check2 = reader.nextInt();
                    if ( check2 == 1 ){
                        if ( attack1 <= 6 ) {
                            hp();
                            System.out.print (Interaction.atk1(one));
                            one.setHealth(one.getHealth()-one.currentenemy.get(0).getAtk());
                        } //end if enemy atk hits
                        else { 
                            System.out.print (Interaction.atk3());
                        } //end if enemy atk misses
                        if ( attack2 <= 8 ){
                            System.out.print (Interaction.atk2(one));
                            one.currentenemy.get(0).setHealth(one.currentenemy.get(0).getHealth()-one.getAtk()); //calls arraylist index 0's setHealth method as arraylist index 0's getHealth method-player's getAtk method
                        } //end if your attack hits
                        else{
                            System.out.print (Interaction.atk4());
                        } //end if your attack misses
                    } //end if user wants to attack
                    if ( check2 == 2 ) {
                        if ( flee == 1 ){
                            System.out.print (Interaction.flee1());
                            one.currentenemy.remove(0);
                            break here;
                        } //end if flee works
                        else{
                            System.out.print (Interaction.flee2());
                            one.setHealth(one.getHealth()-one.currentenemy.get(0).getAtk());
                            if ( attack3 <= 6 ) {
                                hp();
                                System.out.print (Interaction.atk1(one));
                                one.setHealth(one.getHealth()-one.currentenemy.get(0).getAtk());
                            } //end if enemy attack hits
                            else {
                                System.out.print (Interaction.atk3());
                            } //end if enemy atk misses
                        } //end if flee fails
                    } //end if user wants to flee
                } //end while player and enemy are not dead
                if (one.currentenemy.get(0).getHealth() <= 0 ){
                    System.out.print ( Interaction.deade(one));
                    if ( loot <= 4 ){
                        System.out.print ( Interaction.loot1(one) + "\n" + Interaction.atk(one));
                    } //end if no weapon has been found for 80%
                    else {
                        System.out.print ( Interaction.loot2());
                        one.setAtk(one.weapon.get(0).getAtk());
                    } //end if weapon has been found for 20%
                    one.setXP(one.getXP() + one.currentenemy.get(0).getXP());
                    one.maxXP();
                    Interaction.lvlup(one);
                    one.currentenemy.remove(0);
                 if ( one.getHealth()<= 0){
                    hp();   
                 } //end if player is dead  
                } //end if enemy is dead
            } // if enemy spawn chance for 20%
        } //end if alert is greater than 15

最后,示例输出:

第一次遭遇:敌人群体袭击你并造成5点伤害。  你攻击了敌人的狗群,造成20点伤害。

健康:85 Atk:20 敌人健康:20 Enemy Atk:5

按1进行攻击。 按2逃跑。 1  敌人的攻击错过了!你攻击了敌人的狗群,造成20点伤害。 狗群已经死了。

你在死狗群上发现了一支棒球棒并装备了它。 你的atk增加了50

第二次遭遇:一群狗出现了。 狗群已经死了。 你没有在身体上找到任何东西。你已经升级了。您的统计信息已重置并增加。

所以,狗群刚刚立即死亡并让xp杀死它。这证实敌人的生命值必须达到0,因为只有在该循环中玩家才能获得XP。有任何想法吗?我知道这是一个非常混乱的代码,可能在你眼中令人作呕,但我是一个学习的学生,所以请原谅我。拜托,谢谢!

3 个答案:

答案 0 :(得分:4)

我并不完全理解您的代码,但我最近在尝试快速创建多面体类时处理了类似的问题。

你应该看到的是两件事:工厂模式和复杂的枚举。也就是说,使用初始化器和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 = StockMonstersFactory.[chosen monster].create();,它会给你一个完全新鲜的对象,没有任何记忆发生在以前。

当然还有其他方法可以满足您的需求,但这就是我想到的。如果您为这些怪物的实例化提供了更具体的代码,它也可能有所帮助; one.allenemy.get(…)可以专门扩展。

无论如何,这种事情是为枚举创建的很大一部分。

答案 1 :(得分:0)

你怀疑静态变量是对的。您只有一个DOGS实例。当你第一次参加比赛时,你将健康状况降到了零。下次你打一群狗时,你将同一个物体放入敌人名单。

答案 2 :(得分:0)

尝试从当前的群集数组列表中删除怪物时重置该怪物的健康状况。我相信因为那些是静态决赛你没有正确地实例化新的怪物。这就是健康状况为0的原因。