1|2while文を使って数当てゲームを作ってみる前回の冒頭では繰り返し処理の一例として「数当てゲーム(前もって「当たりの数値」を決めておき、ユーザーがそれを当てるまでの間、ユーザーからの入力を受け付け、それが「当たり」か「外れ」かの判定を繰り返す)」を挙げた。そこで、数当てゲームを何種類かの方法で書きながら、while文やif文とその条件(比較演算子の使い方)などを見ていこう。その前にプログラムの大枠について簡単に見ておく(まだ説明していない要素もあるので、それについては「そんなものか」と読み飛ばしてほしい)。ここでは、コメントとして大枠を書いておいて、後からそれを実際のコードに落とし込んでいこう。「当たりの数値」は1〜100の範囲に含まれる整数値とする。「繰り返し処理が終了」=「当たりの数値が入力された」となるので祝福する数当てゲームの大枠(1)最初の2行が本連載ではまだ取り上げていない事項だ。「乱数を使うための準備」とは「Pythonには標準で組み込まれていない乱数機能を使うよ」とPythonに教えてやることだ。これには「import文」が使える。import文を使うと、Pythonには標準では備わっていない「機能」を取り込んで使えるようになる。今回は「乱数」を扱うための「randomモジュール」を利用する。random」と書くだけだ(randomモジュールはPythonと一緒に配布される「標準ライブラリ」に含まれているので、これを書くだけですぐに使える)。次の行の「当たりの数値」を前もって決めるには、このモジュールが提供するrandint関数を使う。この関数は2つの引数aとbを受け取ると、「a以上、b以下」の範囲に収まるランダムな整数値を返してくれる。これを変数answerに保存しておこう。上でも述べたが、「当たりの数値」は「1〜100の範囲に収まる整数値」とすると、最初の2行は次のようになる。「繰り返し処理が終了」=「当たりの数値が入力された」となるので祝福する数当てのゲームの大枠(2)ちょっと注目してほしいのは、「ユーザーから最初の入力を受け付ける」という部分だ。その下の3行がwhile文で行う処理となるが、そこにたどり着く前に一度はユーザーに数値を入力してもらわないと、while文で「ユーザーが当たりの数値を入力したか」の判定ができないので、このようになっている(二度目以降のユーザー入力の受け付けはwhile文の中で行う)。「while文で処理を行う前に、必要な初期情報をセットアップしておく」のはよくあるパターンなので覚えておこう。「ユーザーが『当たりの数値』を入力するまでは以下を行う:」とその下の2行がwhile文を使って繰り返し処理を行っていく部分だ。while文が終わるのは、ユーザーが「当たりの数値」を入力したときなので、その後で祝福のメッセージを表示すればよい。実際のコードを考えていこう。バージョン1では、上記のコードではどのような形で繰り返し処理を行うかを考えてみる。すると、次のような手順が考えられる。ユーザーから最初の入力を受け付ける(変数numberに保存することにする)「ユーザーが当たりの数値を入力する」までwhile文で繰り返し処理を行う繰り返し処理の中では、変数numberの値が、変数answerの値よりも大きいまたは小さいことを伝えるメッセージを表示して、ユーザー入力を受け付ける手順1と手順3の処理にあるユーザー入力の受け付けについては、input関数でユーザーから受け取った文字列をint関数で整数値に変換したものを変数numberにとっておけばよいだろう(第4回の「文字列と数値の変換:str/int/float関数」を参照)。よって、上の手順を疑似的なコードにまとめると次のようになる。正解です!')「当たりの数値」を決定し、ユーザー入力を受け付けるまでをコードにしたものところで、手順2の「ユーザーが当たりの数値を入力するまで」を表現するコードはどんなものだろう。「ユーザーが当たりの数値を入力するまで」とは、「ユーザーが入力した値と当たりの数値が同じになるまで」ともいえる。これは「ユーザーが入力した値と、当たりの数値が等しくない間」は「手順3を繰り返し実行する」とも読み替えられる。ユーザーが入力した値は変数numberに、当たりの数値は変数answerに保存されているので、これを比較すればよいということだ。「2つの値が等しくない」ことを調べるには「比較演算子」のうち、「!=」演算子を使う。これは演算子の左右の値が等しくないときにはTrueが演算結果として、等しいときにはFalseが演算結果とするものだ。answer」と書ける。number」となる手順3では、変数answerの値と変数numberの値を比較して、前者が小さければ「小さい」と表示して、そうでなければ「大きい」と表示して、もう一度ユーザーから入力を受け付ければよい。この比較にはif文を使えばよいだろう。if文の条件には、やはり比較演算子の「<」演算子または「>」演算子が使える。「<」演算子は左側の値(被演算子)が右側の値(被演算子)よりも「小さい」ときにはTrueを演算結果として、そうでなければFalseを演算結果とする。「>」演算子はその逆だ。number」の値がTrueなら「小さい」と表示して、そうでなければ「大きい」と表示すればよい。よって、コードは次のようになる(大小関係を伝えるメッセージは少し丁寧な表現にしてある。正解です!')完成した数当てゲームのプログラム最初のバージョンのプログラムはこれで完成だ。実際に実行してみよう。数当てゲームの実行画面ここで幾つか考慮すべき点について述べておこう。ユーザーが最初から当たりの数値を入力したときの動作について考えてみる。number」が成り立たない。よって、繰り返し処理は一度も実行されない。if文の中では「<」演算子を使っているが、その条件分けで「変数answerの値と変数numberの値が等しい場合」を考慮していないようにも見える。if文が実行されるのはそもそも「これら2つの変数の値が等しくない場合」なので問題はない。それから、if文の条件で「>」演算子を使うとコードがどうなるかだ。これについては自分で考えてみよう。次に、上記のコードでwhile文の条件を別のものにしてみよう(演習問題のようなものだ)。バージョン2先ほどは数当てゲームの大枠として次のようなものを見てもらった。「繰り返し処理が終了」=「当たりの数値が入力された」となるので祝福する数当てゲームの大枠この中で「ユーザーから最初の入力を受け付ける」のが「美しくない」と感じる人もいるかもしれない(プログラミングに慣れてくると、それがよくあるパターンと感じられるようにもなるが)。そこでwhile文の条件を変えて、この行をなくしてみよう。これには「無限ループ」と呼ばれるものを使う。「無限ループ」とはもちろん、「ループ(繰り返し処理)が無限に続く」ことを意味した言葉だ。while文は「条件が真である間」は繰り返し処理を続ける。そこで「条件」にブール値のTrueをそのまま書いてみるとどうなるだろう。True:ブロック無限ループこうすると、while文に記述したブロックの内容が永遠に実行され続ける。プログラムは永遠に終わらないかというとそうでもない。前回紹介した「break文」は「それを囲んでいる最も内側のループを終了させる」ものだった(for文でもwhile文でも利用可能。continue文も同様だが、ループを終了させるのではなく、次のループを開始する)。これを使えば、無限ループの中で何らかの条件判断を行って、条件が成立したときには、それを終了させられる。これを使って先ほどの大枠を書き換えたものが以下だ。True:」と表現できる。その下の「ユーザーからの入力を受け付ける」も既に見た。その下の条件分岐にはif〜elif〜else文を使えばよいだろう。これを実際にコードにすると次のようになる(実行結果は省略)。正解です!')無限ループを使った数当てゲームのコードバージョン1とバージョン2のどちらかがよくて、どちらかが悪いというものではなく、while文やif文では「同じ条件でも表現の方法が1つだけとは限らない」ということだ。複数の条件をand演算子やor演算子でつないで記述するのが正解なこともあれば(第9回の「if文の条件と比較演算子とブール演算子」を参照)、頭の中で条件を整理してシンプルに記述する方がよいこともある。条件の真偽を反転させた方が分かりやすいコードになることもある。その時々に応じて、分かりやすい条件を書くように心掛けよう。まとめ今回はwhile文を紹介した。数値/文字列などの基本的なデータや変数、各種の演算子と、今回までに3回に分けて紹介してきたif文/for文/while文を組み合わせることで、より高度なプログラムを記述できるようになる。次回は、Pythonの関数について見ていく。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。