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))
错误原因分析
- 内层循环缩进逻辑错误:生成单组属性值时,正确流程是先掷完4个骰子,再排序去掉最小的,最后求和。原代码在每次添加骰子后就执行排序、pop和求和,导致
scores被错误填充24个元素(6*4),而非预期的6个,后续排序取索引时数值完全错误。 - 职业名称拼写错误: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
相关产品推荐
相关产品推荐

