0

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))

何が起こっているかについて何か考えはありますか?これは以前は機能していましたが、現在は壊れています。お分かりのように、このプログラムは非常に単純なペトリ皿シミュレーターであり、いくつかの非常に知能の低い細胞が配置されています。

おまけの質問: 無限ループはコンピューターに悪影響を及ぼしますか? 私はそれらのいくつかを攻撃しましたが、どのような方法、形、または形でも自分のマシンを傷つける危険を冒したくありません.

4

2 に答える 2

2

ほとんどの場合、選択したアルゴリズムを使用して制約されていない入力をアルゴリズムが生成できるためです。

最初に、random.randint(1,100)1 から 100 までの数値を生成します。100 - randint(1,100)ただし、実際には使用しているため、0 が生成されることがあります。move=0 で 2 つのアイテムを取得した場合、どちらも実際に移動してもう一方のアイテムをエンゲージすることはできないため、ループが終了することはありません。代わりに使用するだけかもしれませんself.move = random.randint(1,100)(同じことが人生や他のものにも当てはまります)。

他にも無効な制約があります。次の行を使用してください。

self.life = (self.life + self.defense) - enemy.attack
enemy.life = (enemy.life + enemy.defense) - self.attack

これには 2 つの問題があります。1 つは、x.defense > y.attack の場合、実際にオブジェクトに生命を追加していることです。おそらく、これを self.life の初期値 (または、本当に回復したい場合は 100) で飽和させたいと思うでしょう。

第二に、それをしても、次のような場合があります: self.attack = 20 self.defense = 30 enemy.attack = 20 敵.defense = 30

これは基本的に枕投げです:)攻撃は常に防御よりも小さいため、どちらのライフも実際にダウンすることはなく、このループは永遠に続きます. ここでランダムな要素を導入することをお勧めします。

于 2013-10-02T14:09:12.797 に答える