35669


以下コードを参考書から書いてみたのですが、  
何故そうなるのかがどうしても理解できなかったので、  
質問させていただきました。

[code]

    public class Cleric {
     int hp = 50;
     final int MAXHP = 50;
     int mp = 10;
     final int MAXMP = 10;
    
    
     public void selfAid() {
      this.mp -= 3;
      this.hp = this.MAXHP;
      System.out.println("HPが最大まで回復した。");
     }
    
      public int pray(int sec) {
      int r = new java.util.Random().nextInt(2) + sec;
    
      //以下コード回復量計算
    
      int recover = Math.min(this.MAXMP - this.mp, r);
    
      this.mp += recover;
      System.out.println("MPが" + recover + "回復した！");
      System.out.println("現在のMPは" + this.mp + "です。");
      return recover;
     }
    }
    
[/code]

こちら`pray`メソッド内の回復量計算における実行結果の理解ができておりません。

こちら定数の`MAXMP`を超えないように`MP`を秒数＋乱数分回復するというものです。  
そこで不明点ですが、  
単に`Math.min`で比較し、小さい数値を取り出し、  
フィールド変数の`mp`へ加算しているだけであるのに、  
定数の値を超えないように何故なっているのでしょうか。

変数に代入しているだけだから、  
`mp`は１０を超えても増え続けるのではないかと思っていました。  
しかし、実行するとどれだけ回復量を１０以上に増やしても  
必ず合計が10になる分のみしか増加しないようになっております。

どなたか何故こうなっているのか、  
お分かりの方がいらっしゃいましたら教えていただければ幸いです。  
宜しくお願いします。


CC BY-SA 3.0
2017-06-17T15:57:32.993
35665
2017-06-18T04:55:22.980
2017-06-18T04:55:22.980
13251
13251
question
java
メソッド・定数・変数の関係性について


@letrecさんのコメントに対する答えがyesであることを前提として回答します。

[code]

    int recover = Math.min(this.MAXMP - this.mp, r);
    this.mp += recover;
    
[/code]

は次のように書き換えられます (`a += b`は`a = a + b`なので)。

[code]

    int recover = Math.min(this.MAXMP - this.mp, r);
    this.mp = this.mp + recover;
    
[/code]

さらに次のように書き換えられます (1行で書くと)。

[code]

    this.mp = this.mp + Math.min(this.MAXMP - this.mp, r);
    
[/code]

さらに次のように書き換えられます (`Math.min()`の代わりに、`if`文を使うと)。

[code]

    if (this.MAXMP - this.mp > r) {
        this.mp = this.mp + r;
    } else {
        this.mp = this.mp + this.MAXMP - this.mp;
    }
    
[/code]

さらに次のように書き換えられます (`this.mp + this.MAXMP - this.mp`は`this.MAXMP`なので)。

[code]

    if (this.MAXMP - this.mp > r) {
        this.mp = this.mp + r; // (this.MAXMP - this.mp > r)なので、MAXMPより小さい値
    } else {
        this.mp = this.MAXMP; // またはMAXMP
    }
    
[/code]

なので、`mp`が10を超えることはないです。


CC BY-SA 3.0
2017-06-17T19:39:36.753
35669
2017-06-17T19:39:36.753
21092
35665
answer