Pythonプログラム チンチロ 前編
今年に入って、プログラミング言語のPythonを学習している。
まっさらな状態からスタートして、「超基礎」と銘打たれた事柄に関してはだいたい理解できたので、自分で最初からコードを書いてみようと思った。
というわけで、一人でチンチロを遊べるプログラムを作ってみることにした。
シンプルなゲーム
最初にrandomをインポート。
import random
まず、ランダムに1〜6の数字を出力するサイコロ🎲3つを同時に振る。
そして、その出目の組み合わせによって、役の名前を出力する。
出力する役名は以下の通り。
「目あり」とは、3つの出目のうち2つの数字が共通である場合をいい、一つしかない方の数字がその人の目になる。
「目無し」は、全ての数字がバラバラの場合。
例えば、(1,1,5)は目ありで結果は5、(2,3,6)は目無しということになる。
ただし目無しの中でも、(1,2,3)はヒフミと言うマイナスの役、(4,5,6)はシゴロと言うプラスの役となる。
a = random.randint(1,6)
b = random.randint(1,6)
c = random.randint(1,6)
print(a)
print(b)
print(c)
if a==b==c==1:
print('ピンゾロ!')
elif a==b==c!=1:
print('ゾロ目!')
elif a!=b!=c and a+b+c==15:
print('シゴロ!')
elif a==b!=c:
print(f'結果は{c}!')
elif b==c!=a:
print(f'結果は{a}!')
elif c==a!=b:
print(f'結果は{b}!')
elif a!=b!=c and a+b+c==6:
print('残念!ヒフミ!')
else:
print('残念!目無し!')
シゴロとヒフミの定義の仕方に悩んだが、「出目が全て異なる数字で、和が15になる」場合はシゴロ、「出目が全て異なる数字で、和が6になる」場合はヒフミ、という画期的な数式を考え付いた。
結果を出力すると、以下のようになる。
試行回数を増やす
さて、次は試行回数を増やしてみる。
同じ作業を10回繰り返し、結果を羅列する。
今回はサイコロの出目は出力させず、結果だけを表示させる。
for i in range(10):
a = random.randint(1,6)
b = random.randint(1,6)
c = random.randint(1,6)
if a==b==c==1:
print('ピンゾロ!')
elif a==b==c!=1:
print('ゾロ目!')
elif a!=b!=c and a+b+c==15:
print('シゴロ!')
elif a==b!=c:
print(f'結果は{c}!')
elif b==c!=a:
print(f'結果は{a}!')
elif c==a!=b:
print(f'結果は{b}!')
elif a!=b!=c and a+b+c==6:
print('残念!ヒフミ!')
else:
print('残念!目無し!')
10回繰り返した結果は以下の通り。
試行回数が10回だけだと、役はほとんど出現せず、目ありか目無ししかない。
割合を求める
次は、試行回数を大幅に増やして、それぞれの役の出現割合を求める。
役ごとにカウンターを用意し、それぞれの役が出現するごとに加算する。
そして最後に、それぞれの回数を全ての試行回数で割って100を掛ける。
上のコードと違うところは2点。
自分で試行回数を自由に入力できるようにしたところと、目ありをまとめて処理したところ。
import random
co1=co2=co3=co4=co5=co6=0
trial = input('何回サイコロを振りますか? : ')
for i in range(int(trial)):
a = random.randint(1,6)
b = random.randint(1,6)
c = random.randint(1,6)
if a==b==c==1:
co1+=1
elif a==b==c!=1:
co2+=1
elif a!=b!=c and a+b+c==15:
co3+=1
elif a==b or b==c or c==a:
co4+=1
elif a!=b!=c and a+b+c==6:
co5+=1
else:
co6+=1
print(f'ピンゾロの割合は{co1/int(trial)*100}です。')
print(f'ゾロ目の割合は{co2/int(trial)*100}です。')
print(f'シゴロの割合は{co3/int(trial)*100}です。')
print(f'目ありの割合は{co4/int(trial)*100}です。')
print(f'ヒフミの割合は{co5/int(trial)*100}です。')
print(f'目無しの割合は{co6/int(trial)*100}です。')
1万回繰り返した結果はこう。
目ありと目無しを足して90%。
10回に1回、何かしらの役が出る計算だ。
ピンゾロの出現割合は0.5%、つまり200回に1回しか出現しない。
単純計算だと、ゾロ目はピンゾロの5倍になり、シゴロとヒフミは同じ割合になるはずだが出力結果は異なる。
試行回数を10万回に増やしてみた結果は以下の通り。
お金を賭けてみる
チンチロはギャンブルである。
お金を賭けなければ意味がない。
損得勘定に関しては、チンチロの一般的な倍率に則って以下のように定義した。
import random
co1=co2=co3=co4=co5=co6=0
trial = input('何回サイコロを振りますか? : ')
for i in range(int(trial)):
a = random.randint(1,6)
b = random.randint(1,6)
c = random.randint(1,6)
if a==b==c==1:
co1+=1
elif a==b==c!=1:
co2+=1
elif a!=b!=c and a+b+c==15:
co3+=1
elif a==b or b==c or c==a:
co4+=1
elif a!=b!=c and a+b+c==6:
co5+=1
else:
co6+=1
money = 100+co1*5+co2*3+co3*2+co4*1*1/2+co4*-1*1/2+co5*-2+co6*-1
print(f'チンチロを{trial}回行うと、100円が{money}円になります。')
100回、1000回、10000回の結果は以下の通り。
うーん、全然勝てない。
「目あり→50%の確率で1円もらえ、50%の確率で1円失う。」
ここの部分、目ありの意味が全くないということに気づいたので、「75%の確率で1円もらえ、25%の確率で1円失う」と、プレイヤーに有利になるように変更して、もう一度サイコロを振ってみた。
損失額がちょっとだけ減った。
次回予告
本来チンチロは1人で行うゲームではない。
2人以上が必要で、親1人とその他の子に別れて対戦する。
相手の出目と自分の出目との比較で勝敗が決まるので、実際のゲームは上のコードほど単純ではない。
次回は、親と子がそれぞれランダムでサイコロを振り、それを比較した上で勝敗を決するゲームのコードを書いてみる。