2016-10-14 12 views
0

こんにちは私はレーストラック(同じサイズだが別のトラック)で2頭のカメをセットするように求められている課題を持っている。私はそれらを動かせるようにすることができますが、第1のものがトラックの半分を動かしたときだけ第2のものが動く。私はカメを同時に動かす方法を知らない。ここで私のコードは、あなたがそれについての任意のアイデアがあれば私を助けてください。ありがとうございました!複数のカメを同時にPythonで移動するには?

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

答えて

2

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

イベントを使用する1つの方法(タートルのドキュメントを参照)。screen.ontimer()イベントを使用する1つの方法。この方法はカメを実際の時計の時間に合わせることができ、他のイベントも(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() 

ハッピーレース!

+0

返信ありがとうございます。 – CodeLearner

+0

yield(0)、while(next(generator1、1)+ next(generator2、1)<2): が合格しました。ブラケットの#1は何を意味しますか? – CodeLearner

+0

@ CodeLearner、ここではちょっとしたトリッキーが起こっています。ジェネレータは、0を出力するか、結果が不足します。 'next(...、1)'のオプションの第2引数は、ジェネレータの結果が不足した場合に返すものです。したがって、2つの 'next()'ステートメントの合計が2に等しくなるまで、ジェネレータの1つは依然として結果を得ています。私。少なくとも1つのカメは依然としてレースを走っているので、ジェネレータを呼び出すようにしてください。 – cdlane

関連する問題