pythonでNumer0n(ヌメロン)を作る part3


<はじめに>

pythonでNumer0n(ヌメロン)を作る part2の続きです。

今回作成したもの

今回は➀1度予想した数字は以後予想しない。eatとbiteを足して3の時、以後それらの数字のみ使う。の2つの機能を付け加えました。

コード全体

import random
available_number = [0,1,2,3,4,5,6,7,8,9]

while True:
    my_number = input("0~9の数字を使って3桁の数字を作ってください(重複なし)")
    if my_number.isdigit() and len(set(my_number)) == 3:
        break
used_number = []
times = 0
enemy_number = None
while enemy_number != my_number:
    times+=1
    while True:
        selected_number = random.sample(available_number,3)
        enemy_number = "".join(map(str,selected_number))
        if used_number.count(enemy_number) != 0:
            continue
        break
    eat = sum(my_number == enemy_number for my_number, enemy_number in zip(my_number, enemy_number))
    bite = sum(enemy_number in my_number for enemy_number in enemy_number) - eat
    if eat == 0 and bite == 0:
        available_number.remove(selected_number[0])
        available_number.remove(selected_number[1])
        available_number.remove(selected_number[2])
    if eat + bite == 3:
        available_number = selected_number
    used_number.append(enemy_number)
    print("コンピューターが予想した番号:", enemy_number)
    print(f"{times}回目: {eat}EAT {bite}BITE")
    print("----------------------------------------")

print("数字を当てました!!!褒めてください!!!")
print(f"{times}回目で当てられました。")

補足

その1 1度使った数字の格納
・used_number(8行目)に1度予想した数字を格納します。
enemy_numberがused_numberと重複していないかをcountを使って調べています。(16行目)

その2 eat + bite = 3の時の対応
・この条件を満たすのは3eat 0bite,1eat 2bite,0eat 3biteのときです。(1eat 2bite,2eat 1biteなどは今回のゲームでは成り立ちません)また、3eat 0biteは正解の時なので、1eat 2bite,0eat 3biteが出たときに以後それらの3つの数字を使うようにします。その1で述べたように、今回は同じ数字を予想することはないので、この条件が成り立てば少なくともあと5回の予想で数字を当てられるということになります。条件を満たすとき、available_number = selected_number(26行目)でavailable_numberを更新します。

考察


前回と同じように200回試行しました~

おわりに

だいぶ強くなったようです。うれしいです"(-""-)"
正直ここからさらに強くさせるのは一気に難易度が上がりそうな気がします。ぐぬぬぬぬ
コメントお待ちしております。
最後まで読んでいただきありがとうございました。