如何用类初始化python中的多个海龟

时间:2015-11-17 21:13:58

标签: python class turtle-graphics

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

任何帮助将不胜感激。谢谢。

2 个答案:

答案 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的观点,“您无需创建类就可以将它们移至起始位置”。我在上面使用了一个简单的循环。

enter image description here