【ITニュース解説】【ポケモン×Java】Lv8:『先にHP0になるのはどっちだ?』〜if文〜
2025年09月08日に「Qiita」が公開したITニュース「【ポケモン×Java】Lv8:『先にHP0になるのはどっちだ?』〜if文〜」について初心者にもわかりやすく解説しています。
ITニュース概要
Javaでポケモンのバトルを実装する例。while文のループだけでは、相打ちのような複雑な状況で正確な勝敗判定が難しい。ループ内でif文を使い、攻撃ごとにHPを確認して先に0になったら処理を中断することで、正しい勝敗判定ロジックを実装する方法を学ぶ。(117文字)
ITニュース解説
プログラムにおける繰り返し処理は、同じような作業を自動化するために不可欠な機能である。例えばゲームのバトルシーンでは、どちらかのキャラクターのヒットポイント(HP)が尽きるまで攻撃の応酬が繰り返される。このような処理は、while文のようなループ構文を用いることで効率的に実装できる。しかし、ループ処理を単純に記述しただけでは、意図しない挙動、いわゆるバグを引き起こすことがある。特に、ループの終了条件を精密に制御しなければ、現実のルールとは異なる不自然な結果を生んでしまう。その典型的な例が、バトルの決着がついた後も処理が続いてしまい、両方のキャラクターのHPが0以下になる「相打ち」のような状況だ。
この問題は、whileループの基本的な性質に起因する。while文は、ループの開始時に指定された条件式を評価し、その条件が満たされている(真である)限り、ブロック内に記述された一連の処理を最後まで実行し続ける。例えば、「両者のHPが0より大きい間、バトルを続ける」という条件でループを組んだ場合を考える。あるターンで、キャラクターAが攻撃し、キャラクターBのHPが0になったとする。この時点でゲームのルール上は勝敗が決している。しかし、プログラムのwhileループはまだそのターン内の処理を終えていないため、続いてキャラクターBの攻撃処理を実行してしまう。その結果、キャラクターAのHPも0以下になる可能性があり、どちらが先に倒れたのかが曖昧な、不正確な結果が出力されてしまう。これを防ぐためには、ループの途中であっても、特定の条件が満たされた瞬間に処理の流れを中断・変更する仕組みが必要となる。
ここで重要になるのが「条件分岐」という考え方であり、Javaプログラミングではif文がその役割を担う。if文は、「もし(if)指定した条件が真ならば、特定の処理を実行する」という、プログラムの流れを制御するための基本的な構文である。これにより、処理の途中で状況を判断し、その結果に応じて実行する内容を変えることが可能になる。例えば、攻撃処理の直後に「もし相手のHPが0以下になったならば」という条件でif文を配置することで、勝敗が決した瞬間を捉えることができる。さらに、複数の条件を последовательноに評価したい場合には、if-else if-elseという構文が用いられる。これは、最初のifの条件から順に判定し、最初に真となったブロックの処理だけを実行して、残りのelse ifやelseブロックはすべて無視するという仕組みである。この構文を使えば、「キャラクターAが勝利した場合」「キャラクターBが勝利した場合」「まだ勝負が続いている場合」といった複数のシナリオを正確に処理分けすることが可能になる。
このif文を先ほどのwhileループ内に組み込むことで、バトルの終了判定をより精密に制御できる。具体的な実装としては、まずwhileループの中でキャラクターAの攻撃処理を行う。その直後に、キャラクターBのHPが0以下になったかどうかを判定するif文を記述する。もしこの条件が真であれば、勝者が決まったことを示すメッセージを表示し、break文を実行する。break文は、現在実行中のループ処理を即座に強制終了させるための命令である。これにより、たとえwhileループ内の処理がまだ残っていても、その場でループから脱出し、意図しない反撃処理などが実行されるのを防ぐことができる。もしif文の条件が偽、つまりキャラクターBのHPがまだ残っている場合は、ifブロック内の処理は実行されず、プログラムは次の処理、すなわちキャラクターBの反撃へと進む。そして、キャラクターBの攻撃処理の後にも同様に、キャラクターAのHPを判定するif文とbreak文を配置する。この構造により、どちらの攻撃であっても、相手のHPが0になった瞬間に勝敗が確定し、即座にバトルが終了するという、自然なゲームの流れをプログラムで実現できるのである。
このように、while文による繰り返し処理とif文による条件分岐を組み合わせることは、単調な処理の自動化から一歩進んで、状況に応じた動的な振る舞いを持つ、より高度なプログラムを構築するための基本となる。プログラムは上から下へ順番に処理を実行するという原則があるが、if文やbreak文といった制御構文を適切に使うことで、その流れを柔軟にコントロールし、複雑な要件やルールを正確にコードに落とし込むことが可能になる。バグの修正や機能の改善を行う上で、処理の実行順序と条件分岐を正確に理解し、使いこなす能力は極めて重要である。