#<はじめに>
ヌメロンとは
・1人対1人で行います。
・それぞれ0~9の間で重複を許さずに3桁の数字を作ります。
・交互に相手の番号を予想して宣言し、先に相手の番号を当てたほうが優勝です。
・相手の番号を宣言した時にその番号がどのくらい相手の番号に近いのかヒントを得ることができます。具体的には、番号と位置があっていれば〇EAT、位置のみ合っていて番号が違うとき〇BITEという感じで。例を示したほうがわかりやすいと思います。
例)相手の番号が[1,2,3]で自分が[1,2,4]と宣言すれば・・・2EAT 0BITE
相手の番号が[4,5,6]で自分が[4,6,5]と宣言すれば・・・1EAT 2BITE
相手の番号が[7,8,9]で自分が[7,8,9]と宣言すれば・・・3EAT 0BITE などなど、、、
#今回作成したもの
【重要】コンピューターのレベルが人と戦えるほど高くないので、どのくらいコンピューターが強いのか(弱いのか)を示すだけとしました。よって対戦形式ではありません。(100%勝てちゃうので)。
・コンピューターが何回の宣言で自分の指定した数字を当てられるかが分かります。
・今回、コンピューターのレベルとしては"最弱"です。3桁の数字の作り方として720通りありますが、そのなかの正解である1通りを当てずっぽうで宣言します。(毎回1/720で当てようとします)。
コードを以下に示します。
#コード(全体)
import random
while True:
my_number1 = int(input("百の位の数字を決めてね"))
my_number2 = int(input("十の位の数字を決めてね"))
my_number3 = int(input("一の位の数字を決めてね"))
my_number = [my_number1,my_number2,my_number3]
if my_number1 == my_number2 or my_number1 == my_number3 or my_number2 == my_number3:
continue
break
def enemy_eat(number):
eat_judge = False
if my_number[number] == enemy_number[number]:
eat_judge = True
return eat_judge
def enemy_bite(number):
bite_judge = False
if my_number.count(enemy_number[number]) == 1:
bite_judge = True
return bite_judge
index = 1
while True:
while True:
enemy_number1 = random.randint(0,9)
enemy_number2 = random.randint(0,9)
enemy_number3 = random.randint(0,9)
enemy_number = [enemy_number1,enemy_number2,enemy_number3]
if enemy_number1 == enemy_number2 or enemy_number1 == enemy_number3 or enemy_number2 == enemy_number3:
continue
break
eat = 0
bite = 0
if enemy_eat(0) == True:
eat += 1
if enemy_eat(1) == True:
eat += 1
if enemy_eat(2) == True:
eat += 1
if enemy_bite(0) == True and enemy_eat(0) == False:
bite += 1
if enemy_bite(1) == True and enemy_eat(1) == False:
bite += 1
if enemy_bite(2) == True and enemy_eat(2) == False:
bite += 1
print("コンピューターが予想した番号:" + str(enemy_number))
print(str(index) + "ターン目:" + str(eat)+"EAT" + " " + str(bite) + "BITE")
print("----------------------------------------")
enemy_probability = (1 - (719 / 720)**index) * 100
index += 1
if enemy_number != my_number:
continue
break
print("数字を当てました!!!褒めてください!!!")
print((str(index) + "回目までに当てる確率は" + str(round(enemy_probability,1)) + "%です"))
#※追記(2019 3月21日)コメントをもとにコードを短くすることができました。
import random
while True:
my_number1 = int(input("百の位の数字を決めてね"))
my_number2 = int(input("十の位の数字を決めてね"))
my_number3 = int(input("一の位の数字を決めてね"))
my_number = [my_number1,my_number2,my_number3]
if my_number1 == my_number2 or my_number1 == my_number3 or my_number2 == my_number3:
continue
break
def enemy_eat(number):
eat_judge = False
if my_number[number] == enemy_number[number]:
eat_judge = True
return eat_judge
def enemy_bite(number):
bite_judge = False
if my_number.count(enemy_number[number]) == 1:
bite_judge = True
return bite_judge
index = 1
while True:
while True:
enemy_number1 = random.randint(0,9)
enemy_number2 = random.randint(0,9)
enemy_number3 = random.randint(0,9)
enemy_number = [enemy_number1,enemy_number2,enemy_number3]
if enemy_number1 == enemy_number2 or enemy_number1 == enemy_number3 or enemy_number2 == enemy_number3:
continue
break
eat = 0
bite = 0
eat = enemy_eat(0) + enemy_eat(1) + enemy_eat(2)
bite = enemy_bite(0) + enemy_bite(1) + enemy_bite(2) - eat
print("コンピューターが予想した番号:" + str(enemy_number))
print(str(index) + "ターン目:" + str(eat)+"EAT" + " " + str(bite) + "BITE")
print("----------------------------------------")
enemy_probability = (1 - (719 / 720)**index) * 100
index += 1
if enemy_number != my_number:
continue
break
print("数字を当てました!!!褒めてください!!!")
print((str(index) + "回目までに当てる確率は" + str(round(enemy_probability,1)) + "%です"))
True Falseの扱いでこんなに変わることに驚き。
#補足
〈53行目の"enemy_probability"〉について
コンピューターがn回目で自分の数字を当てた時、n回目"までに"当てる確率です。1回目で当てる時は、1/720の確率ですが、2回目で当てる時は、(1回目外す確率)×(2回目当てる確率)、つまり719/720×1/720になります。これを式で表すとn回目に当てる確率は1/720×(719/720)^n-1となります。これを足し上げて百分率で表したものがenemy_probabilityになります。
#考察
・一応、最低限の対戦相手を作ることができました。これをもとにコンピューターのレベルを上げていきます。プログラミングムズカシイデス。
#終わりに
・ここは省略できるよ、こういう書き方のほうがスマートだぞ小童よ、センスのない書き方でやんす、などなどなんでもコメントお待ちしてます。
最後まで読んでいただきありがとうございました。