【问题标题】:How do you create boundaries for turtles?你如何为海龟创建边界?
【发布时间】:2021-12-23 02:41:32
【问题描述】:

当我的海龟离开浅蓝色方块时,我希望它们朝方块中间移动,以便它们再次进入方块内。然而,他们似乎没有响应我的最后一个 for 循环。目标是不让海龟离开浅蓝色方块。

import turtle
import random

bobby = turtle.Turtle()
robby = turtle.Turtle()

bobby.color('blue')
robby.color('red')

bobby.shape('turtle')
robby.shape('turtle')

robby.speed(0)
bobby.speed(0)
def rectangle(x, y, width, height, color):
    bobby.penup()
    bobby.goto(x, y)
    bobby.pendown()
    bobby.setheading(0)
    bobby.fillcolor(color)
    for i in range(2):
        bobby.begin_fill()
        bobby.forward(width)
        bobby.left(90)
        bobby.forward(height)
        bobby.left(90)
        bobby.end_fill()

rectangle(-250, -250, 500, 500, 'lightblue')

directions = list(range(-45, 45))
forward = list(range(0, 25))

x = list(range(-250, 250))
y = list(range(-250, 250))

def jump(x, y, Aturtle):
    Aturtle.penup()
    Aturtle.goto(x, y)
    Aturtle.pendown()

jump(random.choice(x), random.choice(y), bobby) 
jump(random.choice(x), random.choice(y), robby) 

def move_random(Aturtle, dir, forw):
    Aturtle.setheading(Aturtle.heading() + random.choice(dir))
    Aturtle.forward(random.choice(forw))

for i in range(250):
    if bobby.xcor() and bobby.ycor() and robby.xcor() and robby.ycor() < 250:
        move_random(bobby, directions, forward)
        move_random(robby, directions, forward)
    else:
        bobby.towards(0, 0) 
        robby.towards(0, 0)

turtle.done()

【问题讨论】:

  • 这是关于最后一个 for 循环中的 if bobby.xcor() and bobby.ycor() and robby.xcor() and robby.ycor() &lt; 250:
  • and 无法按预期工作 - 您必须将每个值与 &lt; 250 分别进行比较 - bobby.xcor() &lt; 250 and bobby.ycor() &lt; 250 and ...

标签: python turtle-graphics python-turtle


【解决方案1】:

这个逻辑:

bobby.towards(0, 0)

不完整——它只是做一个计算,它不影响海龟的方向。为此,您需要这样做:

bobby.setheading(bobby.towards(0, 0))

这种逻辑是一厢情愿的想法和错误的想法:

if bobby.xcor() and bobby.ycor() and robby.xcor() and robby.ycor() < 250:

Bobby 的碰撞独立于 Robby 的碰撞,因此我们无法使用单个 if 语句来处理它们。我们需要对位置进行明确的比较,尽管 Python 确实为我们提供了一种相当紧凑的方式来做到这一点:

if -250 < bobby.xcor() < 250 and -250 < bobby.ycor() < 250:
    move_random(bobby, directions, distances)
else:
    bobby.setheading(bobby.towards(0, 0))

为了解决上述问题和我发现的任何其他问题,您的代码将被重新修改:

from turtle import Screen, Turtle
from random import choice

def rectangle(x, y, width, height, color):
    bobby.penup()
    bobby.goto(x, y)
    bobby.pendown()
    bobby.setheading(0)
    bobby.fillcolor(color)

    for _ in range(2):
        bobby.begin_fill()

        bobby.forward(width)
        bobby.left(90)
        bobby.forward(height)

        bobby.end_fill()
        bobby.left(90)

    bobby.fillcolor(bobby.pencolor())


def jump(x, y, turtle):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()

def move_random(turtle, directions, distances):
    turtle.setheading(turtle.heading() + choice(directions))
    turtle.forward(choice(distances))

def move():
    if -250 < bobby.xcor() < 250 and -250 < bobby.ycor() < 250:
        move_random(bobby, directions, distances)
    else:
        bobby.setheading(bobby.towards(0, 0))
        move_random(bobby, [0], distances)

    if -250 < robby.xcor() < 250 and -250 < robby.ycor() < 250:
        move_random(robby, directions, distances)
    else:
        robby.setheading(robby.towards(0, 0))
        move_random(robby, [0], distances)

    screen.ontimer(move)

screen = Screen()

bobby = Turtle()
bobby.shape('turtle')
bobby.color('blue')
bobby.speed('fastest')

robby = Turtle()
robby.shape('turtle')
robby.color('red')
robby.speed('fastest')

rectangle(-250, -250, 500, 500, 'lightblue')

directions = list(range(-45, 45))
distances = list(range(0, 25))

x = list(range(-250, 250))
y = list(range(-250, 250))

jump(choice(x), choice(y), bobby)
jump(choice(x), choice(y), robby)

move()

screen.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2022-01-04
    • 2021-09-18
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多