我正在完成一个简单的编程练习(我还是新的),我通过为4个不同的角色属性分配30个点来创建角色配置文件。程序功能包括:显示当前配置文件,创建新配置文件或更改现有配置文件。第一个和第二个功能工作正常,但是最后一个问题:该程序旨在解压缩嵌套列表项(属性+分配分数),要求新分数,取旧和新之间的差异并更改数字因此,池中的可用点数。最后,在位置0的列表中添加一个新条目(属性+新分配的分数),然后删除位置1的条目,该条目应该是该属性的旧条目。遍历列表,完成。但是,一旦执行代码,您将看到它不起作用。请参阅下面的完整代码:
options = ["Strength", "Health", "Wisdom", "Dexterity"]
profile = []
points = 30
choice = None
while choice != "0":
print(
"""
CHARACTER CREATOR PROGRAM
0 - Exit
1 - See current profile
2 - Build new profile
3 - Amend existing profile
"""
)
choice = input("Please choose an option: ")
print()
if choice == "0":
print("Good bye.")
elif choice == "1":
for item in profile:
print(item)
input("\nPress the enter key to continue.")
elif choice == "2":
print("You can now equip your character with attributes for your adventures.")
print("You have",points,"points to spent.")
print("Now configure your character: \n")
#Run the point allocation loop
for item in options:
point_aloc = int(input("Please enter points for " + str(item) + ":"))
if point_aloc <= points:
entry = item, point_aloc
profile.append(entry)
points = points - point_aloc
print("\nYour current choice looks like this: ")
print(profile)
input("\nPress the enter key to continue.")
else:
print("Sorry, you can only allocate", points," more points!")
print("\nYour current choice looks like this: ")
print(profile)
input("\nPress the enter key to continue.")
print("\nWell done, you have configured your character as follows: ")
for item in profile:
print(item)
input("Press the enter key to continue.")
elif choice == "3":
print("This is your current character profile:\n")
for item in profile:
print(item)
print("\nYou can change the point allocation for each attribute.")
for item in profile:
point_new = int(input("Please enter new points for " + str(item) + ":"))
attribute, points_aloc = item
diff = points_aloc - point_new
if diff >0:
points += diff
print("Your point allocation has changed by", -diff,"points.")
print(diff,"points have just been added to the pool.")
print("The pool now contains", points,"points.")
entry = item, point_new
profile.insert(0, entry)
del profile[1]
input("Press the enter key to continue.\n")
elif diff <0 and points - diff >=0:
points += diff
print("Your point allocation has changed by", -diff,"points.")
print(-diff,"points have just been taken from the pool.")
print("The pool now contains", points,"points.")
entry = item, point_new
profile.insert(0, entry)
del profile[1]
input("Press the enter key to continue.\n")
elif diff <0 and points - diff <=0:
print("Sorry, but you don't have enough points in the pool!")
input("Press the enter key to continue.\n")
else:
print("Sorry, but this is not a valid choice!")
input("Press the enter key to continue.\n")
input("\n\nPress the enter key to exit.")
注意:您需要先创建配置文件才能运行更改。
先谢谢你的帮助!!
答案 0 :(得分:0)
正如您对问题的评论所示,您没有以最佳方式提出问题。但是,我看到它有什么问题。我可以向您展示如何修复当前代码,但事实是最佳修复它的方法是完全重写它。当你这样做时,你应该采取以下策略:
将代码分解为多个部分。在这种情况下,我建议您创建几个不同的功能。一个可以被称为main_loop
,并且将包含用于循环菜单的逻辑。它不包含任何更新或显示配置文件的代码。相反,它会调用其他函数display_profile
,build_profile
和amend_profile
。这些函数将接受options
,profile
和points
等变量,并返回options
和points
等值。这将极大地简化您的代码,并使测试和调试更容易。以下是main_loop
可能的示例:
def main_loop():
options = ["Strength", "Health", "Wisdom", "Dexterity"]
profile = []
points = 30
choice = None
while choice != "0":
print(menu_string) #define menu_string elsewhere
choice = input("Please choose an option: ")
print()
if choice == "0":
print("Good bye.")
elif choice == "1":
display_profile(profile)
elif choice == "2":
profile, points = build_profile(options, profile, points)
elif choice == "3":
profile, points = amend_profile(profile, points)
else:
print("Sorry, but this is not a valid choice!")
input("Press the enter key to continue.\n")
input("\n\nPress the enter key to exit.")
看看这有多好?现在您要做的就是定义其他功能。有点像...
def build_profile(options, profile, points):
# insert logic here
return profile, points
这种方法的另一个优点是,现在您可以单独测试这些功能,而无需运行整个程序。
使用正确的惯用语进行列表修改。在迭代时修改列表需要特别小心,在某些情况下(例如,当您通过删除或添加已经迭代过的项来更改列表的长度时)它根本不起作用。有一些方法可以对profile
做一些尝试,但对于初学程序员,我会建议更简单的方法:只需创建一个新列表!然后返回该列表。因此,在amend_profile
函数中,执行以下操作:
def amend_profile(profile, points):
# other code ...
new_profile = []
for item in profile:
attribute, points_aloc = item
# other code ...
new_proflie.append(entry)
# other code ...
return new_profile, points
另请注意,这是您的主要错误之一;您创建的entry
包含(item, point_new)
而不是(attribute, point_new)
,因此您的新元组中包含item
元组,而不是预期的attribute
字符串。