数字当てゲームについてのアドバイスをください{Python}
数字当てゲームについてのアドバイスをください{Python}。
Python初学者です。というかプログラミング自体始めたばかりです。
数字当てゲームについての悩みです。詳しいルールについては以下のサイトをご覧ください。
https://45mix.net/hit-and-blow-game/
このコードの改善点と、同じ数字が二つ出てきた場合のにおいてのblowの扱いなどを知りたいです。どうかご教授お願い致します。
ソースコード
import random
import time
decide = 0 # お題の数を決めるために使用します
challenge = 0
targetlist = []
while(decide < 3): # <3 にすることで三桁の数と決めています。判定の都合上リスト形式で、一つの桁ずつに数を入れています
targetlist.append(random.randint(0,9))
decide += 1
print(f'正解の数字は{targetlist}')
while(challenge < 10):#10回の制限あり
hit = 0 #初期化
blow = 0 #初期化
zikkou = 0 #初期化
mynumlist = [] #自分の数のリスト
mynum_kakunou = [] #自分で決めた数をリスト形式に格納するためのリスト
mynum = int(input("好きな数字を入力"))
mynum100,innum100 = mynum % 100, mynum // 100 #mynumは計算用の変数、innumはリスト格納の変数。それぞれ余りを出すか商を出すかで分かれている
mynum10,innum10 = mynum100 % 10,mynum100 // 10
mynum1,innum1 = mynum10 // 1,mynum10 // 1
mynum_kakunou = [innum100,innum10,innum1]#格納するためのリストを作成
for i in mynum_kakunou:#forで要素を先頭から一つずつ取り出して自分の数のリストに格納する
mynumlist.append(i)
print(f'あなたの数字は{mynumlist}')
for m in mynumlist:#総当たりにてかなり無茶苦茶な判定です。それぞれのリストから一つ一つ要素を取り出し判定します
for j in targetlist:
zikkou += 1#判定のための処理を何回実行したか数える
if m == j:#数が当たっていたら
print('TRUE')#ここは鬱陶しいなら削除しても大丈夫
if zikkou == 1:#ここのhitとblowの見分け方は別途記述
hit += 1
elif zikkou == 5:
hit += 1
elif zikkou == 9:
hit += 1
else:
blow += 1
else:#この二行は鬱陶しいなら削除しても大丈夫
print('FALSE')
print(f'HIT:{hit}')
print(f'BLOW:{blow}')
challenge += 1
if hit == 3:#3つとも正解していたら
print(f'おめでとう!正解の数字は{mynum}だ!')
break
if challenge == 10:
print(f'おしい!正解の数字は{mynum}')
break
if blow > 3:#バグ対策用。例えば335などの数字はblowが4になってしまう。
print('無効な数です。3秒後に終了します')
time.sleep(3)
break
当たり判定について
この当たり判定の仕組みですが、自分の数の桁と数字、正解の数の桁と数字がそれぞれ一緒。いわゆるヒットだった場合、100の桁からそれぞれ、1,5,9番目にTRUEが返ってきます。それ以外でTRUEが返ってきた場合は、全てblowで返します。
正解の数字は349
あなたの数字は[3, 4, 9]
TRUE #1
FALSE
FALSE
FALSE
TRUE #5
FALSE
FALSE
FALSE
TRUE #9
HIT:3
BLOW:0
しかしこのプログラムでは424などの連番においては正しく動作しません。この改善点などもどうぞよろしくお願いいたします。
正解の数字は[4, 2, 4]
好きな数字を入力244
あなたの数字は[2, 4, 4]
TRUE
FALSE
TRUE
TRUE
FALSE
TRUE
TRUE
FALSE
HIT:1
BLOW:4