我试图建立一个基本的库存系统,如果你找到一个项目,你可以查看项目的价值。当我运行代码时,一切似乎都很好,但联接函数似乎不起作用,因为仍然有这个{}、这个和这个"。我想我可能把代码弄得过于复杂了,所以如果你知道一种缩短代码的方法,请随意评论。
import random
class Player():
inv = {}
def __init__(self, hp, dmgl, dmgh):
self.hp = hp
self.dmgl = dmgl
self.dmgh = dmgh
player = Player(100, 20, 30)
def game():
while True:
weapon = input("Enter name of weapon that you want: ")
durability = int(input("Enter durability for " + str(weapon) + ": "))
player.inv.update({weapon: {"name": weapon, "durability": durability}})
view_inv = input("Do you wish to view your inventory? ")
if view_inv == 'yes':
view_item = input("Name of item: ")
if view_item in player.inv:
get_item_info = player.inv.get(view_item)
print(str(view_item) + ":" , ",".join({str(get_item_info) for v in player.inv}))
game()
用替换打印行
prop = ", ".join([f"{key}: {val}" for key, val in get_item_info.items()])
print(f"{view_item}: {prop}")
get_item_info.items()
为字典中的每个条目生成键值对的元组列表:[(name, theName), (durability: 10), ...]
f"{key}: {val}" for key, val in ...
为每个元组创建一个字符串。
使用", ".join(..
将字符串列表连接在一起。
我认为打印报表应该读取
print(str(view_item) + ": " + " ".join([f'{k}: {v}' for k, v in get_item_info.items()]))
如果这是我的代码,我会编写一个通用函数,它接受一个字典,并返回字典的单行字符串表示,如下所示:
def pprint_dict(dictionary):
"""Return a single line string of all keys and values in the dictionary."""
out = " ".join([f'{k}: {v}' for k, v in dictionary.items()])
return out
但如果它真的是我的代码,pprint_dictionary
将采用一个可选的keys
参数,该参数将允许我指定字典中我想要的键:
def pprint_dict(dictionary, keys=None):
"""Return a single line string of all keys and values in keys."""
if keys is None:
keys = dictionary.keys()
out = " ".join([f'{k}: {v}' for k, v in dictionary.items() if k in keys])
return out
然后,在你上面的打印声明中,它会写道:
print(str(view_item) + ": " pprint_dict(get_item_info)
只需将名称从player
更改为Player
,因为Python区分大小写,并且您在代码中的所有位置都使用了错误的名称player
。
固定代码
class Player():
inv = {}
def game():
while True:
weapon = input("Enter name of weapon that you want: ")
durability = int(input("Enter durability for " + str(weapon) + ": "))
Player.inv.update({weapon: {"name": weapon, "durability": durability}})
view_inv = input("Do you wish to view your inventory? ")
if view_inv == 'yes':
view_item = input("Name of item: ")
if view_item in Player.inv:
get_item_info = Player.inv.get(view_item)
print(str(view_item) + ":" , ",".join({str(get_item_info) for v in Player.inv}))
game()
输出
Enter name of weapon that you want: ga
Enter durability for ga: 100
Do you wish to view your inventory? yes
Name of item: ga
ga: {'name': 'ga', 'durability': 100}
Enter name of weapon that you want:
....
但是
逻辑有点错误,我想让它更具功能性
因此,在类Player
中添加了两个方法,用于添加和以更干净的方式从库存中检索项目。
还有
- 我列出了一个输入列表,这样我就可以快速测试逻辑
- 删除了未使用的导入语句
这是最后的代码
class Player():
def __init__(self):
self.inv = {}
def add_item(self, inventory_type, name, durability):
inventory_type = inventory_type.title()
name = name.title()
if any([i for i in self.inv.get(inventory_type, []) if i["name"] == name]):
print("[Error] Item with same name already exists!")
return
if self.inv.get(inventory_type, None) == None:
self.inv[inventory_type] = [
{"name": name, "durability": durability}
]
else:
self.inv[inventory_type].append(
{"name": name, "durability": durability}
)
print(f"[Success] Item Named "{name}" of type "{inventory_type}" inserted in Inventory!")
def get_item(self, view_item):
view_item = view_item.title()
for inventory_type in self.inv:
for item in self.inv[inventory_type]:
# print(item)
if item["name"] == view_item:
return f"{inventory_type}: {item}"
def game():
# while True:
player1 = Player()
# inventory_type = input("Enter type of the inventory_type: ")
# name = input("Enter name of the inventory_type: ")
# durability = int(input(f"Enter durability for {inventory_type} named {name!s}: "))
items = [
("sword", "Nightmaria2", 150),
("shield", "defencia", 100),
("sword", "Nightmare", 120),
("sword", "Nightmare", 30)
]
# Add Items in player1's inventory
for item in items:
player1.add_item(*item)
# Display Items using their name
for item in items:
if (item_info := player1.get_item(item[1])):
print(item_info)
game()
输出
[Success] Item Named "Nightmaria2" of type "Sword" inserted in Inventory!
[Success] Item Named "Defencia" of type "Shield" inserted in Inventory!
[Success] Item Named "Nightmare" of type "Sword" inserted in Inventory!
[Error] Item with same name already exists!
Sword: {'name': 'Nightmaria2', 'durability': 150}
Shield: {'name': 'Defencia', 'durability': 100}
Sword: {'name': 'Nightmare', 'durability': 120}
Sword: {'name': 'Nightmare', 'durability': 120}
我改变了插入物品的主要逻辑,使玩家的库存中可以有多把剑,所以,
我列出了一个列表来存储它,此外,我还处理重复项,以防玩家试图添加相同类型的同名项目。