【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文の処理を関数にしたいと思います。