我是Python的初学者,我是堆栈交换的新手。我正在尝试编写一个程序,其中有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()
任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
您应该考虑将海龟存放在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()
线。在你的情况下,去你广场的随机位置。
答案 1 :(得分:0)
屏幕上只显示一只乌龟。在下面的代码中定义了两个。 龟的方向和坐标尚未初始化。
我相信问题是,您在海龟创建循环之外定义了随机位置和方向一次,因此它们都从相同的位置开始,以相同的方向以相同的方向移动。即他们是彼此对立的。
我们不需要@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的观点,“您无需创建类就可以将它们移至起始位置”。我在上面使用了一个简单的循环。