【问题标题】:How to initialize multiple turtles in Python with classes如何在 Python 中使用类初始化多个海龟
【发布时间】:2016-02-19 10:12:10
【问题描述】:

我是 Python 的初学者,并且是 Stack Exchange 的新手。我正在尝试编写一个程序,让 5 只海龟在一个正方形内移动。我有代码可以做我想做的事,但它很乏味,我想用类来初始化我所有的海龟,而不是一一做。我只是希望他们从随机坐标和随机标题开始。

我的代码的问题:

  • 屏幕上只显示一只海龟。下面的代码中定义了两个。

  • 海龟的航向和坐标未初始化。

这是我尝试过的代码:

import numpy as np
from turtle import *

# setting up screen
reset()
screensize(550)
Screen().bgcolor('black')
tracer(0)

# drawing box
t0 = Turtle()
t0.penup()
t0.goto(-256,-256)
t0.color('cyan')
t0.pendown()
for i in range(4):
    t0.forward(512)
    t0.left(90)
t0.ht()

# parameters
velocity = 5
iterations = 200
boxsize = 512
ranheader = np.random.random()*360
ranx = np.random.random()*boxsize
rany = np.random.random()*boxsize

class turtle_agents(Turtle):
    def _init_(self):
        self.up()
        self.seth(ranheader)
        self.setpos(ranx,rany)
        self.velocity = velocity
        self.down()

# turtle
t1 = turtle_agents()
t1.color('green')
t2 = turtle_agents()
t2.color('blue')

# turtle movement
for turtle in turtles():
    for i in range(iterations):
        turtle.forward(velocity)
        if turtle.xcor() >= 256:
            turtle.goto(-256,t0.ycor())
        elif turtle.xcor() <= -256:
            turtle.goto(256,t0.ycor())
        elif turtle.ycor() >= 256:
            turtle.goto(t0.xcor(),-256)
        elif turtle.ycor() <= -256:
            turtle.goto(t0.xcor(),256)

update()    
exitonclick()

【问题讨论】:

  • 也许两只海龟都站在同一个地方,所以你只看到一只?

标签: python class turtle-graphics


【解决方案1】:

屏幕上只显示一只乌龟。下面的代码中定义了两个。 海龟的航向和坐标没有被初始化。

我认为问题在于您在海龟创建循环之外定义了一次随机位置和航向,因此它们都从同一个地方开始,以相同的速度朝同一个方向移动。 IE。它们正好在彼此之上。

我们不需要@BlivetWidget 的显式List 来解决问题,因为正如您所发现的,海龟已经保存在一个列表中,我们可以通过屏幕的turtles() 方法获得该列表。以下是我为解决各种问题而对您的代码进行的修改:

from turtle import Screen, Turtle
from random import randrange, randint

# parameters
COLORS = ['green', 'blue', 'red', 'orange', 'white']
ITERATIONS = 500
VELOCITY = 5
BOX_SIZE = 512

# setting up screen
screen = Screen()
screen.setup(BOX_SIZE + 50, BOX_SIZE + 50)
screen.bgcolor('black')
screen.tracer(False)

# drawing box
turtle = Turtle()
turtle.hideturtle()
turtle.color('cyan')

turtle.penup()
turtle.goto(-BOX_SIZE/2, -BOX_SIZE/2)
turtle.pendown()

for _ in range(4):
    turtle.forward(BOX_SIZE)
    turtle.left(90)

# turtle
for color in COLORS:
    angle = randrange(360)
    x = randint(-BOX_SIZE/2, BOX_SIZE/2)
    y = randint(-BOX_SIZE/2, BOX_SIZE/2)

    turtle = Turtle()
    turtle.color(color)
    turtle.setheading(angle)
    turtle.penup()
    turtle.setposition(x, y)
    turtle.pendown()

# turtle movement
for _ in range(ITERATIONS):
    for turtle in screen.turtles():
        turtle.forward(VELOCITY)

        x, y = turtle.position()

        if x >= BOX_SIZE/2:
            turtle.penup()
            turtle.setx(-BOX_SIZE/2)
            turtle.pendown()
        elif x <= -BOX_SIZE/2:
            turtle.penup()
            turtle.setx(BOX_SIZE/2)
            turtle.pendown()
        elif y >= BOX_SIZE/2:
            turtle.penup()
            turtle.sety(-BOX_SIZE/2)
            turtle.pendown()
        elif y <= -BOX_SIZE/2:
            turtle.penup()
            turtle.sety(BOX_SIZE/2)
            turtle.pendown()

    screen.update()

screen.exitonclick()

我同意@BlivetWidget 的观点,“你不需要创建一个类来将它们移动到你的起始位置”。我在上面使用了一个简单的循环。

【讨论】:

    【解决方案2】:

    您应该考虑将您的海龟存储在list 中,因为海龟已经是对象,您不需要创建一个类来将它们移动到您的起始位置。 Python 中的列表非常强大,因为它们可以存储任意数据类型。在这里,我将创建 5 个海龟并移动它们,以便您区分它们:

    import turtle
    num_turtles = 5
    my_turtles = [turtle.Turtle() for i in range(num_turtles)]
    for i, turt in enumerate(my_turtles):
        turt.forward(50 * i)
    

    你想做同样的事情,只需将我的turt.forward() 行替换为你希望海龟做的任何事情。在你的情况下,去你方格内的一个随机位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2020-05-11
      • 2014-05-18
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多