<p>我将创建一个<code>Inventory</code>类,如下所示:</p>
<pre class="lang-py prettyprint-override"><code>from cmd import Cmd
from collections import Counter
class Inventory(Counter):
"""
We can extend the Inventory class later. For now it will work as a Counter
so that we can keep track of the number of each item it has
"""
class Player:
def __init__(self, hp):
self.hp = hp
self.maxhp = hp
self.inventory = Inventory()
def has(self, item_name):
# Check that there is a positive amount of that item
return item_name in self.inventory and self.inventory[item_name] > 0
def use(self, item_name, item):
# We are passing both the item_name and the item as we want to use it
# We could also use the item itself as the key for the Inventory instead
# of the item name, so that we do not need both (method has would also
# need an update in that case)
# Check if it is consumable to reduce the amount by one
if isinstance(item, Consumable):
self.inventory[item_name] -= 1
# Use the item passing the player as it will have to access its addhp method
item.use(self)
def addhp(self, amount):
self.hp += amount
if self.hp > self.maxhp:
self.hp = self.maxhp
class Consumable: # You should probably add a base class Item later
def use(self, player):
pass # This will be overwritten by other classes
class Potion(Consumable):
"""
The Potion class allows to define different sizes of pots that will heal
the player the specified amount.
"""
def __init__(self, hp):
"""Define the amount of hp that a potion heals."""
self.hp = hp
def use(self, player):
"""Heal the player by the specified amount."""
player.addhp(self.hp)
class Adventure(Cmd):
prompt = ">"
# This is just a map of item names to their current objects
items = {
"small potion": Potion(2),
"potion": Potion(5),
"big potion": Potion(10),
}
def __init__(self, *args, **kwargs):
# Call parent class constructor IMPORTANT!
super().__init__(*args, **kwargs)
# Now we handle our own instance variables
self.player = Player(20)
def do_use(self, item_name):
# Check before using
if self.player.has(item_name):
self.player.use(item_name, self.items[item_name])
</code></pre>
<p><code>do_use</code>方法不是线程安全的,因此如果您在任意点添加不同的线程,请记住您应该在某个地方添加并使用锁。你知道吗</p>