【python超初級】python初心者が数当てゲーム作ってみるよ【その4】


【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回かかりました!
  • このエントリーをはてなブックマークに追加

PAGE TOP