簡體   English   中英

從隨機生成的數字中添加或減去數字

[英]Adding or Subtracting a number from a randomly generated number

我正在嘗試在我的程序中實現一個功能,用戶可以使用特定的雙面模具添加或減去隨機生成的數字。 我的代碼的基礎發布在這里:

import discord
import random

DND_1d20 = range(1, 21)

# Roll d20
    if message.content == ";roll 1d20":
        response = random.choice(DND_1d20)
        response_str = "You rolled {0}".format(response)
        if response_str == "You rolled 20":
            await message.channel.send("**Critical Hit!**\n You rolled 20")
        if response_str == "You rolled 1":
            await message.channel.send("**Critical Fail!**\n You rolled 1")

我希望用戶能夠指定擲骰子“;1d20”但也能夠從生成的骰子中添加“;1d20+(x)”或減去“;1d20-(x)”任何數字 (x)卷。 邏輯看起來像這樣

-user ";1d20+2" 假設生成的隨機數是 6。由於用戶想在我們生成的隨機數上加 2,結果將是 8。

-bot“你擲出 8”

# Roll d20
    if message.content == ";roll 1d20":
        response = random.choice(DND_1d20)
        response_str = "You rolled {0}".format(response)
        if response_str == "You rolled 20":
            await message.channel.send("**Critical Hit!**\n You rolled 20")
        if response_str == "You rolled 1":
            await message.channel.send("**Critical Fail!**\n You rolled 1")
        else:
            if message.content == "-":

我將如何 go 這樣做? 我真的很困惑從哪里開始。 我不認為上面的代碼是正確的,因為消息必須完全是一個“-”。 另外,我將如何合並值 (x),因為它可能是大量數字,或者來自用戶輸入的 +/- 符號?

任何幫助表示贊賞!

這是一個更高級的解決方案,使用名為lark的庫為這些骰子表達式定義語法(摘自此問題),將這些表達式解析為語法樹,然后評估這些樹。 使用以下字符串創建一個名為dice_grammar.py的文件:

grammar="""
start: _expr

_expr: add
    | subtract
    | roll
    | NUMBER
add: _expr "+" _expr
subtract: _expr "-" _expr
roll: [NUMBER] ("d"|"D") (NUMBER|PERCENT)

NUMBER: ("0".."9")+
PERCENT: "%"

%ignore " "
"""

如果您不熟悉這樣的語法,請不要驚慌。 所有這一切都表明我們可以擲骰子、加法和減法。 然后我們可以有一個dice_transformer.py來使用解析器將生成的樹:

from lark import Transformer, v_args
from random import randint

class DiceTransformer(Transformer):
    PERCENT = lambda self, percent: 100
    NUMBER = int
    def __init__(self):
            super().__init__(visit_tokens=True)
    @v_args(inline=True)
    def start(self, expr):
            return expr
    @v_args(inline=True)
    def add(self, left, right):
            return left + right
    @v_args(inline=True)
    def subtract(self, left, right):
            return left - right
    @v_args(inline=True)
    def roll(self, qty, size):
            qty = qty or 1
            return sum(randint(1, size) for _ in range(qty))

和一個dice_bot.py使用這些來評估用戶的骰子表達式:

from discord.ext import commands
from lark import Lark
from lark.exceptions import LarkError
from dice_grammar import grammar
from dice_transformer import DiceTransformer

bot = commands.Bot(";")

parser = Lark(grammar, maybe_placeholders=True)
transformer = DiceTransformer()

@bot.command()
async def roll(ctx, *, expression):
    try:
        tree = parser.parse(expression)
    except LarkError:
        await ctx.send("Bad Expression")
        return
    print(tree.pretty()) # Log the roll
    result = transformer.transform(tree)
    await ctx.send(f"You rolled: {result}")

bot.run("token")

這使我們可以要求計算更復雜的卷,例如

;roll 2d6 +7 + d% - 3d4

根據 Erez 在評論中的建議,我將答案更改為使用lark.Transformer 您應該能夠在此答案的編輯歷史記錄中看到我的原始代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM