見出し画像

Pythonプログラム チンチロ 前編

今年に入って、プログラミング言語のPythonを学習している。
まっさらな状態からスタートして、「超基礎」と銘打たれた事柄に関してはだいたい理解できたので、自分で最初からコードを書いてみようと思った。

というわけで、一人でチンチロを遊べるプログラムを作ってみることにした。

チンチロ
数人程度(理論上は2人以上何人でも)が通常は車座になって、サイコロ3個と(ないし茶碗)を用いて行う。名称はサイコロが丼に投じられたときに生じる音を擬したもので、「チンチロ」と省略されることや「チンコロ」と呼ばれることもある。役は「ひふみ」「しごろ」などがありゾロ目などもある。その中でも1が揃ったピンゾロが一番強い。

Wikipediaより




言い訳コーナー
本題に入る前に保険をかけておくと、プログラミングの学習を始めてまだ半月ほどしか経っていない。手持ちの武器が少ない状態でコードを書いているので、中身はかなり冗長なものになっていると思う。温かい目で見守っていただけると嬉しいです。

シンプルなゲーム

最初にrandomをインポート。

import random

まず、ランダムに1〜6の数字を出力するサイコロ🎲3つを同時に振る。
そして、その出目の組み合わせによって、役の名前を出力する。
出力する役名は以下の通り。

ピンゾロ(1のゾロ目)
ゾロ目(1以外のゾロ目)
シゴロ(4,5,6の組み合わせ)
サイコロの目(目ありの場合)
ヒフミ(1,2,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万回繰り返した結果はこう。

1万回繰り返す

目ありと目無しを足して90%。
10回に1回、何かしらの役が出る計算だ。
ピンゾロの出現割合は0.5%、つまり200回に1回しか出現しない。

単純計算だと、ゾロ目はピンゾロの5倍になり、シゴロとヒフミは同じ割合になるはずだが出力結果は異なる。
試行回数を10万回に増やしてみた結果は以下の通り。

10万回繰り返す


お金を賭けてみる

チンチロはギャンブルである。
お金を賭けなければ意味がない。

損得勘定に関しては、チンチロの一般的な倍率に則って以下のように定義した。

まず、100円から始める。
・ピンゾロ→5円もらえる。
・ゾロ目→3円もらえる。
・シゴロ→2円もらえる。
・目あり→50%の確率で1円もらえ、50%の確率で1円失う。
・目無し→1円失う。
・ヒフミ→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

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回の結果は以下の通り。

100回
1000回
10000回

うーん、全然勝てない。

「目あり→50%の確率で1円もらえ、50%の確率で1円失う。」
ここの部分、目ありの意味が全くないということに気づいたので、「75%の確率で1円もらえ、25%の確率で1円失う」と、プレイヤーに有利になるように変更して、もう一度サイコロを振ってみた。

100回
1000回
10000回

損失額がちょっとだけ減った。


次回予告

本来チンチロは1人で行うゲームではない。
2人以上が必要で、親1人とその他の子に別れて対戦する。
相手の出目と自分の出目との比較で勝敗が決まるので、実際のゲームは上のコードほど単純ではない。
次回は、親と子がそれぞれランダムでサイコロを振り、それを比較した上で勝敗を決するゲームのコードを書いてみる。

いいなと思ったら応援しよう!