【python超初級】python初心者が数当てゲーム作ってみるよ【その2】
今さらながらpythonの勉強を始めました。他の言語を少しばかり触ったことはあるのですが、
pythonを扱うのは初めてなので、練習がてら簡単な数当てゲームを作成してみます。
4桁の異なる数値をランダムに生成して一致するまでに何ターンかかったかを競う有名なゲームです。
正式な名前は「ヒットアンドブロー」とか「マスターマインド」っていうみたいですね。(知らなかった。笑)
ルールは、
・重複のない4桁の数字(0~9)を当てる
・回答すると、その都度、ヒットとブローの数が出る
・ヒットは数字も桁の場所も同じ。ブローは数字はあたっているけど桁の場所が違う
・なるべく回数で答えたほうが良い
という感じです。
コマンドライン上で実行できるシンプルな造りにします。
(というか筆者がレベル的にまだそれしかできないです…)
なお、if文やfor文などの構文の解説は省きます。
それではスタート!!
※注 筆者はpython3.6.1をインストールしています。
【STEP2】4桁の数値を入力する
今回はコンソール画面上からキーボードの入力を行い、そもそも数値かどうかや4桁の数値なのか
を判別するコードを実装したいと思います。
前回書いたコードは次のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import random answer_num_ary = [] while len (answer_num_ary) < 4 : #ランダムな4桁の数値を生成し、answer_num_aryに同じ値があれば #追加しない。同じ値が無ければanswer_num_aryに追加する。 random_num = random.randint( 0 , 9 ) append_flg = True #answer_num_aryに追加するかのどうかのフラグ。Trueならば追加しFalseなら追加しない for ary_element in answer_num_ary: if ary_element = = random_num: append_flg = False #すでに同じ値があるならappend_flgをFalseにする break if append_flg = = True : answer_num_ary.append(random_num) append_flg = True |
この下にコードを追加していきましょう。キーボードからの入力を受け付けるにはinput()関数を用います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import random #randomモジュールをインポートする。これをしないとrandom関数使えない answer_num_ary = [] while len (answer_num_ary) < 4 : random_num = random.randint( 0 , 9 ) append_flg = True for ary_element in answer_num_ary: if ary_element = = random_num: append_flg = False break if append_flg = = True : answer_num_ary.append(random_num) append_flg = True input_num = input ( "数当てゲームを開始します。\n4桁の異なる数値を入力してください:" ) #この行を追加する |
17行目を追加します。
これを実行するとコンソール画面上に文字が出力され、さらにキーボードから入力することができます。
入力した値を変数input_numに代入します。
次に、このinput_numがちゃんと数字なのか(文字などが入力されていないか)、4桁の異なる数値なのか
の判別を行うコードを書いていきます。前回と同じくwhile文を使って、4桁の異なる数値が入力される
まで何度も入力させるようにしましょう。
以下のコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | input_num = input ( "数当てゲームを開始します。\n4桁の数値を入力してください:" ) #この行を追加する input_continue_flg = True #入力を繰り返すフラグ。Trueの限り繰り返し、Falseになったら入力に誤りがないので入力をストップする while input_continue_flg = = True : input_num_ary = [] if input_num.isdigit() = = False : #負の整数、小数、および文字列が入力されていた場合エラー input_num = input ( "【エラー】4つの整数値を入力してください。:" ) elif input_num.isdigit() = = True : #正の整数が入力されていた場合にはこっちの処理 if len (input_num) ! = 4 : #4桁ではなかった場合エラー input_num = input ( "【エラー】4つの異なる数値を入力してください:" ) else : input_num2 = int (input_num) #4桁だった場合は重複が無いかチェックする for i in range ( 0 , 4 ): input_num_ary.append(input_num2 / / ( 10 * * ( 3 - i))) input_num2 = input_num2 % ( 10 * * ( 3 - i)) #set()を使うことでリスト内の重複していない要素だけを取得する。長さが4になっていなければ重複しているのでエラー if len ( list ( set (input_num_ary))) ! = 4 : input_num = input ( "【エラー】重複のない4つの数値を入力してください。:" ) #長さが4になっていれば重複していないのでループから抜ける else : input_continue_flg = False print ( "入力した値は" + input_num + "です。" ) |
4行目からループの処理を行っています。
6行目や8行目でisdigit()関数を用いていますが、この関数は入力した値が正の整数ならTrueを、
それ以外の小数や負の値やそもそも数値ではない文字列ならFalseを返すします。
Falseなら問答無用でアウトで入力のやり直しをさせます。
Trueの場合は数値ではありますが、4桁以外はアウトなのでその判別を9行目と10行目で行っています。
もちろんアウトなら入力のやり直しです。
11行目から4桁の数字だった場合の処理で、重複のチェックを行っています。
13行目から15行目で4桁の数字の各桁の値を取り出してinput_num_aryのリストに追加しています。
17行目でそのinput_num_aryのリストをset()関数にかけています。set関数では重複している要素は1つとして
扱われます。例えば[1, 4, 5, 4]という4つの数値だった場合、set関数にかけると[1,4,5]となります。
つまり、重複がある場合は配列の要素数が4つになりません。
18行目でリストの長さが4ではない場合は重複があるということですので、エラーとして入力のやり直しを
させています。
20行目と21行目では、これらすべてのチェックをクリアすれば4桁の異なる数字であるといえるので、
繰り返し分から抜けてprint関数で出力しています。
今までのコードをまとめると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | import random answer_num_ary = [] while len (answer_num_ary) < 4 : random_num = random.randint( 0 , 9 ) append_flg = True for ary_element in answer_num_ary: if ary_element = = random_num: append_flg = False break if append_flg = = True : answer_num_ary.append(random_num) append_flg = True input_num = input ( "数当てゲームを開始します。\n4桁の数値を入力してください:" ) input_continue_flg = True while input_continue_flg = = True : input_num_ary = [] if input_num.isdigit() = = False : input_num = input ( "【エラー】4つの整数値を入力してください。:" ) elif input_num.isdigit() = = True : if len (input_num) ! = 4 : input_num = input ( "【エラー】4つの異なる数値を入力してください:" ) else : input_num2 = int (input_num) for i in range ( 0 , 4 ): input_num_ary.append(input_num2 / / ( 10 * * ( 3 - i))) input_num2 = input_num2 % ( 10 * * ( 3 - i)) if len ( list ( set (input_num_ary))) ! = 4 : input_num = input ( "【エラー】重複のない4つの数値を入力してください。:" ) else : input_continue_flg = False print ( "入力した値は" + input_num + "です。" ) |
今回はこれで終わりです。次回は作成した2つの数値を求めるwhile文の処理を関数にしたいと思います。