0

所以一些背景信息,我是编程新手,还在学习,所以我为我的小错误道歉。我正在制作自己的基于文本的游戏,只是为了进一步练习等。

以下是 dropbox 上所有内容的链接以获取更多上下文: https ://www.dropbox.com/sh/uxy7vafzt3fwikf/B-FQ3VXfsR

我目前正在尝试为我的游戏实现战斗系统,并且遇到了战斗序列在需要时没有结束的问题。“战斗序列”是一个 while 循环,如下所示:

public void startCombat()
{

    inCombat = true;

    while(inCombat != false)// && herohealth > 0 && monsterhealth > 0)
    {
        checkAlive();
        heroHitMonster();
        checkAlive();
        monsterHitHero();           
    }          

    attackinghero.setHeroHealth(herohealth);
    attackedmonster.setMonsterHealth(monsterhealth);
}

其中 checkAlive() 方法如下:

public void checkAlive()
{    
    if(herohealth <= 0)
    {            
        System.out.println("You have died.");
        attackinghero.clearInventory();
        inCombat = false;

    }

    else if(monsterhealth <= 0)
    {         
        System.out.println("You have killed the "+attackedmonster.getmonsterName()+"!");
        inCombat = false;
        combatlocation.removeMonster(attackedmonster.getmonsterName());
    }    

    else
    {
        //
    }
}   

我试图让它在“英雄”或“怪物”生命值变为 <= 0 时结束战斗序列,但是它目前正在完成 while 循环,因此即使他杀死了英雄也会产生被击中的结果怪物在他的第一击。

这就是当前正在“打印到屏幕”的内容

老鼠失去 5 生命值!你杀了老鼠!

英雄失去 1 点生命值!

非常感谢任何帮助,在此先感谢。

4

3 回答 3

1

checkAlive 不应该是 void 它应该是布尔值并且应该返回 inCombat,并且在你的函数 startCombat 中你应该做 inCombat=checkAlive();

于 2014-02-16T09:34:42.783 回答
1

while 循环只会在这两个动作之后进行评估。在英雄击中怪物后,您需要一种方法来打破循环。我会亲自更改 checkAlive 方法以返回一个布尔值,并将命中方法放在 while 循环中的 if 语句中:

if(checkAlive())
{
    heroHitMonster();
}
if(checkAlive())
{
    monsterHitHero();
}
于 2014-02-16T09:36:24.687 回答
0

您应该在 checkAlive 结束时结束循环,而不是更改布尔值。如果你在第一次击中杀死了怪物,即使怪物被杀死,你仍然会执行 monsterHitHero()。命中的功能应该以英雄/怪物的生命为条件。

于 2014-02-16T09:35:24.850 回答