所以我一直在研究一款非常简单的基于文本的游戏。它受用户输入和一些选项的驱动。我已经让游戏运行并且一直在调试,但我遇到了一个我似乎无法找到问题根源的错误。
只要您的“警报”属性足够高,只要您移动,敌人就会在我的游戏中产生。因为我有不同的敌人和不同的统计数据,所以我只使用静态的最终对象及其特定的统计数据,如下所示。
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。有任何想法吗?我知道这是一个非常混乱的代码,可能在你眼中令人作呕,但我是一个学习的学生,所以请原谅我。拜托,谢谢!
答案 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的原因。