试图在 Python 中为 DnD 制作一个 4D6 drop lowet 骰子滚轮,但无法从列表中删除所选值或输出到 main() 函数

问题描述

我正在努力提高我的编码技能,所以我认为在 DnD 中创建角色统计数据会很有趣。我创建了一个 main() 函数,该函数创建了一个包含可能统计信息(STR、DEX 等)的字典,将初始值设置为 0,然后根据用户输入(3d6、4d6)将该字典传递给不同的函数。目前,程序只是遍历字典并在滚动时分配值。

这是目前的代码

#!/usr/bin/env python3
# c_stats2.py

import random
import math

# 4d6 drop lowest
def m4d6(x):
    for stat in x:
        rolls = []
        for roll in range(4):
            r = random.randint(1,6)
            rolls.append(r)
        # Drop lowest number
        del rolls[rolls.index(min(rolls))]
        x[stat] += sum(rolls)
    return x

# 3d6 drop lowest
def m3d6(x):
    for stat in x:
        rolls = []
        for roll in range(3):
            r = random.randint(1,6)
            rolls.append(r)
        x[stat] += sum(rolls)
    return x

def main():
    method = input("Select stat method: ")

    stats = {'STR': 0,'DEX': 0,'CON': 0,'INT': 0,'WIS': 0,'CHA': 0
            }

    while True:
        if method == '4d6' or method == '4D6':
            stats = m4d6(stats)
            break
        elif method == '3d6' or method == '3D6':
            stats = m3d6(stats)
            break
        else:
            method = input('Please enter a valid method: ')
            continue

    for stat in stats:
        print(stat,':',stats[stat],'\tBonus:',math.floor((int(stats[stat]) - 10)/2))
    print("Initiative:",math.floor((int(stats['DEX']) - 10)/2))

main()

我想添加一个选项,允许用户实际选择统计数据的去向。我的想法是我会创建一个滚动值列表,将它们分配给字典中的一个统计信息,然后从滚动值列表中删除该值并将字典返回到新值。这是目前的代码

# 4d6 drop lowest,choose stats
def m4d6c(x):
    val = [] 
    for dice in range(6):
        rolls = []
        for roll in range(4):
            r = random.randint(1,6)
            rolls.append(r)
        del rolls[rolls.index(min(rolls))]
        dice += sum(rolls)
        val.append(dice)
    for stat in x:
        print(val)
        print(str("Insert value for {}.").format(stat))
        dic = input('Value: ')
        if dic in val:
            x[stat] += dic
            val.remove(dic)
            continue
        else:
            print("Please enter a valid value")
            continue
    return x

问题是这些值没有分配给统计数据,也没有从 val 列表中删除。谁能告诉我我在这里可能做错了什么?

解决方法

看起来您很接近,但您忘记了 input 返回一个字符串,而在 m4d6c 中,您需要一个 int 才能使您的逻辑正常工作。

当前:

dic = input('Value: ')

需要:

dic = int(input('Value: '))