忍者ブログ

PPM - Python Program Magazine

Pythonのプログラムを公開するだけのブログ

ダイス

さあ、ゲームを始めよう

 テーブルゲームで遊ぶとき必要になるのがサイコロです。
 普通サイコロというと正六面体のものを指します。1から6までの値を同じ確率で発生させるために使うものですよね。
 ゲームによっては他のサイコロを使うこともあります。物理的に存在するのは正4面体、正8面体、正12面体、正20面体ぐらいでしょうか。確率を調整した10面体や100面体のサイコロも見たことがありますが、100面体は面が多すぎてまるでゴルフボールのようでした。
 いろんな種類のきれいなサイコロを集めるのも楽しいのですが、任意のサイコロを必要な数振ることができると便利そうです。
 ということで、サイコロを作ってみました。

どんなサイコロを何個使う?

 1D6と書いて6面体のサイコロを1つ振るという意味になります。Dの前が個数、後ろがサイコロの種類です。
 実際のサイコロとは違い、物理的な形状に制約がないため、2から100までのサイコロを自由に作成することができます。
 個数は1個から10個までです。

プログラムの説明

 このプログラムはGUIをつかっています。GUIは標準ライブラリのtkinterです。
 文字の表示はLabelウィジェット、数字の選択はComboboxウィジェット、ボタンはButtonウィジェットです。
 ウィジェットの配置にはgridを使用しています。
 プログラム自体は何の難しいこともしていませんが、ウィジェットの配置と、サイコロの出目をどう見せるかは工夫した部分です。
 3D6はRPGのキャラクタメイキングで使われますが、期待値が11.5で最大値の18と最小値の3が出にくくなります。つまり大体同じような値となり、大きく外れた値は運が良いまたは悪い時にしか出ないようになります。
 これを合計値だけで出してしまうと確立に細工していないか?と勘繰られてしまいます。そうならないよう、すべての出目とその合計値を出力するようにしました。

プログラム

ダウンロード

from logging import root
from struct import pack
from os import system
from tkinter import ttk
import tkinter as tk
import random

def roll_dice():
    '''
    サイコロを振る
    '''
    count = int(cb_count.get())     # サイコロの数を取得
    dice = int(cb_dice.get())       # サイコロの種類を取得
    total = 0               # 合計値
    history = []            # サイコロの出目
    for no in range(count):
        d = random.randint(1, dice)
        total += d
        history.append(d)
    lbl_result['text'] = f'{total}\r\n{history}'
    return

'''
ウインドウを作成
サイコロの個数選択と結果表示、サイコロを振るボタンを配置する
'''
root = tk.Tk()
root.title('ダイス')
root.geometry('240x320')

guidemsg = tk.Label(root,
            text='サイコロの数と種類を選択してください')
count_nums = tuple(no for no in range(1, 11))
cb_count = ttk.Combobox(root,
            width=6,
            state='readonly',
            values=count_nums)
cb_count.current(0)
lbl_d = tk.Label(root,
            text='D')
dice_kind = tuple(no for no in range(2, 101))
cb_dice = ttk.Combobox(root,
            width=6,
            state='readonly',
            values=dice_kind)
cb_dice.current(4)
lbl_result = tk.Label(root,
            text='\r\n[ ]',
            font=('system', 20))
btn = tk.Button(root,
            text='サイコロを振る',
            command=roll_dice)

# 各行の割合を指定
weit = [1,1,3,1]
for no in range(4):
    root.rowconfigure(no, weight=weit[no])

# 各列の割合を指定
for no in range(3):
    root.columnconfigure(no, weight=1)

# grid関数で配置
guidemsg.grid(column=0, row=0, columnspan=3)
cb_count.grid(column=0, row=1, sticky=tk.E)
lbl_d.grid(column=1, row=1)
cb_dice.grid(column=2, row=1, sticky=tk.W)
lbl_result.grid(column=0, row=2, columnspan=3)
btn.grid(column=0, row=3, columnspan=3)

root.mainloop()

拍手[0回]

PR