import random
global gold
gold = 0
class Fruit:
def __str__(self):
return self.name
def __repr__(self):
return self.name
class Apple(Fruit):
def __init__(self):
self.name = "Apple"
self.desc = "An Red Apple!"
self.value = "2 Gold"
class Grapes(Fruit):
def __init__(self):
self.name = "Grapes"
self.desc = "Big Green Grapes!"
self.value = "4 Gold"
class Banana(Fruit):
def __init__(self):
self.name = "Banana"
self.desc = "Long, Fat Yellow Bananas"
self.value = "5 Gold"
class Orange(Fruit):
def __init__(self):
self.name = "Orange"
self.desc = "Big Orange Orange"
self.value = "7 Gold"
inventory = []
print ("Fruits!")
print ("To see your inventroy press: i")
print ("To sell fruits press: s")
print ("To pick fruits press: p")
def action():
return input("Action: ")
def i ():
print ("Your Inventory: ")
print ("*" + str(inventory))
def p ():
pick = [Apple(), Orange(), Grapes(), Banana()]
inventory.append (random.choice(pick))
def s ():
print ("...")
while True:
actioninput = action()
if actioninput in ["i", "İ"]:
i ()
elif actioninput in ["s", "S"]:
s ()
elif actioninput in ["p", "P"]:
p ()
else:
print ("Invalid Action!")
所以我的问题是:
,我想打印已添加到列表中的项目。我试了一些东西,但他们没有工作......
我不知道怎么做"出售"功能,如何从列表中删除项目并将其值添加到全球黄金?
我编辑了def s():就像这样,我得到一个错误:
def s():
global gold
sell = input ("What item would you like to sell?")
if sell == "Apple":
inventory.remove (Apple)
gold = gold + 2
elif sell == "Orange":
inventory.remove (Orange)
gold = gold + 7
elif sell == "Banana":
inventory.remove (Banana)
gold = gold + 4
elif sell == "Grapes":
inventory.remove (Grapes)
gold = gold + 5
ValueError: list.remove(x): x not in list
答案 0 :(得分:2)
def p():
中,我想打印已添加到列表中的项目。" 最简单的方法是使用中间变量:
def p ():
pick = [Apple(), Orange(), Grapes(), Banana()]
fruit_picked = random.choice(pick)
inventory.append (fruit_picked)
print("you picked a", fruit_picked)
您还可以使用indice [-1]
获取列表的最后一个元素:
def p ():
pick = [Apple(), Orange(), Grapes(), Banana()]
inventory.append (random.choice(pick))
print("you picked a", inventory[-1])
使用list.pop
弹出一个项目,然后使用.value
属性执行操作:
def s():
global gold #need this in the function that you are modifying the global value
fruit_sold = inventory.pop() #pop the last item
gold += fruit_sold.value
为此,有几种方法,如果不对Fruit
类进行修改,您可以遍历列表并检查与输入名称相同的水果:
def s():
global gold
fruit_to_sell = input("what kind of fruit do you want to sell? ")
for fruit in inventory:
if fruit.name == fruit_to_sell:
gold+=fruit.value
inventory.remove(fruit)
print("ok, you just sold a(n) {0} for {0.value} gold".format(fruit))
return #finish the function
#if no fruit was found
print("you don't have any of those kind of fruit \n" +
"(This demo doesn't check for capitalization)")
您收到错误的原因是您尝试从广告资源中删除<strong>类,列表中只有Fruit对象,因此不会产生大量的感:
Apple == Apple() #almost always false, unless you specifically overloaded __eq__ to make it True.
你可以改变你的Fruit类,这样只要水果是相同的类型(子类),它们就会比较相等:
class Fruit:
def __eq__(self,other):
return type(self) == type(other)
...
那么您的销售可能只是稍微调整以删除任何实例:
def s():
global gold
sell = input ("What item would you like to sell?")
if sell == "Apple":
inventory.remove (Apple()) #make an instance here@
gold = gold + 2
elif sell == "Orange":
inventory.remove (Orange())
... #you get the point
虽然如果你试图卖苹果但没有,这仍然会引起错误,你可能会更好地检查一下是否有第一个:
def s():
global gold
sell = input ("What item would you like to sell?")
if sell == "Apple":
selling = Apple()
elif sell == "Orange":
selling = Orange()
elif sell == "Banana":
selling = Banana()
elif sell == "Grapes":
selling = Grapes()
if selling in inventory: #make sure you have some of what ever you are selling before trying to sell it!
inventory.remove(selling)
gold += int(selling.value.rstrip(" Gold"))
# I didn't realize value was a str, this shoddy conversion
# works but is not a very good solution
else:
print("you don't have any of those!\n"+
"(This demo doesn't check for capitalization)")
答案 1 :(得分:0)
使用isinstance()来检测对象所属的类。
保持全局变量不是一个好方法。也许开始构建一个值来传递函数作为一个帐户。
然后在购买之前检查您的余额。 (预算外)等
答案 2 :(得分:0)
list_name[-1]
是列表中的最后一项,因此是最近附加的项目。
在您的情况下:inventory[-1]
在sell函数中,您可以使用list_name.remove('element_to_be_removed')
删除列表中的元素。
在你的情况下:
fruit_to_remove = inventory[-1]
inventory.remove(fruit_to_remove)
或使用list.pop()
。 (根据Tadhg McDonald-Jensen的评论)