こんにちは、森山です。
前回は比較演算子とbool 型を学びましたが、今回はHIGH&LOWゲームを作るために重要な「もし〜ならば」という条件によって処理を変えることのできるif文について学んでいきましょう。
前回のコラムでも触れたように、英語の授業で習う「if〜」という表現は、プログラムではif文と呼ばれ、「もし〜ならば」という時に使うことができます。
条件分岐とは
プログラムでは、条件によって処理を切り替えたいという場面がよく出てきます。
その「条件によって動きを変える」という仕組みを作るのが条件分岐と言われる方法で、if文がその代表的な書き方になります。
条件分岐は2パターンとは限りません。3パターン以上に分かれる場合もあります。
基本的には、「もし〇〇なら〇〇。それ以外は△△。」という考え方になります。
この書き方を覚えると、条件ごとに処理を切り替えられるようになり、さまざまな動きを表現できるようになります。
例えばRPGでも、敵に遭遇した時に「逃げる」か「戦う」かを選ぶことで、その後の展開が変わっていきます。こうした行動の切り替えも、条件分岐を組み合わせることで実現できます。
if文の書き方
今までのコードは1行で完結する処理ばかりでしたが、条件分岐では「もし〜なら」と「その時だけ実行する処理」を行を分けて書いていきます。そのため、if文は1行だけで終わらず、必ずその下に続く処理ブロックがセットになっています。
この時重要なのが書き方のルールで、条件を書く行末に付ける「:(コロン)」と、その下に続けて書く時の「インデント(半角スペース 4 つ)」と呼ばれる段下げです。「:」が付いていることで、Pythonは「この行の条件に続く処理が、この後の行に書かれている」と認識してくれます。
「:」を忘れてしまうだけで、文法として成立していないと判断され、SyntaxError という文法(構文)エラーが出てしまいます。
if文に慣れない内は、この「:」や「インデント」を忘れてしまうことがよくあります。実行した時に SyntaxError と出た場合は、「:」や「インデント」が正しいか確認するようにしましょう。
それでは実際にどう書くのか見ていきましょう。
例えば4パターンに処理を分ける場合、以下のように書きます。
if (もしの時の条件①):
その場合実行する内容
elif (①に当てはまらなかった場合の条件②):
その場合実行する内容
elif (②に当てはまらなかった場合の条件③):
その場合実行する内容
else:
全てに当てはまらない場合実行する内容このように、
- 条件を書く行 ※行末に「:」が付く
- その条件がTrue(正しい)時に実行される処理 ※行頭に「インデント」が入る
という2層構造になっているのがif文の基本的な形です。
また、if と else は1回ずつしか使えないのがルールですが、間にある elif は何度でも使うことができます。(ちなみに elif とは else if の略になります。)
そしてこの条件を作る部分で、前回のコラムで学んだ比較演算子が活躍します。
HIGH&LOWゲームの条件を考えてみよう
それでは前回途中まで考えたHIGH&LOWゲームの続きを考えていきましょう。
今回は「今のカード」「次に出たカード」、そして「プレイヤーの予想」と3つの変数を準備して、「今のカード」「次に出たカード」にはぞれぞれ1〜13のいずれかの数字を代入する方法で作ります。
「次に出たカード」の方が数値が大きい、つまり「HIGH」の場合は「あなたの勝ち!」と出力します。
では、次のカードが今のカードより小さい場合はどうなるのでしょうか。
この場合は next_card > now_card が成り立たないため、if文の条件はFalseとなり、else が実行されて「LOW」と判断されます。
今回のコードでは、今のカードが7で次のカードが11なので 11 > 7 はTrueとなります。
そのため、プレイヤーが「HIGH」を選んだ場合は正解になり、「あなたの勝ち!」と出力されます。
このように、次のカードが今のカードより大きいか小さいかによって結果が分かれ、その判断をif文で表現しています。
つまり下記のようになります。
if 「次に出たカード」の方が数値が大きい場合:
「あなたの勝ち!」と出力する
else:
上の条件に当てはまらない場合(結果として LOW の場合)
「あなたの負け…」と出力するこのように、2つの値を比較して判断するという場面では、比較演算子が重要になってきます。
実際にHIGH&LOWゲームを作ってみよう
文章だけではわかりづらいと思いますので、Pythonコードを実際に動かしてみましょう。
プレイヤーに HIGH か LOW を入力してもらって、入力した値によって、勝ち負けを出力するという条件分岐と、HIGH か LOW 以外の文字列が来た時の処理も入れたコードにしたいと思います。
実際のコードは以下のようになります。
# 今と次のカードを固定値にする
now_card = 7
next_card = 11
# プレイヤーに予想を聞く
print(f"今のカードは {now_card} です。")
player_guess = input("次のカードは HIGH か LOW か?(大文字で入力): ")
# 結果判定
if next_card > now_card:
result = "HIGH"
else:
result = "LOW"
print(f"次のカードは {next_card} でした。")
if player_guess == result:
print("あなたの勝ち!")
elif player_guess == "HIGH" or player_guess == "LOW":
print("あなたの負け…")
else:
print("予想は HIGH か LOW で入力してください!")※「#」で書かれている文章とは何?
Pythonでは行の先頭に #(シャープ)を付けると、その行は「コメント(説明文)」として扱われます。コメントとはプログラムとして実行されないので、読みやすくするためのメモなどに使われます。
上のコードをGoogle Colabにそのまま貼り付けて実行してみてください。
実行すると画面に「次のカードは HIGH か LOW か?」と出てきます。
HIGH や LOW 、またはそれ以外の文字を入れると、if文の条件がどのパターンに進んだのかがわかって、条件分岐の流れがつかめるようになると思います。
これでHIGH&LOWゲームの動きとしては完成しましたが、変数が固定なので毎回結果が同じで面白みがなくて、ゲーム性が足りないですよね。
どうすればゲーム性を出せるのか…
ここで、初回のコラムで実行した占いプログラムを思い出してみてください。あの占いプログラムを何度か実行した方はわかると思いますが、ランダムに占い結果が出てきましたよね。
同じように今回のHIGH&LOWゲームでも数字がランダムになると、もっとゲームらしくなりそうです。
それを実現するには、占いプログラムでも使っていましたが、random モジュールというものを使うと、ランダムに数字を変えることができます。
今回の条件分岐にランダムな数字を組み合わせて、ゲーム性の高いHIGH&LOWゲームを作りたいので、次回はモジュールについて学んでいきたいと思います。
ちなみにハイスクールPythonでは「6.5 モジュールを import して便利な機能を使う」や10章で紹介されています。
既にハイスクールPythonで10章まで学んでいる方は、ランダムな数字を変数に入れてHIGH&LOWゲームを作れるか、ぜひ挑戦してみてください。その場合、条件分岐は勝ち負けの他に引き分けを入れた3パターンになるので、その場合比較演算子がどうなるのかも考えながら挑戦してみてください。
最後までお読みいただき、ありがとうございました。
それではまた次回お会いしましょう!
