【python超初級】python初心者が数当てゲーム作ってみるよ【その3】
今さらながらpythonの勉強を始めました。他の言語を少しばかり触ったことはあるのですが、
pythonを扱うのは初めてなので、練習がてら簡単な数当てゲームを作成してみます。
4桁の異なる数値をランダムに生成して一致するまでに何ターンかかったかを競う有名なゲームです。
正式な名前は「ヒットアンドブロー」とか「マスターマインド」っていうみたいですね。(知らなかった。笑)
ルールは、
・重複のない4桁の数字(0~9)を当てる
・回答すると、その都度、ヒットとブローの数が出る
・ヒットは数字も桁の場所も同じ。ブローは数字はあたっているけど桁の場所が違う
・なるべく回数で答えたほうが良い
という感じです。
コマンドライン上で実行できるシンプルな造りにします。
(というか筆者がレベル的にまだそれしかできないです…)
なお、if文やfor文などの構文の解説は省きます。
それではスタート!!
※注 筆者はpython3.6.1をインストールしています。
【STEP5】当たり判定を行い、正解したら正解までにかかった回数を表示する
今回が最後の処理です。当たり判定を行い、桁と数値が両方とも一致していればヒット(H)、
数値は一致しているけど桁が違う場合はブロー(B)を表示するコードを記述していきたいと
思います。
記述するファイルは「hitAndBlow.py」に記述していきます。
≪hitAndBlow.py≫
import myDef answer_count = 0 print("数当てゲームを開始します。") #ランダムな4桁の値を生成する answer_num_ary = myDef.make_random_num() while True: hit_count = 0 blow_count = 0 #入力した4桁の値を取得する (my_answer_num, my_answer_num_ary) = myDef.input_and_check() answer_count += 1 for i in range(4): for j in range(4): if i == j and answer_num_ary[i] == my_answer_num_ary[j]: hit_count += 1 elif i != j and answer_num_ary[i] == my_answer_num_ary[j]: blow_count += 1 print("【" + str(answer_count) + "回目の解答】") print(str(my_answer_num) + "は【" + str(hit_count) + "H、" + str(blow_count) + "B】です。") if hit_count == 4: print("正解です!正解するまで" + str(answer_count) + "回かかりました!") break
answer_num_ary(正解となる数値の配列)とmy_answer_num_ary(自分が入力した数値の配列)
の値を繰り返し文で比較していきます。
16、17行目ではiとjが一致していて、かつ数値も一致している場合の処理になります。
つまり桁と数値が両方とも一致している場合になりますので、ヒットのカウントを増やします。
18、19行目ではiとjが一致していないが、数値は一致している場合の処理になります。
つまり桁は違うけど数値はある場合になりますので、ブローのカウントを増やします。
20、21行目でヒットとブローの数を表示します。20行目では何回目の解答なのかも併せて表示する
ようにしています。
22~24行目でヒットが4だった場合の処理、つまり正解した場合の処理を行っています。
正解のメッセージとともに、正解するまで何回かかったかを表示して、最後にbreakして
処理を抜けて終了しています。
これで完成です!!お疲れ様でした!!
最後にこのプログラムを実行したときの一例を載せておきます。
簡単なプログラムですので皆さんも試してみてください!
数当てゲームを開始します。 4桁の数値を入力してください:1234 【1回目の解答】 1234は【0H、2B】です。 4桁の数値を入力してください:1111 【エラー】重複のない4桁の数値を入力してください:8123 【2回目の解答】 8123は【2H、0B】です。 4桁の数値を入力してください:2222 【エラー】重複のない4桁の数値を入力してください:こんにちは 【エラー】重複のない4桁の数値を入力してください:12345 【エラー】重複のない4桁の数値を入力してください:8412 【3回目の解答】 8412は【2H、1B】です。 4桁の数値を入力してください:8462 【4回目の解答】 8462は【2H、2B】です。 4桁の数値を入力してください:8426 【5回目の解答】 8426は【4H、0B】です。 正解です!正解するまで5回かかりました!