<p>您可以使用2个属性:1个用于硬币计数器,1个用于每秒硬币。每次使用硬币属性时,您都会计算自上次使用硬币计数器以来您赚取的新硬币,这有点“假装”硬币一直在计数,而只是在硬币重要时“物化”硬币</p>
<pre class="lang-py prettyprint-override"><code>import time
class Game:
def __init__(self):
self._coins = 0
self._last_time = time.time()
self._cps = 1
@property
def coins(self):
self._collect_coins()
return self._coins
def _collect_coins(self):
new_time = time.time()
self._coins += self._cps * (new_time - self._last_time)
self._last_time = new_time
@property
def coins_per_second(self):
return self._cps
@coins_per_second.setter
def coins_per_second(self, value):
self._collect_coins()
self._cps = value
</code></pre>
<p>无论何时使用新硬币,此代码都会计算新硬币的价值:</p>
<pre class="lang-py prettyprint-override"><code>>>> g = Game()
>>> g.coins
0
>>> time.sleep(2)
>>> g.coins
2
</code></pre>
<p>它还确保每当游戏的<code>coins_per_second</code>发生变化时,你都会收集你在每秒更换硬币之前赚取的硬币数量,从那时起,你将开始以新的速度赚取:</p>
<pre class="lang-py prettyprint-override"><code>>>> g = Game()
>>> time.sleep(1)
>>> g.coins_per_second = 2
>>> time.sleep(1)
>>> g.coins
3
</code></pre>
<p>如果当每秒硬币数发生变化时,您没有收集硬币,那么您将以每秒2枚硬币的变化率错误地计算这两秒</p>