我正在做我的第一个与学校无关的项目,而我对应该如何处理某些事情感到有些困惑。该项目是用Python编写的,但我想这个问题本身是更多基于概念性/基于OOP的问题。该项目的目标是创建一个应用程序,该应用程序将输入40张卡片的MtG卡座,并根据卡座的内容显示一些概率数字。使用Scryfall的API,我制作了一个文本文档,其中包含一组魔术卡的卡信息。文本文档实际上只是几行,每行包含一个JSON格式字典,并且我在文本文件中拥有了所需的所有信息。看起来像这样:
{ 'name' : 'card_1_name', 'attribute1' : ' card_1_attribute1', 'attribute2' : 'card_1_attribute2', 'etc' : 'etc'}
{ 'name' : 'card_2_name', 'attribute1' : ' card_2_attribute1', 'attribute2' : 'card_2_attribute2', 'etc' : 'etc'}
{ 'name' : 'card_3_name', 'attribute1' : ' card_3_attribute1', 'attribute2' : 'card_3_attribute2', 'etc' : 'etc'}
对于熟悉MtG的人,请考虑:
{'name' : 'lightning bolt', 'color' : 'red', 'type' : 'instant', ...., 'etc' : 'etc'}
大约可以处理250张不同的卡片。我可以阅读该文档以获取有关我想要的任何卡的任何信息,尽管因为格式很奇怪,所以我必须使用一个for循环,该循环单独读取每一行,并使用ast.literal_eval将其转换为实际的python字典以标识该行包含带有我想要的卡片的“名称”的字典。
这是我目前正在尝试做的事情。我想我可以创建一个类“卡”,它具有每张魔术卡所具有的属性,例如名称和颜色。然后,我想使“卡”类的子类包含特定于某些卡类型的其他属性,例如MtG中的卡类型为“生物”。只有生物具有“力量”属性和“韧性”属性。因此,“ creature”类将继承“ card”的基本属性,并具有自己的特殊属性。
我的思路是,一副纸牌应该是纸牌对象的列表。我的问题是我很难自动化制作卡片对象的过程。这是我目前拥有的“卡”类:
class magic_card:
def __init__(self, card_dict): # card_dict is the dictionary that contains the card data
self.name = card_dict['name']
self.cmc = card_dict['cmc']
self.colors = card_dict['colors']
self.rarity = card_dict['rarity']
我如何才能自动创建约250个卡对象,以使“卡”的名称成为卡实例的名称?我的意思是我希望能够做到这一点的循环:
f = open("document_that_holds_card_information.txt", "r")
for i in range(1, 251):
card_dictionary = ast.literal_eval(f.readline())
card_name = (card_dictionary['name'])
card_name = magic_card(card_dictionary) # I want this magic_card instance's name to be the value stored in card_dictionary['name']
f.close()
这可行吗?还是我想得太多?我的另一个想法是我可以重新格式化我的文本文档,以便通过将其格式化为类似的格式来更容易地进行搜索
['card_name1' : {#dictionary contents}, 'card_name2' : {#dictionary contents}, 'card_name3' : {#dictionary contents}....]
我真的为此感到挣扎,我觉得我可能会以一种不好的方式进行远景规划。请帮忙!
编辑:好的,共识似乎是我对它考虑过多。我决定将包含卡数据的文件重新格式化为正确的JSON格式,而不是使用多行JSON。代替让一副纸牌成为一副纸牌对象列表,一副纸牌将成为一副纸牌词典列表