2017-04-24 7 views
2

スペースバーを押してカメの起動と停止を行うプログラムをコーディングしようとしています。私はカメの移動を開始するコードを持っていますが、もう一度押すと停止しません。それはちょうどスピードを上げるようです。ここで私のコーディング要件と入力したコードです。スペースバーを持つPython turtleの起動と停止

カメを制御する3つの機能を持つカメプログラムを作成します。 turnLeftという関数を作成し、キーボード上で右矢印を押したときにカメを90度左に回します。 turnRightという関数を作成し、右矢印を押したときにカメを右に90度回転させます。スペースバーを押したときにカメを前方に移動させ、スペースバーをもう一度押すとカメを停止させるmove()という3番目の関数を作成します。

import turtle 

turtle.setup(400,500) 
wn = turtle.Screen() 
wn.title("Tess moves in space") 
wn.bgcolor("lightgreen") 
tess = turtle.Turtle() 

def leftTurtle(): 
    tess.left(90) 

def rightTurtle(): 
    tess.right(90) 

state_num = 0 

def advance_state_machine(): 
    global state_num 
    if state_num == 0:  
     tess.penup() 
     state_num = 1 
    else:  
     tess.pendown() 
     tess.forward(2) 
     state_num = 0 
    wn.ontimer(advance_state_machine, 25) 

def exitWindow(): 
    wn.bye() 

wn.onkey(advance_state_machine, "space") 
wn.onkey(exitWindow, "q") 
wn.onkey(leftTurtle, "Left") 
wn.onkey(rightTurtle, "Right") 

wn.listen()      
wn.mainloop() 

答えて

1

変更するにはいくつかの細かい点を除いてほぼ正しくなっています。グローバル変数state_numは、カメが動かなければならない場合は、advance_state_machine()関数で決定しました。あなたはターンのための適切なロジックを持っているので、なぜ移動/一時停止に同じロジックを適用しないのですか?

元のコードでは、表示されている各フレームを1つの状態から別の状態に切り替えるだけで、SPACEキーを使用して別のインスタンスadvance_state_machine()を開始したことにより、各SPACEでは、advance_state_machine()に実装されたさらなるループが既存のものと並行して実行されるようになったので、カメはより速くなりました。機能movementControl()以下のコードで

空間に逆のものにブールshould_moveの値を変更しadvance_state_machine()は亀の移動または停止させるためにshould_moveを評価:

import turtle 

turtle.setup(400,500) 
wn = turtle.Screen() 
wn.title("Tess moves in space") 
wn.bgcolor("lightgreen") 
tess = turtle.Turtle() 

def leftTurtle(): 
    tess.left(90) 

def rightTurtle(): 
    tess.right(90) 

should_move = False 

def movementControl(): 
    global should_move 
    should_move = not should_move 

def advance_state_machine(): 
    global should_move 
    if should_move:  
     tess.pendown() 
     tess.forward(2) 
    else:  
     tess.penup() 
    wn.ontimer(advance_state_machine, 25) 

def exitWindow(): 
    wn.bye() 

wn.onkey(movementControl, "space") 
wn.onkey(exitWindow, "q") 
wn.onkey(leftTurtle, "Left") 
wn.onkey(rightTurtle, "Right") 

wn.listen()      
advance_state_machine() 

wn.mainloop() 

うわ! cdlane'sで、私たちは本当に素敵な基本的なカメの例をここに置くのを助けます。

私はHISコードを最小限のバージョンに向けて少し修正し、movementControl()関数も削除しました。

私は個人的にはどこから来たのかを直接見ることができないので、利用可能なメソッドと変数が膨大な数になるため、from turtle import *種類のインポートステートメントを使用したくない非常に短いブロックのすべてのコードはそれの価値がないのですか?

from turtle import * 
setup(400, 500); title('Turtle moves in space') 
bgcolor('lightgreen'); up() 
def advance_state_machine(): 
    if isdown(): fd(2) 
    ontimer(advance_state_machine, 25) 
onkey(lambda: (pd, pu)[isdown()](), 'space') 
onkey(bye, 'q') 
onkey(lambda: lt(90), 'Left') 
onkey(lambda: rt(90), 'Right') 
listen(); advance_state_machine(); done() 
+1

また、should_draw' 'に' state_num'の名前を変更し、それはboolean型コードがよりよい読みになり、トグルになる作ります一行: 'should_draw = not should_draw'。 – 9000

+0

ありがとう@Claudioと9000 Y'all素晴らしいです...私は非常にコーディングとPythonに新しいです、そして、これは私のお尻を蹴っていた。これは完璧に動作します。もう1つの質問は、 'def movementControl():'と 'def advance_state_machine():'を1つの関数に組み合わせることですか? –

+1

@DavidWilliam:私はそうは思わない、非常に異なる時に 'advance_state_machine'と' movementControl'を呼び出す必要があります。 (また、一貫性のために、それらをcamelCaseまたはunderscore_caseのいずれかにしてください) – 9000

1

方法はstate_num及び/又はshould_moveが上記使用される状態変数は、カメ自身isdown()述語と同様に、冗長見ることができます。私はそれに応じクラウディオのソリューションを書き換えたが、isdown()ロジックが際立っているので、それはミニマリスト作った:

from turtle import * 

def movementControl(): 
    (pd, pu)[isdown()]() 

def advance_state_machine(): 
    if isdown(): 
     fd(2) 
    ontimer(advance_state_machine, 25) 

setup(400, 500) 
title('Turtle moves in space') 
bgcolor('lightgreen') 
up() 

onkey(movementControl, 'space') 
onkey(bye, 'q') 
onkey(lambda: lt(90), 'Left') 
onkey(lambda: rt(90), 'Right') 

listen() 

advance_state_machine() 

done() 
関連する問題