如何使用类在Python中初始化多个Turtle

如何使用类在Python中初始化多个Turtle,python,class,turtle-graphics,Python,Class,Turtle Graphics,我是Python的初学者,对Stack Exchange还不熟悉。我想写一个程序,让5只海龟在一个正方形内移动。我已经有了我想要的代码,但是它很乏味,我想用类来初始化我所有的海龟,而不是一个接一个地初始化。我只想让他们在随机坐标和随机航向开始 我的代码有以下问题: 屏幕上只显示一只海龟。下面的代码中定义了两个 海龟的航向和坐标没有被初始化 以下是我尝试过的代码: import numpy as np from turtle import * # setting up screen rese

我是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()
将numpy导入为np
从海龟进口*
#设置屏幕
重置()
屏幕尺寸(550)
Screen().bgcolor('黑色')
示踪剂(0)
#绘图箱
t0=海龟()
t0.penup()
t0.转到(-256,-256)
t0.颜色(“青色”)
t0.pendown()
对于范围(4)中的i:
t0.前进(512)
t0.左(90)
t0.ht()
#参数
速度=5
迭代次数=200
boxsize=512
ranheader=np.random.random()*360
ranx=np.random.random()*boxsize
rany=np.random.random()*boxsize
乌龟类代理(乌龟):
定义初始(自我):
self.up()
赛斯(兰希德)
self.setpos(ranx,rany)
自速度=速度
self.down()
#乌龟
t1=乌龟(乌龟)
t1.颜色(“绿色”)
t2=海龟(海龟)
t2.颜色(“蓝色”)
#海龟运动
对于海龟中的海龟():
对于范围内的i(迭代):
乌龟。前进(速度)
如果turtle.xcor()>=256:
turtle.goto(-256,t0.ycor())
elif turtle.xcor()=256:
goto(t0.xcor(),-256)

你应该考虑把你的海龟储存在<代码>清单>代码中,因为海龟已经是对象,你不需要创建一个类来移动它们到你的起始位置。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()
行替换为您希望turtles做的任何事情即可。在你的情况下,进入你方块内的一个随机位置。

< P>你应该考虑将你的海龟存储在<代码>列表>代码中,因为海龟已经是对象,你不需要创建一个类来移动它们到你的起始位置。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()
行替换为您希望turtles做的任何事情即可。在你的情况下,去一个随机的位置在你的广场

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

我相信问题在于你定义了一次随机位置和航向,在海龟创造循环之外,所以它们都从同一个地方开始,以相同的速度朝同一个方向移动。也就是说,它们正好在彼此的上面

我们不需要@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()
从海龟导入屏幕,海龟
从随机导入randrange,randint
#参数
颜色=[“绿色”、“蓝色”、“红色”、“橙色”、“白色”]
迭代次数=500次
速度=5
盒子大小=512
#设置屏幕
screen=screen()
屏幕设置(框大小+50,框大小+50)
screen.bgcolor('黑色')
屏幕跟踪(假)
#绘图箱
海龟
乌龟
海龟颜色('cyan')
乌龟
海龟。转到(-BOX_大小/2,-BOX_大小/2)
乌龟
对于范围(4)内的uu:
乌龟。向前(盒子大小)
乌龟。左(90)
#乌龟
对于颜色中的颜色:
角度=随机范围(360)
x=randint(-BOX\u SIZE/2,BOX\u SIZE/2)
y=randint(-BOX\u SIZE/2,BOX\u SIZE/2)
海龟
海龟。颜色(颜色)
乌龟.设置航向(角度)
乌龟
海龟。设定位置(x,y)
乌龟
#海龟运动
对于范围内的(迭代):
对于屏幕中的海龟。海龟()
乌龟。前进(速度)
x、 y=海龟位置()
如果x>=框大小/2:
乌龟
海龟。setx(-BOX_大小/2)
乌龟
elif x=盒子尺寸/2:
乌龟
乌龟.刚毛(-2号箱)
乌龟
艾利夫y
屏幕上只显示一只海龟。下面的代码中定义了两个。
海龟的航向和坐标没有被初始化

我相信问题在于你定义了一次随机位置和航向,在海龟创造循环之外,所以它们都从同一个地方开始,以相同的速度朝同一个方向移动。也就是说,它们正好在彼此的上面

我们不需要@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()
从海龟导入屏幕,海龟
从随机导入randrange,randint
#参数
颜色=[“绿色”、“蓝色”、“红色”、“橙色”、“白色”]
迭代次数=500次
速度=5
盒子大小=512
#设置屏幕
screen=screen()
屏幕设置(框大小+50,框大小+50)
screen.bgcolor('黑色')
屏幕跟踪(假)
#绘图箱
海龟
乌龟
海龟颜色('cyan')
乌龟
海龟。转到(-BOX_大小/2,-BOX_大小/2)
乌龟
对于范围(4)内的uu:
乌龟。向前(盒子大小)
乌龟。左(90)
#乌龟
对于颜色中的颜色:
角度=随机范围(360)
x=randint(-BOX\u SIZE/2,BOX\u SIZE/2)
y=randint(-BOX\u SIZE/2,BOX\u SIZE/2)
海龟
海龟。颜色(颜色)
乌龟.设置航向(角度)