見出し画像

#48 サイコロ even-odd

● 問題

サイコロ2つの目の和がeven偶数かodd奇数かを当てて,コインを増やしましょう。Player1とPlayer2とあなたの3人で最終的にだれが一番コインの数が多いかを競います。

あなたが正解したのにコインが増えませんよ。
あなたのコインがたとえば3枚しかないとき,それより多くのコインをBetできてしまいます。
3人のコインが全く同じだったとき,WINと表示されるより,DRAWと表示されたほうがよさそうです。

<ルール>
・ゲームの回数は10回,ただし,3人のうち誰かのコインが0枚になった時点で終了
・最初のコインの数は20枚
・Player1とPlayer2のeven偶数かodd奇数かの選択とBetするコインの枚数は乱数で決まる
・Player1は慎重派(Betする数が少ない 1~3枚)
・Player2は大胆派(Betする数が少ない 5~9枚)
・あなたは1~10枚までBetを選択できる
・最初の倍率は2倍,正解した場合,Betした数の2倍のコインがもらえる
・連続正解すると倍率が3倍,4倍と上がる,ただし,はずれると倍率は2倍にもどる
・はずれるとBetしたコインの数が減る

import random

even_odd = ['even偶数','odd奇数 ']

p1_coin = 20
p2_coin = 20
you_coin = 20

print(f'Player1 coin:{p1_coin}')
print(f'Player2 coin:{p2_coin}')
print(f'You     coin:{you_coin}')
print('')

p1_rate = 2
p2_rate = 2
you_rate = 2

times = 0

while True:
    times += 1
    if times > 10:
        break

    print(f'{times}回目')
    print('===================================================')

    dice1 = random.randint(1,6)
    dice2 = random.randint(1,6)
    dice_sum = dice1+dice2

    p1_choice = random.randint(0,1)
    p2_choice = random.randint(0,1)
    p1_bet = random.randint(1,3)
    if p1_coin < p1_bet:
        p1_bet = p1_coin
    p2_bet = random.randint(5,9)
    if p2_coin < p2_bet:
        p2_bet = p2_coin

    print(f'Player1 Choice:{even_odd[p1_choice]} BET:{p1_bet} Rate:x{p1_rate}')
    print(f'Player2 Choice:{even_odd[p2_choice]} BET:{p2_bet} Rate:x{p2_rate}')
    print('===================================================')

    print(f'Your Rate:x{you_rate}')
    while True:
        you_choice = input('Your Choice?:even偶数(0) or odd奇数(1) ')
        if you_choice in ['0','1']:
            break
    while True:
        you_bet = input('Your BET(1-10)? ')
        if you_bet in [str(i+1for i in range(10)]:
            break
    print('===================================================')

    print(f'Dice:{even_odd[dice_sum % 2]}')
    print('===================================================')

    if dice_sum % 2 == p1_choice:
        p1_coin += p1_bet*p1_rate
        p1_rate += 1
    else:
        p1_coin -= p1_bet
        p1_rate = 2

    if dice_sum % 2 == p2_choice:
        p2_coin += p2_bet*p2_rate
        p2_rate += 1
    else:
        p2_coin -= p2_bet
        p2_rate = 2

    if dice_sum % 2 == you_choice:
        you_coin += int(you_bet)*you_rate
        you_rate += 1
    else:
        you_coin -= int(you_bet)
        you_rate = 2

    print(f'Player1 coin:{p1_coin}')
    print(f'Player2 coin:{p2_coin}')
    print(f'You     coin:{you_coin}')
    print('')

    if p1_coin*p2_coin*you_coin == 0:
        break

max_coin = max(p1_coin,p2_coin,you_coin)
if p1_coin == max_coin:
    print('Player1 :WIN')
else:
    print('Player1 :LOSE')
if p2_coin == max_coin:
    print('Player2 :WIN')
else:
    print('Player2 :LOSE')
if you_coin == max_coin:
    print('You     :WIN')
else:
    print('You     :LOSE')

● 解答

正解したのに,コインが増えないのは,あたなの正解を判定している部分が間違っているためです。
if dice_sum % 2 == you_choice: があなたの入力値(0 か 1)と2つのサイコロの合計を2で割った余りが等しいかを判定しています。
dice_sum % 2 = 0 ならば偶数,dice_sum % 2 = 1 ならば奇数 ということです。
if dice_sum % 2 == p1_choice: はPlayer1の判定をしている部分です。ここでは正しい判定がされているのに,なぜ,あなたの部分の判定は正しくないのでしょうか。
それは,p1_choice = random.randint(0,1)なので,p1_choiceには整数の0か1が入ります。
それに対して,you_choice = input('Your Choice?:even偶数(0) or odd奇数(1) ')なので,you_choiceには文字の'0'か'1'が入ります。
dice_sum % 2 の結果は整数0か1なので,p1_choiceとは等しくなることがあいりますが,you_choiceの'0'と'1'とは等しくなることはありません。
つまり,0 ≠ '0' です。

もう一つ,所有しているコインの枚数より多くの枚数をBetできてしまう点です。
・所持している枚数より少ない枚数の入力しか受け付けない
・所持している枚数より多い枚数を入力した場合には,所持している枚数が自動的にBetされる など,いくつかの方法が考えられます。
今回は,所持している枚数より少ない枚数の入力しか受け付けないを採用しました。所持している枚数より多い枚数が入力された場合には再度入力が求められます。入力値を判定している部分に条件を追加しました。

勝ち負けの判定のところに,3人のコインが全く同じ枚数のとき,DRAWと表示するようにしました。
if p1_coin == p2_coin == you_coin: という書き方ができるのは,Pythonならではですね。
Python以外のプログラミング言語では,以下のように and を使って書くことになるでしょう。
if p1_coin == p2_coin and p2_coin == you_coin:

import random

even_odd = ['even偶数','odd奇数 ']

p1_coin = 20
p2_coin = 20
you_coin = 20

print(f'Player1 coin:{p1_coin}')
print(f'Player2 coin:{p2_coin}')
print(f'You     coin:{you_coin}')
print('')

p1_rate = 2
p2_rate = 2
you_rate = 2

times = 0

while True:
    times += 1
    if times > 10:
        break

    print(f'{times}回目')
    print('===================================================')

    dice1 = random.randint(1,6)
    dice2 = random.randint(1,6)
    dice_sum = dice1+dice2

    p1_choice = random.randint(0,1)
    p2_choice = random.randint(0,1)
    p1_bet = random.randint(1,3)
    if p1_coin < p1_bet:
        p1_bet = p1_coin
    p2_bet = random.randint(5,9)
    if p2_coin < p2_bet:
        p2_bet = p2_coin

    print(f'Player1 Choice:{even_odd[p1_choice]} BET:{p1_bet} Rate:x{p1_rate}')
    print(f'Player2 Choice:{even_odd[p2_choice]} BET:{p2_bet} Rate:x{p2_rate}')
    print('===================================================')

    print(f'Your Rate:x{you_rate}')
    while True:
        you_choice = input('Your Choice?:even偶数(0) or odd奇数(1) ')
        if you_choice in ['0','1']:
            break
    while True:
        you_bet = input('Your BET(1-10)? ')
        if you_bet in [str(i+1for i in range(10)] and you_coin >= int(you_bet): # 変更
            break
    print('===================================================')

    print(f'Dice:{even_odd[dice_sum % 2]}')
    print('===================================================')

    if dice_sum % 2 == p1_choice:
        p1_coin += p1_bet*p1_rate
        p1_rate += 1
    else:
        p1_coin -= p1_bet
        p1_rate = 2

    if dice_sum % 2 == p2_choice:
        p2_coin += p2_bet*p2_rate
        p2_rate += 1
    else:
        p2_coin -= p2_bet
        p2_rate = 2

    if dice_sum % 2 == int(you_choice):  # 変更
        you_coin += int(you_bet)*you_rate
        you_rate += 1
    else:
        you_coin -= int(you_bet)
        you_rate = 2

    print(f'Player1 coin:{p1_coin}')
    print(f'Player2 coin:{p2_coin}')
    print(f'You     coin:{you_coin}')
    print('')

    if p1_coin*p2_coin*you_coin == 0:
        break

max_coin = max(p1_coin,p2_coin,you_coin)
if p1_coin == p2_coin == you_coin:
    print('DRAW')
else:
    if p1_coin == max_coin:
        print('Player1 :WIN')
    else:
        print('Player1 :LOSE')
    if p2_coin == max_coin:
        print('Player2 :WIN')
    else:
        print('Player2 :LOSE')
    if you_coin == max_coin:
        print('You     :WIN')
    else:
        print('You     :LOSE')

#Python  #プログラミング

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