为什么示踪剂在 Python 中制造了另一只乌龟

Why is the tracer making another turtle in Python

所以,我正在使用 Python 的海龟模块制作塔防游戏,我才刚刚开始。但出于某种原因,一开始的 .tracer 出于某种原因为我创建了一个额外的乌龟。我不知道为什么。我有 3 个 类,到目前为止,我只定义了 4 个精灵:Helper、Enemy、Enemy、Enemy。当我移除示踪剂时,乌龟突然消失了。我访问了我的海龟列表并开始删除它们。那没有用。这是代码:

import turtle as t
import random as r

wn = t.Screen()
wn.tracer(0)
class Sprite():
    def __init__(self, color, speed, shape, ento, x, y):
        self.sprite = t.Turtle()
        self.color = color
        self.speed = speed
        self.shape = shape
        self.ento = ento
        self.x = x
        self.y = y


    def render(self, pen):
        pen.speed(0)
        pen.color(self.color)
        pen.shape(self.shape)
        pen.up()
        pen.goto(self.x, self.y)

class Helper(Sprite):
    def __init__(self, color, speed, damage, shape, x, y):
        self.sprite = Sprite(color, speed, shape, 'Helper', x, y)
        self.helper = t.Turtle()
        self.color = color
        self.speed = speed
        self.shape = shape
        self.ento = 'Helper'
        self.damage = damage
        self.x = x
        self.y = y

    def fire(self):
        pass

class Enemy(Sprite):
    def __init__(self, color, speed, health, shape, x, y):
        self.sprite = Sprite(color, speed, shape, 'Enemy', x, y)
        self.enemy = t.Turtle()
        self.color = color
        self.speed = speed
        self.shape = shape
        self.ento = 'Enemy'
        self.health = health
        self.x = x
        self.y = y
        self.state = 'frozen'
        self.tick = 0


    def move(self):
        if self.state == 'frozen':
            self.state = 'moving'
            self.tick = 0
        self.enemy.forward(self.speed)
        self.x = self.enemy.xcor()
        self.y = self.enemy.ycor()
        self.tick += 1
helpers = []
for i in range(1):
    test = Helper('green', 1, 1, 'square', 0, 0)
enemies = []
for i in range(3):
    enemies.append(Enemy('red', 1, 1, 'circle', r.randint(-100, 100), r.randint(-100, 100)))

print(wn._turtles)
while True:
    wn.update()
    test.render(test.helper)
    for enemy in enemies:
        enemy.render(enemy.enemy)
        enemy.move()

为什么这不起作用。我在 windows 电脑上工作。我不太确定这是否只适用于我或所有人。

你的目标代码是一场灾难。考虑这个逻辑:

class Sprite():
    def __init__(self, color, speed, shape, ento, x, y):
        self.sprite = t.Turtle()
    #...

class Helper(Sprite):
    def __init__(self, color, speed, damage, shape, x, y):
        self.sprite = Sprite(color, speed, shape, 'Helper', x, y)

Helper 是一个 Sprite但它不调用super(),而是有一个 Sprite 在里面 Sprite 创造的乌龟会在哪里?我迷路了。我认为我们需要使代码 object-oriented 而不是简单地 object-based:

from turtle import Screen, Turtle
from random import randint

class Sprite(Turtle):
    def __init__(self, color, pace, shape, ento, x, y):
        super().__init__()

        self.color(color)
        self.shape(shape)

        self.penup()

        self.pace = pace
        self.ento = ento
        self.x = x
        self.y = y

    def render(self):
        self.goto(self.x, self.y)

class Helper(Sprite):
    def __init__(self, color, pace, damage, shape, x, y):
        super().__init__(color, pace, shape, 'Helper', x, y)

        self.damage = damage

    def fire(self):
        pass

class Enemy(Sprite):
    def __init__(self, color, pace, health, shape, x, y):
        super().__init__(color, pace, shape, 'Enemy', x, y)

        self.health = health
        self.state = 'frozen'
        self.tick = 0

    def move(self):
        if self.state == 'frozen':
            self.state = 'moving'
            self.tick = 0

        self.forward(self.pace)
        self.x = self.xcor()
        self.y = self.ycor()
        self.tick += 1

screen = Screen()
screen.tracer(0)

helpers = []
for _ in range(1):
    helpers.append(Helper('green', 1, 1, 'square', 0, 0))

enemies = []
for _ in range(3):
    enemies.append(Enemy('red', 1, 1, 'circle', randint(-100, 100), randint(-100, 100)))

while True:
    helpers[0].render()

    for enemy in enemies:
        enemy.render()
        enemy.move()

    screen.update()

清理您的代码似乎也清理了您的 extra 海龟问题。我将 speed 重命名为 pace 以防止它与 turtle 自己的 speed 方法混淆。