我正在我的计算机课上完成一项作业,而且我在编写代码的一部分时遇到了困难。我将发布作业指南(粗体部分是我遇到问题的代码):
您将创建一个模拟的蚁群,用户将在其中 扮演女王的角色,她将负责管理健康 殖民地。模拟将以回合制的方式进行, 每转一次,用户可以选择花费宝贵的食物资源 更多的蚂蚁。
首先创建一个包含两个类的python文件Ants.py:
Colony
和Ant
。
Colony
类将有一个工蚁列表(最初为空),a 食物量(最初为10种)和3种方法:
breedWorker()
step()
purge()
breedWorker()
创建一个新的Ant
并将其添加到殖民地的列表中 工蚁。创造一个工人需要花费5个殖民地的食物。如果有 食物不足,应该向用户打印一条消息而不是 应该创造蚂蚁。
step()
处理每个回合的殖民地自动行为。 也就是说,这种方法将控制每只蚂蚁的行为 殖民地。每转一蚂蚁应该从殖民地的食物中吃一种食物 供应。如果没有足够的食物,蚂蚁将失去一分 健康相反。然后每只蚂蚁都会觅食(如下所述), 所发现的任何食物都会被添加回殖民地的食物供应中。
purge()
扫描工蚁列表,并从列表中删除任何健康状况为0的蚂蚁。每只死蚂蚁加1食物供应, 因为蚂蚁回收了! p>我无法理解如何确保列表中的所有蚂蚁都具有健康状况,而且我不确定如何从列表中删除健康状况为零的蚂蚁。 < / p>
Ant
班级将
- 健康(最初设定为10)
forage()
方法
forage()
随机确定蚂蚁在搜索时的运气 每回合吃一次。
- 蚂蚁在一次可怕的事故中死亡的可能性为5%(健康状况 = 0,不返回食物)
- 蚂蚁有40%的机会找到食物。找到的金额应该是1到5之间的随机数。
- 有一个 蚂蚁没有食物的几率为50%。
- 有5%的可能性 蚂蚁发现甜蜜的花蜜!她的健康得到补充(即设定为 10)她带回10个食物到殖民地!每个结果 蚂蚁的觅食应该为用户打印并返回。
最后,您需要编写
main()
方法来启动 模拟并反复提示用户进行选择。每一回合 用户应该可以选择培养新员工(费用为5) 食物),或什么都不做(没有新的蚂蚁)。您的代码应该检查用户的 输入错误并再次询问它是否无效。跟随用户的 行动(品种与否),殖民地将按照描述采取“一步” 以上,最后,所有死亡的蚂蚁都应该从殖民地清除。 模拟应该像这样重复,直到殖民地都在两者之外 蚂蚁和足够的食物可以制造更多的蚂蚁。
这是我的代码:
import random
class Colony(object):
def __init__(self):
Colony.food = 10
Colony.numWorkerAnts = 0
Colony.workerAnts = []
def breedWorker(self):
print ("Breeding worker...")
Colony.numWorkerAnts += 1
Colony.food -= 5
Colony.workerAnts.append(1)
if (Colony.food < 5):
print ("Sorry, you do not have enough food to breed a new worker ant!")
def step(self):
for i in range(0,len(Colony.workerAnts)):
Colony.food -= 1
class Ant(object):
def __init__self(self):
Ant.health = 10
def forage(self):
foodFound = random.random()
if (foodFound <= 0.05):
print("Ant has died in an accident!")
Ant.health = 0
if (foodFound > 0.05 and foodFound < 0.40):
amountFood = random.randint(1,5)
print("Ant finds "+str(amountFood)+" food.")
Colony.food += amountFood
if (foodFound >= 0.40 and foodFound < 0.95):
print("Ant worker returns empty handed.")
if (foodFound >= 0.95):
print("Your ant finds sweet nectar! Ant returns "+str(amountFood)+" to the colony and health is restored to "+str(self.health)+"!")
amountFood = 10
Ant.health = 10
Colony.food = amountFood + Colony.food
def main():
colony = Colony()
ant = Ant()
while (Colony.numWorkerAnts >= 1 or Colony.food >= 5):
print ("Your colony has "+str(Colony.numWorkerAnts)+" ants and "+str(Colony.food)+" food, Your Majesty.")
print ("What would you like to do?")
print ("0. Do nothing")
print ("1. Breed worker (costs 5 food)")
prompt = '> '
choice = int(raw_input(prompt))
if (choice == 1):
colony.breedWorker()
colony.step()
for i in range(0, len(Colony.workerAnts)):
ant.forage()
else:
for i in range(0, len(Colony.workerAnts)):
ant.forage()
colony.step()
main()
答案 0 :(得分:0)
目前,当您使用ClassName.attr
时,您正在将所有内容属性设置为在类的所有实例之间共享。相反,您应该使用self.attr
将所有内容都设为实例属性:
class Colony(object):
def __init__(self):
self.food = 10
self.workerAnts = [] # numWorkerAnts is just len(workerAnts)
请注意,您应该更改breedWorker
以将新的Ant
实例添加到self.workerAnts
列表中;目前,它只会增加计数。
为了减少有健康的蚂蚁的殖民地,你可以使用列表理解:
self.workerAnts = [ant for ant in self.workerAnts if ant.health]