Python文字游戏练手:如何通过函数按所选职业、武器动态调整角色属性
当前代码的核心运行问题
- 输入类型错位:
input()默认返回字符串,原代码直接拿返回值和数字做大小比较、相等判断,会直接触发类型错误 - 函数返回值丢失:
ChosenPriest函数没有设置返回值,调用后给character变量赋值的结果是None,根本走不到后续的属性计算分支 - 属性计算逻辑碎片化:原
baseStats每次只返回单个属性值,没法输出完整的角色属性集合,后续扩展新职业、新武器要写大量重复的if判断 - 输入校验逻辑冗余:原选职业的循环靠捕获
NameError做判断,绕开了真正的类型校验逻辑,完全达不到输入合法性检查的作用
适配当前函数学习阶段的实现方案
不用引入复杂的面向对象语法,顺着现有函数的逻辑做调整就行,核心思路是把固定的属性配置用字典存储,写一个统一的属性计算函数,输入职业、武器参数直接输出完整属性:
- 先把全职业通用的基础属性、各职业的属性加成、各武器的属性加成提前存成字典,后续加新内容只要改字典条目,不用写重复判断
- 写专门的属性计算函数:先复制基础属性,再依次叠加职业、武器对应的属性加成,最后返回完整的属性字典
- 修正所有输入的类型转换逻辑,输入拿到后第一时间转成整数再做合法性判断
- 给原来漏返回值的函数补上返回逻辑,保证外部能拿到正确的职业、武器参数
修正后的核心代码
import time import random inventory = [] # 固定配置:所有游戏内的属性常量直接存字典,改起来方便 BASE_STATS = { "health": 100, "mana": 100, "strength": 5, "magic": 5, "exp": 0 } CLASS_BONUS = { "Priest": {"mana": 20, "magic": 3}, "Warrior": {"health": 30, "strength": 4}, "Thief": {"strength": 2, "magic": -2}, "Ninja": {"strength": 3, "health": 10}, "Pirate": {"strength": 2, "mana": -10} } WEAPON_BONUS = { "Magical Book": {"mana": 50}, "Staff": {"magic": 5}, "Iron Sword": {"strength": 10}, "Dagger": {"strength": 3, "magic": -2} } def intro(): print("Hello for playing my game. It is a text based game that I am working on. \n") print("I hope you enjoy playing it \n") def chooseClass(): print("Please choose a class you would like to play as. Each class has a different background story to them") print("-----------------------------------------------------------") print("Please use the number given below to select them") print("1: Priest\n" "2: Warrior\n" "3: Thief\n" "4: Ninja\n" "5: Pirate\n") def classChosen(starterClass): class_map = { 1: "Priest", 2: "Warrior", 3: "Thief", 4: "Ninja", 5: "Pirate" } selected = class_map.get(starterClass) if selected: print(f"You have chosen {selected}") return selected def ChosenPriest(var): # 仅负责职业对应的剧情交互,不承担返回职业值的额外逻辑 if var == "Priest": selectAns = input("Would you like to know the backstory? \n:Please type 1 :Yes or 2 :No\n:") if selectAns == "1": print("INC") else: print("Alright!") # 补返回值,保证外部能拿到正确的职业参数 return var def Weapons(weapon_choice): weapon_map = { 1: "Magical Book", 2: "Staff" } selected_weapon = weapon_map.get(weapon_choice) if selected_weapon: print(f"You have chosen {selected_weapon}!") inventory.append(selected_weapon) return selected_weapon def calculate_final_stats(character, weapon): # 复制基础属性,避免直接修改全局的默认属性值 final_stats = BASE_STATS.copy() # 叠加职业属性加成 for stat, value in CLASS_BONUS[character].items(): final_stats[stat] += value # 叠加武器属性加成 for stat, value in WEAPON_BONUS[weapon].items(): final_stats[stat] += value return final_stats # 游戏启动主流程 chooseClass() userClass = None while True: try: x = int(input("What class would you like to play?\n:")) if 1 <= x <=5: userClass = classChosen(x) break except ValueError: print("Please enter a number between 1 and 5") # 走职业剧情流程 character = ChosenPriest(userClass) # 武器选择流程,加输入合法性校验 while True: try: weapon_input = int(input("What kind of holy weapon would you like to take? \n 1: Magical Book \n 2: Staff \n Use 1 or 2 to select your weapon! :")) weapon = Weapons(weapon_input) if weapon: break except ValueError: print("Please enter 1 or 2 to select your weapon") # 计算并展示最终属性 final_stats = calculate_final_stats(character, weapon) print("Your final character stats:") for stat, value in final_stats.items(): print(f"{stat}: {value}")
后续扩展提示
- 想加新职业、新武器的时候,只要往
CLASS_BONUS、WEAPON_BONUS字典里加对应条目,再在选择菜单里加选项就行,不用改核心的属性计算逻辑 - 后续要加等级、经验值的逻辑,只要在
calculate_final_stats函数里再加一段等级属性加成的代码就可以,不需要重写整套属性计算流程
内容的提问来源于stack exchange,提问作者Tone
相关产品推荐
相关产品推荐

