見出し画像

#39 Hit & Blow

● 問題

4けたの数当てゲームです

1~6(重複なし)を使った4けたの数字を当てるゲームです。
次の2つのヒントをもとに,コンピュータが決めた4けたの数字をなるべく少ない回数で当てましょう。
ヒントの出方がおかしいようです。全正解でなくても終了してしまいます。

<ヒント>
Hit 数字も位置(けた)も正解
Blow 数字は正解だが位置(けた)が違う
例:3H1B・・・Hit 3 , Blow 1
例:4H0B・・・Hit 4 , Blow 0  すべて正解!

import random
secret_number = ['1','2','3','4','5','6']
random.shuffle(secret_number)
hit = 0
blow = 0
count = 0
while hit < 3:
    input_number = input('数を入力してください')
    count += 1
    for i in range(4):
        for j in range(4):
            if secret_number[i] == input_number[j]:
                if i == j:
                    hit += 1
                else:
                    blow += 1
    print(str(hit)+'H'+str(blow)+'B')
print(str(count)+'回で正解しました')
数を入力してください1234
0H3B
数を入力してください2345
1H6B
数を入力してください4563
3H0B
1回で正解しました

● 解答

Hit と blow の数は,最大で4ですが,それを越えています。
Hit と blow が初期化されていません。
また,3H0B で全正解となって終了してしまいます。
終了判定が間違っています。

import random
secret_number = ['1','2','3','4','5','6']
random.shuffle(secret_number)
hit = 0
blow = 0
count = 0
while hit < 4:
    hit = 0
    blow = 0
    input_number = input('数を入力してください')
    count += 1
    for i in range(4):
        for j in range(4):
            if secret_number[i] == input_number[j]:
                if i == j:
                    hit += 1
                else:
                    blow += 1
    print(str(hit)+'H'+str(blow)+'B')
print(str(count)+'回で正解しました')
数を入力してください4251
3H0B
数を入力してください4253
3H0B
数を入力してください4256
4H0B
3回で正解しました

secret_number = ['1','2','3','4','5','6'] と random.shuffle(secret_number) で6つの数字をランダムに並び替え,それを先頭から4つ使うことで4けたの数としています。
input関数で入力された数字は文字として扱われるので,if文で比較するときに型変換しなくていいように,secret_number = [1,2,3,4,5,6]とリストの中身を整数ではなく,secret_number = ['1','2','3','4','5','6']と文字列にしています。
データをランダムに並び替えるプログラムは,乱数を発生してfor文などで2つのデータを入れ替える処理を繰り返すのですが,Pythonの場合は shuffle だけでランダムに並び替えられるので,プログラムがとても短くなります。
プログラムが短いということはそれだけエラーの発生が少なくなるということです。

#Python  #プログラミング

この記事が気に入ったらサポートをしてみませんか?