こんにちは、森山です。
前回のコラムでは「繰り返し処理(for文)」を学び、「10連ガチャ」のプログラムを作りましたね。
SSRは引けたでしょうか?確率を少し高めにしていたので、何回か実行すればSSRが出た人もいるかもしれません。
でも、もしSSRの確率が1%だったらどうでしょうか。
なかなか出ませんよね。もしかしたら100回以上かかるかもしれません。
ここでポイントとなるのは、「SSRが出るまで引き続ける」という考え方です。
前回のfor文は「10回繰り返す」のように、最初から繰り返す回数が決まっていました。
でも今回は違います。「何回引けばSSRが出るか」はわかりません。
「10回繰り返す」という条件が「SSRが出るまで繰り返す」に変わると、プログラムはどんな書き方になるでしょうか?このようなプログラムを作りたいときに便利なもうひとつの繰り返し処理があります。
今回はハイスクールPython「4.3 while 文で条件が変わるまで繰り返す」で紹介されている while文 について学んでいきたいと思います。
while文とは?
while文は「ある条件を満たすまでの間、ずっと繰り返す」という処理です。
for文とwhile文の役割を整理すると、以下のようになります。
- for文(回数ループ):最初から「何回繰り返すか」が決まっている。
- while文(条件ループ):「ある条件を満たすまで」繰り返す。ループする回数は決まっていません。
while文を例えて理解する
前回、for文を【自動詠唱の魔法陣】に例えましたね。魔法陣にセットした回数だけ、同じ呪文を自動で唱え続けるイメージでした。
for文が【回数指定の魔法陣】なら、while文は【門番が立つ扉】のイメージです。門番は 「条件が満たされているか?」という判断を、第3時限目で学んだbool型(TrueかFalseか)で行います。
- 門番の答えが YES(True) の間:扉は開かれ、中の呪文(処理)が実行されます。
- 門番の答えが NO(False) になった瞬間:門番はガシャンと扉を閉め、繰り返しを終了させます。
つまり、「条件を満たしている間だけ扉を開け続ける(繰り返し処理を行う)」という役割を持っています。条件が満たされなくなった瞬間、繰り返し処理を抜けて次の処理へ進みます。
今回のガチャで言えば、「SSRが出ていない間は、ガチャを引き続ける」という繰り返し処理です。SSRが出た瞬間に処理が終了して、ガチャを引くことを止めます。
「10回」や「100回」と回数が決まっていなくても、「敵の体力が0になるまで」や「正解のパスワードが入力されるまで」というように、特定の状態になるまで繰り返したい時に、このwhile文を使います。
while文の書き方のルール(マナー)
では、while文の「基本の形」を確認しておきましょう。
while 条件式:
# 条件が Trueの間、繰り返す処理for文と同じように、行末にコロン(:) を付けて、繰り返したい処理はインデントして書きます。このルールはPythonの書き方として共通している書き方でしたね。
for文との大きな違いは、range(10) のような「回数の指定」がなく、代わりに条件式を書くところです。この条件式が True(正しい)である限り、処理がずっと繰り返されます。
SSRが出るまでガチャを引き続けるプログラムを作ろう!
それでは実際に、「SSRが出るまでガチャを引き続ける」プログラムを作ってみましょう。
今回は前回よりも少し本格的なガチャにして、SSRの確率を 1% にしてみます。これくらい低いと、何回引けば出るかまったくわかりません。まさにwhile文の出番です。
import random
print("--- SSRが出るまでガチャを引き続けます! ---")
count = 0 # 引いた回数をカウントする変数
got_ssr = False # SSRが出たかどうかを管理する変数(最初はFalse=出ていない)
while got_ssr == False: # SSRがまだ出ていない間、繰り返す
r = random.random() # 0.0 以上 1.0 未満の乱数を取得
count += 1 # 引くたびに回数を1増やす
# Rが89%、SRが10%、SSRが1%の確率
if r < 0.89:
result = "R(レア)"
elif r < 0.99:
result = "SR(Sレア)"
else:
result = "SSR(超絶レア!)"
got_ssr = True # SSRが出たら、got_ssrをTrueに変える
print(f"{count}回目:{result}")
print(f"\n{count}回目でSSRが出ました!おめでとうございます!")このプログラムをGoogle Colabで実行してみてください。SSRが出るまで自動でガチャを引き続け、何回目で出たかが最後に表示されます。運が良ければ数回、運が悪ければ数十回かかることもあるはずです。
何回目でSSRが出たでしょうか?while文の場合は、繰り返す回数が決まっていないので、実行する度に回数が違っていきます。
ここがポイント!
got_ssr = Falseという変数の使い方
このプログラムでは、got_ssr(SSRが出たかどうか)という変数を用意しています。最初は False(まだ出ていない)にしておき、SSRが出た瞬間に True(出た!)に書き換えます。
True や False のように「正しい/正しくない」という2種類の値だけを持つ変数のことを、bool型(ブール型) と学びましたね。スイッチのON/OFFのようなイメージで、「ある状態が成立しているかどうか」を管理するときにとても便利な型です。
count += 1 とは?
count += 1 は count = count + 1 と同じ意味で、「countの値を1増やす」という命令です。+= は「今の値に足して、そのまま上書きする」という記法で、カウンターを作るときによく使われます。
while文の条件が False になった瞬間にループが止まる
while got_ssr == False: と書いているので、got_ssr が True になった瞬間に条件が「満たされなくなった」と判断され、ループが終了します。番人が扉を閉める条件ですね。
無限ループに注意!
while文を使う上で、ひとつ大切な注意点があります。それが無限ループです。
while文は「条件が満たされている間ずっと繰り返す」ので、条件が永遠に True のままだと、プログラムが終わらなくなってしまいます。
今回のプログラムで言えば、もし「SSRが出ても got_ssr = True に書き換えるコードを書き忘れた」場合、永遠にガチャが回り続けてしまいます。
もし実行中に「あれ、止まらない…」と感じたら、Google Colab のセル左側にある停止ボタン(■)をクリックしてプログラムを停止させてください。
それでも止まらないような場合は、落ち着いて Google Colab を開いているブラウザのタブを閉じてプログラムを強制終了させてください。
while文を書くときは「この条件は、いつか必ず False になるか?」を確認する習慣をつけましょう。
while文で広がる「自動化」の世界
while文を使えるようになると、プログラムでできることがさらに広がります。ゲームなどでも条件が満たされないと次に進めないことがよくありますよね。
- 正解が出るまでランダムに試し続ける数当てゲーム。
- ダンジョン探索で「宝箱を見つけるまで」歩き続ける自動プレイ。
- 「レベルが10になるまで」アイテムを消費する修行モード。
これらはまさにwhile文の考え方で、すべて「いつ終わるかわからない繰り返し」です。for文とwhile文を使い分けられるようになると、プログラムはぐっと表現の幅が広がっていきます。
繰り返し処理を考えていくと、「ここで終了させたい」「この回はスキップしたい」という時が出てくると思います。そんな時に便利な break と continue という書き方も存在します。これは while True: という無限ループのプログラムの時にも使われる書き方で、ハイスクールPythonの「4.3 while 文で条件が変わるまで繰り返す」で詳しく紹介されています。ぜひ無限ループのプログラムにも挑戦してみてください。
最後までお読みいただき、ありがとうございました。
それでは、また次回お会いしましょう!

