0

いくつかの背景情報、私はプログラミングが初めてで、まだ学習中なので、些細な間違いをお詫びします。練習などのためだけにテキストベースのゲームを自作しています。

詳細なコンテキストについては、ドロップボックスのすべてへのリンクを次に示します

現在、ゲームに戦闘システムを実装しようとしていますが、必要なときに戦闘シーケンスが終了しないという問題が発生しています。「戦闘シーケンス」は、次のように 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

while ループは、両方のアクションの後にのみ評価されます。ヒーローがモンスターを攻撃した後、ループを中断する方法が必要です。個人的には、checkAlive メソッドをブール値を返すように変更し、ヒットしたメソッドを while ループの if ステートメントに配置します。

if(checkAlive())
{
    heroHitMonster();
}
if(checkAlive())
{
    monsterHitHero();
}
于 2014-02-16T09:36:24.687 に答える
1

checkAlive は void であってはならず、ブール値である必要があり、inCombat を返す必要があります。関数 startCombat では、inCombat=checkAlive(); を実行する必要があります。

于 2014-02-16T09:34:42.783 に答える
0

ブール値を変更する代わりに、checkAlive の最後でループを終了する必要があります。最初のヒットでモンスターを殺した場合でも、モンスターが殺されても、monsterHitHero() を実行します。ヒットする関数は、ヒーロー/モンスターのライフに合わせて調整する必要があります。

于 2014-02-16T09:35:24.850 に答える