You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D&D随机角色生成器属性值生成函数失效求助

D&D角色属性生成器问题排查与修复

问题描述

从网上获取了D&D随机角色生成器代码(后续会标注来源),除属性值掷骰与分配模块外其余功能正常,但所有属性值(STR、DEX等)均返回0。以下是问题代码:

import random

# 假设已定义全局变量
race = ["Human", "Elf", "Dwarf"]
job = ["Fighter", "Wizard", "Rogue"]
gender = ["Male", "Female"]

def __GetRandomName__(race, gender):
    return f"{race}_{gender}_Name"

#### Ability score generator
def __GetAbilityScores__(characterClass):
    scores = []
    for x in range(6):
        score = []
        for x in range(4):
            score.append(random.randint(1,6))
            score = sorted(score)
            score.pop(0)
            scores.append(sum(score))
    scores = sorted(scores)
    arrangedScores = {"STR":0, "DEX":0, "CON":0, "INT":0, "WIS":0, "CHA":0}
    match characterClass:
        case 'Fighter':
            arrangedScores["STR"] = scores[5]
            arrangedScores["CON"] = scores[4]
            arrangedScores["DEX"] = scores[3]
            arrangedScores["WIS"] = scores[2]
            arrangedScores["CHA"] = scores[1]
            arrangedScores["INT"] = scores[0]
        
        case 'Wizard':
            arrangedScores["INT"] = scores[5]
            arrangedScores["CON"] = scores[4]
            arrangedScores["DEX"] = scores[3]
            arrangedScores["WIS"] = scores[2]
            arrangedScores["CHA"] = scores[1]
            arrangedScores["STR"] = scores[0]

        case 'Rouge':
            arrangedScores["DEX"] = scores[5]
            arrangedScores["CON"] = scores[4]
            arrangedScores["CHA"] = scores[3]
            arrangedScores["STR"] = scores[2]
            arrangedScores["INT"] = scores[1]
            arrangedScores["WIS"] = scores[0]
    return arrangedScores

# 角色信息存储类
class character:
    def __init__(self):
        self.race = race[random.randint(0,len(race)-1)]
        self.characterClass = job[random.randint(0,len(job)-1)]
        self.gender = gender[random.randint(0, len(gender)-1)]
        self.name = __GetRandomName__(self.race, self.gender)
        self.abilityScores = __GetAbilityScores__(self.characterClass)

newCharacter = character()
print(vars(newCharacter))

错误原因分析

  1. 内层循环缩进逻辑错误:生成单组属性值时,正确流程是先掷完4个骰子,再排序去掉最小的,最后求和。原代码在每次添加骰子后就执行排序、pop和求和,导致scores被错误填充24个元素(6*4),而非预期的6个,后续排序取索引时数值完全错误。
  2. 职业名称拼写错误:D&D中盗贼职业是Rogue,但代码里写的是Rouge。如果job列表里的职业是Rogue,match语句会匹配不到任何分支,arrangedScores会保持初始全0值。

修复后的代码

import random

race = ["Human", "Elf", "Dwarf"]
job = ["Fighter", "Wizard", "Rogue"]
gender = ["Male", "Female"]

def __GetRandomName__(race, gender):
    return f"{race}_{gender}_Name"

def __GetAbilityScores__(characterClass):
    scores = []
    # 生成6组属性值:每组掷4次d6,去掉最小的后求和
    for _ in range(6):
        dice = [random.randint(1,6) for _ in range(4)]
        dice.sort()
        total = sum(dice[1:])  # 去掉索引0的最小骰子,求和剩余3个
        scores.append(total)
    scores.sort()  # 6组分数按从低到高排序
    arrangedScores = {"STR":0, "DEX":0, "CON":0, "INT":0, "WIS":0, "CHA":0}
    
    match characterClass:
        case 'Fighter':
            arrangedScores["STR"] = scores[5]
            arrangedScores["CON"] = scores[4]
            arrangedScores["DEX"] = scores[3]
            arrangedScores["WIS"] = scores[2]
            arrangedScores["CHA"] = scores[1]
            arrangedScores["INT"] = scores[0]
        
        case 'Wizard':
            arrangedScores["INT"] = scores[5]
            arrangedScores["CON"] = scores[4]
            arrangedScores["DEX"] = scores[3]
            arrangedScores["WIS"] = scores[2]
            arrangedScores["CHA"] = scores[1]
            arrangedScores["STR"] = scores[0]

        case 'Rogue':
            arrangedScores["DEX"] = scores[5]
            arrangedScores["CON"] = scores[4]
            arrangedScores["CHA"] = scores[3]
            arrangedScores["STR"] = scores[2]
            arrangedScores["INT"] = scores[1]
            arrangedScores["WIS"] = scores[0]
    return arrangedScores

class character:
    def __init__(self):
        self.race = race[random.randint(0, len(race)-1)]
        self.characterClass = job[random.randint(0, len(job)-1)]
        self.gender = gender[random.randint(0, len(gender)-1)]
        self.name = __GetRandomName__(self.race, self.gender)
        self.abilityScores = __GetAbilityScores__(self.characterClass)

newCharacter = character()
print(vars(newCharacter))

修复点说明

  • 调整掷骰逻辑:用列表推导式一次性生成4个骰子结果,排序后去掉最小的元素再求和,确保每组属性值符合D&D的4d6取前3规则。
  • 修正职业拼写:将Rouge改为Rogue,确保与job列表中的职业名称匹配,match语句能正确分配属性。
  • 优化循环变量:用_替代重复的x,避免变量混淆,符合Python惯用写法。

内容的提问来源于stack exchange,提问作者zellfer1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:33:22