Pythonプログラム チンチロ 後編
プログラミング初学者が、チンチロのプログラムを作ってみたという話。
チンチロとは、3つのサイコロを振って、その出目で勝敗を競うゲームのこと。
前編の記事では、自分のサイコロの出目に応じて結果を出力するコードと、○回サイコロを振ったときの出目の出現確率を求めるコードを書いた。
後編では、2人のプレーヤーがそれぞれランダムにサイコロを振り、相手の目に応じて結果を出力するコードを書く。
独学でプログラミングを学習し始めて2週間ほどで、手持ちの武器が少ない状態なので、コードの中身はかなり冗長なものになっているが、自分の想定していることは忠実に再現できたと思う。
親と子の目を比較して、勝敗を出力する
冗長なコードになってしまったが、流れとしては以下の通り。
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万回実行してみた。
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つのサイコロを同時に振って、ゾロ目だったら「チュンチュン」、目ありだったら「チュン」、目無しだったら「ローリング」と出力される、その名も「チュンチュンローリング」というゲーム。
すごく可愛らしいネーミングで、ゲーム性もシンプルになっているが、大枠としては外れていない。
人工知能ってすごいな。