【python超初級】python初心者が数当てゲーム作ってみるよ【その2】
今さらながらpythonの勉強を始めました。他の言語を少しばかり触ったことはあるのですが、
pythonを扱うのは初めてなので、練習がてら簡単な数当てゲームを作成してみます。
4桁の異なる数値をランダムに生成して一致するまでに何ターンかかったかを競う有名なゲームです。
正式な名前は「ヒットアンドブロー」とか「マスターマインド」っていうみたいですね。(知らなかった。笑)
ルールは、
・重複のない4桁の数字(0~9)を当てる
・回答すると、その都度、ヒットとブローの数が出る
・ヒットは数字も桁の場所も同じ。ブローは数字はあたっているけど桁の場所が違う
・なるべく回数で答えたほうが良い
という感じです。
コマンドライン上で実行できるシンプルな造りにします。
(というか筆者がレベル的にまだそれしかできないです…)
なお、if文やfor文などの構文の解説は省きます。
それではスタート!!
※注 筆者はpython3.6.1をインストールしています。
【STEP2】4桁の数値を入力する
今回はコンソール画面上からキーボードの入力を行い、そもそも数値かどうかや4桁の数値なのか
を判別するコードを実装したいと思います。
前回書いたコードは次のようになっています。
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()関数を用います。
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桁の異なる数値が入力される
まで何度も入力させるようにしましょう。
以下のコードを追加します。
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関数で出力しています。
今までのコードをまとめると次のようになります。
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文の処理を関数にしたいと思います。