我刚刚完成了使用 Python 编写 Roguelike 的本教程,现在我完全靠自己来弄清楚下一步该去哪里以及该做什么。
我的困境是代码的混乱。我想在某处存储元素,例如项目;生物; 技能;任何可能有大量属性的地方。
目前,所有这些代码都在一个非常大的文件中,这是最基本的。在关卡上放置物品的函数现在看起来很像这样:(这个函数在关卡生成时被调用)
def place_objects(room):
#Maximum number of items per room
max_items = from_dungeon_level([[1, 1], [2, 4]])
#Chance of each item (by default they have a chance of 0 at level 1, which then goes up)
item_chances = {}
item_chances['heal'] = 35
item_chances['lightning'] = from_dungeon_level([[25, 4]])
item_chances['fireball'] = from_dungeon_level([[25, 6]])
item_chances['confuse'] = from_dungeon_level([[10, 2]])
item_chances['sword'] = from_dungeon_level([[5, 4]])
item_chances['shield'] = from_dungeon_level([[15, 8]])
#Choose a random number of items
num_items = libtcod.random_get_int(0, 0, max_items)
for i in range(num_items):
#Choose random spot for this item
x = libtcod.random_get_int(0, room.x1+1, room.x2-1)
y = libtcod.random_get_int(0, room.y1+1, room.y2-1)
#Only place it if the tile is not blocked
if not is_blocked(x, y):
choice = random_choice(item_chances)
if choice == 'heal':
#Create a healing potion
item_component = Item(use_function=cast_heal)
item = Object(x, y, '~', 'Salve', libtcod.light_azure, item=item_component)
elif choice == 'lightning':
#Create a lightning bolt scroll
item_component = Item(use_function=cast_lightning)
item = Object(x, y, '#', 'Scroll of Lightning bolt', libtcod.light_yellow, item=item_component)
elif choice == 'fireball':
#Create a fireball scroll
item_component = Item(use_function=cast_fireball)
item = Object(x, y, '#', 'Scroll of Fireball', libtcod.light_yellow, item=item_component)
elif choice == 'confuse':
#Create a confuse scroll
item_component = Item(use_function=cast_confuse)
item = Object(x, y, '#', 'Scroll of Confusion', libtcod.light_yellow, item=item_component)
elif choice == 'sword':
#Create a sword
equipment_component = Equipment(slot='right hand', power_bonus=3)
item = Object(x, y, '/', 'Sword', libtcod.sky, equipment=equipment_component)
elif choice == 'shield':
#Create a shield
equipment_component = Equipment(slot='left hand', defense_bonus=1)
item = Object(x, y, '[', 'Shield', libtcod.sky, equipment=equipment_component)
objects.append(item)
item.send_to_back()
当我打算添加更多项目时,这个函数会变得很长,然后需要创建的所有函数来处理每个项目的作用。我真的很想将它从 main.py 中取出并将其存储在其他地方,以使其更易于使用,但我目前不知道如何执行此操作。
以下是我尝试解决问题的尝试:
我可以有一个包含项目类的文件,其中每个项目包含许多属性吗?(名称、类型、条件、附魔、图标、重量、颜色、描述、equip_slot、材料)。然后将项目的功能存储在该文件中?主文件如何知道何时调用此其他文件?
是否可以将所有项目数据存储在外部文件(如 XML 或其他文件)中并在需要时从那里读取?
显然,我可以应用的不仅仅是物品。当我真正想要的是一个主循环和更好的组织结构时,这对于没有一个非常臃肿的 main.py 非常有用,该文件包含游戏中所有的生物、物品和其他对象膨胀的数千行代码。