3

レース トラック (同じサイズで別々のトラック) に 2 つのカメを設定するように求められる課題があります。私はそれらを動かすことができますが、最初のものがトラックの半分を動かしたときにのみ2番目のものは動きます. カメを同時に動かす方法がわかりません。これが私のコードです:

import turtle
import random
import time

wn = turtle.Screen()
wn.bgcolor("lightgreen")

t = turtle.Turtle()
t.shape('turtle')
t.color('red')

t2 = turtle.Turtle()
t2.shape('turtle')
t2.color('blue')

#user input function

p = float(input('please insert the perimeter:'))

#set the track
def drawTrack(p,r):
    shortside = (p/2.0)/(r+1)
    longside = r*shortside
    turtle.setup((shortside*2)+60, longside +40)
    t.penup()
    t2.penup()
    t.setposition(-shortside-10, -longside/2)
    t2.setposition(10, -longside/2)   
    for i in range (2):
        #first track
        t.speed(1)
        t.pendown()
        t.forward(shortside)
        t.left(90)
        t.forward(longside)
        t.left(90)
        
        #second track
        t2.speed(1)
        t2.pendown()
        t2.forward(shortside)
        t2.left(90)
        t2.forward(longside)
        t2.left(90) 

drawTrack(p,2)

wn.exitonclick()
4

2 に答える 2

3

これにはいくつかの方法があります。

イベントを使用する 1 つの方法screen.ontimer()(タートルのドキュメントを参照)。このアプローチは、タートルを実際のクロック時間に合わせて調整でき、タートル イベント ループ内で実行できるため、他のイベント ( などexitonclick()) も発生するので便利です。

私が以下で使用したアプローチは、タートルの動きを Pythonジェネレーター内の小さなステップに分割することです。これにより、タートルを交互に切り替えることができます。レースはタートル イベント ループの前に行われるためexitonclick()、レースが終了するまで無効です。

速度の違いを提供するために、モーション計算の一部としてタートルの描画速度を使用しturtle1.speed("fast")ましたturtle2.speed("slow")。ランダムな速度やさまざまな速度を使用してこれを行う方法は他にもあります。

周囲のプロンプトをダイアログ ボックスに変更し、さまざまなスタイルの微調整を行いました。

from turtle import Turtle, Screen

screen = Screen()
screen.bgcolor("lightgreen")

turtle1 = Turtle(shape='turtle')
turtle1.color('red')
turtle1.speed("slow")  # = 3
turtle1.penup()

turtle2 = Turtle(shape='turtle')
turtle2.color('blue')
turtle2.speed(4)  # "slow" (3) < 4 < "normal" (6)
turtle2.penup()

# user input function

perimeter = screen.numinput("Track Perimeter", "Please enter the perimeter:", default=2000, minval=500, maxval=3000)

def full_track_crawl(turtle, shortside, longside):
    speed = turtle.speed()
    turtle.pendown()

    for j in range (2):
        for i in range(0, int(shortside), speed):
            turtle.forward(speed)
            yield(0)
        turtle.left(90)
        for i in range(0, int(longside), speed):
            turtle.forward(speed)
            yield(0)
        turtle.left(90)

    turtle.penup()

# set the track
def drawTrack(perimeter, ratio):
    shortside = (perimeter / 2.0) / (ratio + 1)
    longside = ratio * shortside

    screen.setup(shortside * 2 + 60, longside + 40)

    turtle1.setposition(-shortside - 10, -longside / 2)
    turtle2.setposition(10, -longside / 2)   

    generator1 = full_track_crawl(turtle1, shortside, longside)
    generator2 = full_track_crawl(turtle2, shortside, longside)

    while (next(generator1, 1) + next(generator2, 1) < 2):
        pass

drawTrack(perimeter, 2)

screen.exitonclick()

ハッピーレース!

于 2016-10-14T22:21:32.053 に答える
3

タートルをそれぞれ小さな増分で繰り返し動かし、最大 1 ピクセルだけ離れるようにします。

# Setup 
import turtle

screen = turtle.Screen()
screen.bgcolor("white")
screen.title("Turtle Movement")
screen.setup(width=500, height=500)

# Object 1 set up
obj1 = turtle.Turtle()
obj1.color("red") # Sets obj1's colour
obj1.speed(0) # The drawing speed will go as fast as it can if it is set to zero
obj1.penup() # Don't want it to draw a line as I goes to 0, -50
obj1.goto(0, -50) # goes to 0, -50
obj1.pendown() # Now we want it to draw

# Object 2 set up
obj2 = turtle.Turtle()
obj2.color("blue") # sets obj2's colour
obj2.speed(0) # The drawing speed will go as fast as it can if it is set to zero
obj2.penup() # Don't want it to draw a line as I goes to 0, -50
obj2.goto(0, 50) # goes to 0, 50
obj2.pendown() # Now we want it to draw

# Movement of objects
while True: # infinite loop
    obj1.forward(1) # Moves obj1 forwards by 1
    obj2.forward(1) # Moves obj2 forwards by 1

注: たとえば、「移動量」が小さいほど、forward(Movement amount is in here)動きはスムーズになりますが、速度が低下します。値を微調整して実験することをお勧めします。

于 2020-02-25T08:36:09.620 に答える