見出し画像

PythonでnDnダイスを作る & DiscordBotに実装

目次
0.前置き
1.コード
2.まとめ
最終更新:20190218

0.前置き

何か決めるときに何かと便利なnDnダイス、でもいざ振ろうとしても近くに無い。じゃあ作って置いておこう

1.コード

randomとre(正規表現)のライブラリを使用する
nDnDICE.py

# coding: utf-8
import random
import re

pattern = '\d{1,2}d\d{1,3}|\d{1,2}D\d{1,3}'
split_pattern = 'd|D'

# 対象の文字列かどうか
def judge_nDn(src):
    repatter = re.compile(pattern)
    result = repatter.fullmatch(src)
    if result is not None:
        return True
    elif src == '1d114514' or src == '1D114514':
        return True
    return False

# 何面ダイスを何回振るか
def split_nDn(src):
    return re.split(split_pattern,src)

# ダイスを振る
def role_nDn(src):
    result = []
    sum_dice = 0
    role_index = split_nDn(src)
    role_count = int(role_index[0])
    nDice = int(role_index[1])
    
    for i in range(role_count):
        tmp = random.randint(1,nDice)
        result.append(tmp)
        sum_dice = sum_dice + tmp
    
    is1dice = True if role_count == 1 else False
    
    return result,sum_dice,is1dice

def nDn(text):
    if judge_nDn(text):
        result,sum_dice,is1dice = role_nDn(text)
        if is1dice:
            return 'ダイス:' + text + '\n出目:' + str(sum_dice)
        else:
            return 'ダイス:' + text + '\n出目:' + str(result) + '\n合計:' + str(sum_dice)
    else:
        return None

textにnDnの形式の文字列を渡してやれば振ってくれます。非対象の文字列の場合はNoneが返ります。
例:"3d6" や "2D100" など
使用例
main.py

# coding: utf-8
import nDnDICE

text = "3d100"

def main():
    result = nDnDICE.nDn(text)
    if result is not None:
        print(result)

if __name__ == "__main__":
    main()

正規表現パターンについて

pattern = '\d{1,2}d\d{1,3}|\d{1,2}D\d{1,3}'

対象の文字列は{1~2桁の数字}{"d" または "D"}{1~3桁の数字}
分かりづらい?要は最低1d1、最大99d999までOK
0については対策してません。0d0とかしないでね(多分Noneが返る)

一番手軽く振れるのはやはりDiscord(メンバーに見える点も○)なのでDiscordBot用に書いてみる。
DiscordBotの導入については Discordのサーバーリージョンをコマンドで変更できるbotを作る の項1を見てね。
discordDice.py (同じ階層にnDnDICE.pyを置いておく)

import discord
import nDnDICE

client = discord.Client()

@client.event
async def on_ready():
    print('Botを起動しました。')

@client.event
async def on_message(message):
    msg = message.content
    result = nDnDICE.nDn(msg)
    if result is not None:
        await client.send_message(message.channel, result)
    
#ここにbotのアクセストークンを入力
client.run('***')

試運転

2.まとめ

今回のコード
nDn-Dice - akaness1git GitHub

参考記事
分かりやすいpythonの正規表現の例

この記事が気に入ったらサポートをしてみませんか?