我尝试通过Spyder和在线IDE运行以下代码,但是没有一个人完全完成该程序。它要么超时要么只是拒绝运行。
import random
from pprint import pprint
petri_dish = []
class Species:
def __init__(self,total,name,life,attack,defense,move,location):
area = 1000
self.total = 100
self.name = name
self.life = self.total - (random.randint(1,100))
self.attack = self.total - (random.randint(1,100))
self.defense = self.total - (random.randint(1,100))
self.move = self.total - (random.randint(1,100))
self.location = [random.randint(1,area),random.randint(1,area)]
def relocate(self):
x_move_add = random.randint(self.location[0], self.location[0] + self.move)
x_move_minus = random.randint(self.location[0] - self.move,self.location[0])
y_move_add = random.randint(self.location[1], self.location[1] + self.move)
y_move_minus = random.randint(self.location[1] - self.move,self.location[1])
self.location = [random.randint(x_move_minus,x_move_add),random.randint(y_move_minus,y_move_add)]
for n in range(2):
if self.location[n] > 1000:
self.location[n] = 1000
elif self.location[n] < 0:
self.location[n] = 0
def fight(self,enemy):
while self.life > 0 and enemy.life > 0:
self.life = (self.life + self.defense) - enemy.attack
enemy.life = (enemy.life + enemy.defense) - self.attack
else:
if self.life > enemy.life:
print 'Species #' + str(enemy.name) + ' was eaten!'
self.attack = self.attack + enemy.attack
self.life = 100
petri_dish.remove(enemy)
else:
print 'Species #' + str(self.name) + ' was eaten.'
enemy.attack = enemy.attack + self.attack
enemy.life = 100
petri_dish.remove(self)
def target(self):
for z in petri_dish:
if z.location != self.location:
if (z.location[0] in range(self.location[0] - self.move, self.location[0] + self.move)) and (z.location[1] in range(self.location[1] - self.move, self.location[1] + self.move)):
self.fight(z)
for n in range(20):
petri_dish.append(Species(0,n,0,0,0,0,0))
def show():
for z in petri_dish:
print z.location,z.move
def move_around():
for x in petri_dish:
x.relocate()
x.target()
while len(petri_dish) > 1:
move_around()
for x in petri_dish:
pprint(vars(x))
知道发生了什么事吗?这工作得早,但现在它已经坏了。你可以说,这个程序是一个非常非常简单的培养皿模拟器,由一些非常不智能的细胞组成。
奖金问题:无限循环对您的计算机有害吗?我已经打了几个,我不想冒险以任何方式,形状或形式伤害我的机器。
答案 0 :(得分:2)
主要是因为您的算法可以使用您选择的算法生成不受约束的输入。
首先,random.randint(1,100)
将生成一个介于1和100之间的数字。但您实际上正在使用100 - randint(1,100)
,偶尔会产生0。如果你得到两个move = 0的项目,那么实际上都没有人可以移动到另一个项目,所以你的循环永远不会退出。也许只需使用self.move = random.randint(1,100)
等等(生活和其他事情也是如此)。
还有其他约束也无效 - 请采用以下几行:
self.life = (self.life + self.defense) - enemy.attack
enemy.life = (enemy.life + enemy.defense) - self.attack
这有两个问题。一,如果x.defense&gt; y.attack,你实际上是在对象中添加生命。你可能想在self.life的初始值(或100,如果你真的想要治疗)饱和它。
第二,即使你这样做,你也可以这样: self.attack = 20 self.defense = 30 敌人。攻击= 20 enemy.defense = 30
这基本上是一场枕头大战:)因为攻击总是比防御更少,生命实际上都不会下降,这个循环将永远运行。你可能想在这里引入一个随机元素。
答案 1 :(得分:0)
你应该对“拒绝跑”和“超时”的含义更加具体。
我的理解是“超时”意味着你有一个无限循环。如果单元格之间没有遇到fight()
,那么您的程序将面临永久执行的风险。
我会对程序进行一些更改:
target()
作为普通函数移动。这样,Species
类将不依赖于全局填充数组。pprint
,而不是在最后。如果上面(随机运行的单元格)成立,则最终的pprint将无法执行。while
条件更改为在len() == 1
或最大迭代次数后结束HTH,