Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么追踪者要用Python制作另一只海龟_Python_Python Turtle - Fatal编程技术网

为什么追踪者要用Python制作另一只海龟

为什么追踪者要用Python制作另一只海龟,python,python-turtle,Python,Python Turtle,所以,我正在使用Python的海龟模块制作一个塔防游戏,我刚刚开始。但出于某种原因,.tracer在一开始就为我创建了一个额外的海龟。我不知道为什么。我有3个职业,到目前为止,我只定义了4个精灵:助手,敌人,敌人。当我取下跟踪器时,海龟突然消失了。我访问了我的海龟列表并开始删除它们。那没用。代码如下: import turtle as t import random as r wn = t.Screen() wn.tracer(0) class Sprite(): def __init

所以,我正在使用Python的海龟模块制作一个塔防游戏,我刚刚开始。但出于某种原因,.tracer在一开始就为我创建了一个额外的海龟。我不知道为什么。我有3个职业,到目前为止,我只定义了4个精灵:助手,敌人,敌人。当我取下跟踪器时,海龟突然消失了。我访问了我的海龟列表并开始删除它们。那没用。代码如下:

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
?我迷路了。我认为我们需要使代码面向对象,而不是简单地基于对象:

这种代码清理似乎也解决了额外的海龟问题。我把
speed
改名为
pace
,以防止它与海龟自己的
speed
方法混淆

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