LoginSignup
negi_mushamusha
@negi_mushamusha

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

whileが繰り返さない

現在JAVA勉強中の初学者です。

入門書で勉強した内容を思い出しながら
小規模なRPGを制作しているのですが、
whileが思った通りに機能してくれず、
自分なりに検索してみたものの解決に至らなかったので、
こちらで質問させていただきました。

お手数おかけしますが、ご助力のほどよろしくお願いいたします。

解決したいこと

このゲームでは"リドル"という名前のキャラに命令を出して敵と戦います。
キャラクターのフィールド(4,5行目)は(HP,name)の順で記述してあります。
attack()は攻撃、run()は逃げるメソッドです。

do-while構文の箇所について質問がございます。
「敵のHPが0になるまで戦う行動を繰り返す」という処理を行いたいのですが、一度行動しただけで繰り返さずに処理が終わってしまいます。

import java.util.Scanner;
public class Main {
   public static void main(String[] args) {
     Riddle r = new Riddle(50,"リドル");
     Enemy e = new Enemy(24,"敵");
    
     do{ 
     System.out.println(r.getName() + "はどうする?>攻撃:1 逃げる:2");
     Scanner sc = new Scanner(System.in);
     int order = sc.nextInt();
     System.out.println(order);
     //処理
     if (order == 1) {
      r.attack(e);
     }
     else if (order == 2) {
      r.run();
     }
     else {
      r.run();
     }
   } while(e.getHp() == 0);
   
   System.out.println(e.getName() + "のHPは" + e.getHp() + "だ");
   System.out.println("勝利");
   }
}

attackメソッドを実行すると敵のHPが12減るので、二回攻撃してから勝利にしたいのですが、一度攻撃して終わってしまいます。
以下、attackを実行した際の表示です。

リドルはどうする?>攻撃:1 逃げる:2
1
1
リドルの攻撃!
12のダメージ!
敵のHPは12だ
勝利

敵のHPが0になるまで行動を繰り返すにはどうすれば良いでしょうか。
初心者質問で申し訳ありませんが、ご指導のほどよろしくお願いいたします。

1

2Answer

while(e.getHp() == 0);
で敵のHPが0の間繰り返すになっているからですね
たぶん、こうです。
while(e.getHp() > 0);

3

Comments

  1. 早急な回答、誠にありがとうございます。
    恥ずかしながら見落としておりました…
    おかげさまで解決できました!
    ありがとうございます🙇‍♂️

while(e.getHp() == 0)は「e.getHp()が0を返したらループ」という意味になります。
つまりwhileの中に書く式は「ループを続ける条件」なので「ループが終わる条件」を書くことが間違いです。

またHPがマイナスになることはない設計でしょうけど、ループする条件としては「0でなければ」よりも「0より大きければ」の方がわかりやすいでしょう。
そんなわけでwhile(e.getHp() > 0)と書けば期待した動きになるんじゃないでしょうか。

2

Comments

  1. 迅速な回答、誠にありがとうございます。
    なるほど、「ループを終わる条件」を書くのですね。認識が間違っておりました。

    条件式を書き換えたら無事解決いたしました。
    大変勉強になりました。ありがとうございます。

  2. 間違えました、「ループを続ける条件」ですね。
    失礼いたしました。

Your answer might help someone💌