見出し画像

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

プログラミング初学者が、チンチロのプログラムを作ってみたという話。
チンチロとは、3つのサイコロを振って、その出目で勝敗を競うゲームのこと。

前編の記事では、自分のサイコロの出目に応じて結果を出力するコードと、○回サイコロを振ったときの出目の出現確率を求めるコードを書いた。

後編では、2人のプレーヤーがそれぞれランダムにサイコロを振り、相手の目に応じて結果を出力するコードを書く。
独学でプログラミングを学習し始めて2週間ほどで、手持ちの武器が少ない状態なので、コードの中身はかなり冗長なものになっているが、自分の想定していることは忠実に再現できたと思う。


親と子の目を比較して、勝敗を出力する

冗長なコードになってしまったが、流れとしては以下の通り。

1,親がサイコロを振る
2,親の出目を10のパターンに分け、数値を親の出目リストに加える。
3,同じ作業を子でも行う。
4,勝敗を記載した表をcsvで読み込む。
5,パターン分けの数値をもとに、csvの表から勝敗を出力する。
import random

li_dealer=[]
li_player=[]

#親がサイコロを振る
a = random.randint(1,6)
b = random.randint(1,6)
c = random.randint(1,6)
d_result = (a,b,c)
print(f'親の出目は{d_result}です。')

#親の出目を10のパターンに分け、数値をリストに加える
if d_result.count(1)==2:
  li_dealer.append(a+b+c-2)
elif d_result.count(2)==2:
  li_dealer.append(a+b+c-4)
elif d_result.count(3)==2:
  li_dealer.append(a+b+c-6)
elif d_result.count(4)==2:
  li_dealer.append(a+b+c-8)
elif d_result.count(5)==2:
  li_dealer.append(a+b+c-10)
elif d_result.count(6)==2:
  li_dealer.append(a+b+c-12)
elif a==b==c==1:
  li_dealer.append(7)
elif a==b==c!=1:
  li_dealer.append(8)
elif a!=b!=c and a+b+c==15:
  li_dealer.append(9)
elif a!=b!=c and a+b+c==6:
  li_dealer.append(10)
else:
  li_dealer.append(0)

#子(自分)がサイコロを振る
a = random.randint(1,6)
b = random.randint(1,6)
c = random.randint(1,6)
p_result = (a,b,c)
print(f'あなたの出目は{p_result}です。')

#子の出目を10のパターンに分け、数値を表に加える
if p_result.count(1)==2:
  li_player.append(a+b+c-2)
elif p_result.count(2)==2:
  li_player.append(a+b+c-4)
elif p_result.count(3)==2:
  li_player.append(a+b+c-6)
elif p_result.count(4)==2:
  li_player.append(a+b+c-8)
elif p_result.count(5)==2:
  li_player.append(a+b+c-10)
elif p_result.count(6)==2:
  li_player.append(a+b+c-12)
elif a==b==c==1:
  li_player.append(7)
elif a==b==c!=1:
  li_player.append(8)
elif a!=b!=c and a+b+c==15:
  li_player.append(9)
elif a!=b!=c and a+b+c==6:
  li_player.append(10)
else:
  li_player.append(0) 

#パターンごとの勝ち負けを記載した表を作成し、csvを読み込む
import pandas as pd
df = pd.read_csv('/content/drive/MyDrive/チンチロ 勝ち負け - シート1.csv')

#パターン分けの数値をもとに、表から「勝ち」「引き分け」「負け」を抽出し、出力する。
for dealer,player in zip(li_dealer,li_player):
  worl = df.iloc[player,dealer]
print(f'{worl}です。')

結果は以下の通り。

工夫したところとしては、「目あり」の時の目の数値化の仕方。
「3つ振ったサイコロのうち、1が2つある時は(a+b+c-2)をリストに加える」というように式を作った。
例えば、出目が(1,1,5)の時は(1+1+5-2)なので、目の数字として5がリストに加えられることになる。
(5,3,3)となった時は(5+3+3-6)なので、上と同様に5がリストに加えられる。


実際にお金を賭けてみる

上のコードと勝敗の表を少しいじって、最終的な金額だけを出力するように改変した。

import random

li_dealer=[]
li_player=[]

hmt = input('何回繰り返しますか? : ')

for i in range(int(hmt)):
  a = random.randint(1,6)
  b = random.randint(1,6)
  c = random.randint(1,6)
  d_result = (a,b,c)
  if d_result.count(1)==2:
    li_dealer.append(a+b+c-2)
  elif d_result.count(2)==2:
    li_dealer.append(a+b+c-4)
  elif d_result.count(3)==2:
    li_dealer.append(a+b+c-6)
  elif d_result.count(4)==2:
    li_dealer.append(a+b+c-8)
  elif d_result.count(5)==2:
    li_dealer.append(a+b+c-10)
  elif d_result.count(6)==2:
    li_dealer.append(a+b+c-12)
  elif a==b==c==1:
    li_dealer.append(7)
  elif a==b==c!=1:
    li_dealer.append(8)
  elif a!=b!=c and a+b+c==15:
    li_dealer.append(9)
  elif a!=b!=c and a+b+c==6:
    li_dealer.append(10)
  else:
    li_dealer.append(0)

for i in range(int(hmt)):
  a = random.randint(1,6)
  b = random.randint(1,6)
  c = random.randint(1,6)
  p_result = (a,b,c)
  if p_result.count(1)==2:
    li_player.append(a+b+c-2)
  elif p_result.count(2)==2:
    li_player.append(a+b+c-4)
  elif p_result.count(3)==2:
    li_player.append(a+b+c-6)
  elif p_result.count(4)==2:
    li_player.append(a+b+c-8)
  elif p_result.count(5)==2:
    li_player.append(a+b+c-10)
  elif p_result.count(6)==2:
    li_player.append(a+b+c-12)
  elif a==b==c==1:
    li_player.append(7)
  elif a==b==c!=1:
    li_player.append(8)
  elif a!=b!=c and a+b+c==15:
    li_player.append(9)
  elif a!=b!=c and a+b+c==6:
    li_player.append(10)
  else:
    li_player.append(0) 

import pandas as pd
df = pd.read_csv('/content/drive/MyDrive/チンチロ - シート1.csv')

li_worl = []
for dealer,player in zip(li_dealer,li_player):
  worl = df.iloc[player,dealer]
  li_worl.append(worl)

pl_money = int(0*li_worl.count(0)+1*li_worl.count(1)+2*li_worl.count(2)+3*li_worl.count(3)+5*li_worl.count(5)+10*li_worl.count(10))
mi_money = int(-1*li_worl.count(-1)-2*li_worl.count(-2)-3*li_worl.count(-3)-5*li_worl.count(-5)-10*li_worl.count(-10))

bankroll = input('軍資金はいくらですか? : ')
bet = input('いくら賭けますか? : ')

final_money = int(bankroll)+int(bet)*pl_money+int(bet)*mi_money
print(f'\n{hmt}回ゲームを行いました。\n{bankroll}円の軍資金で{bet}円賭けると、最終的な金額は{final_money}円になります。')

結果はこう。

勝つこともあれば負けることもある。
計算上は親と子の勝率は変わらないはずだが、結果はトントンになるわけではない。
試行回数を増やせばプラマイ0に近付くのではないかと思い、100万回実行してみた。

100万回の結果

1000円の元手から100円を賭け続けて18万円の負け。
こんなの納得できない。


おまけ

chatGPTで、「チンチロのPythonプログラムを書いてください」と入力してみたところ、このような返答が来た。

import random

def chun_chun_rolling():
    a = random.randint(1, 6)
    b = random.randint(1, 6)
    c = random.randint(1, 6)
    
    if a == b == c:
        print("Chun Chun!")
    elif a == b or b == c or c == a:
        print("Chun")
    else:
        print("Rolling")

chun_chun_rolling()

3つのサイコロを同時に振って、ゾロ目だったら「チュンチュン」、目ありだったら「チュン」、目無しだったら「ローリング」と出力される、その名も「チュンチュンローリング」というゲーム。

すごく可愛らしいネーミングで、ゲーム性もシンプルになっているが、大枠としては外れていない。
人工知能ってすごいな。

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