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


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

  • このエントリーをはてなブックマークに追加

PAGE TOP