LoginSignup
2
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-20

<はじめに>

ヌメロンとは
・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になります。

考察

・一応、最低限の対戦相手を作ることができました。これをもとにコンピューターのレベルを上げていきます。プログラミングムズカシイデス。

終わりに

・ここは省略できるよ、こういう書き方のほうがスマートだぞ小童よ、センスのない書き方でやんす、などなどなんでもコメントお待ちしてます。

最後まで読んでいただきありがとうございました。

2
0
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0