0

私は受け取ったアドバイスに従って、この質問をやり直すことにしました。コードにバグがあり、どこを修正すればよいかわかりません。バグ 1 プログラムを実行すると、ペンが立っていてもタートルが描画を開始します。BUG 2 's、7、tab' などの未定義キーが space_bar 関数をトリガーする

塗り絵

このタスクでは、図形の周りをなぞってから塗りつぶすことで、与えられた絵に色を付けることができる子供向けの塗り絵ゲームを作成します。コントロールは次のとおりです。

矢印キー - 「ブラシ」(タートル カーソル) を左、右、上、または下に一定量だけ移動します。

'z' - 最後のステップを元に戻します。

'r', 'g', 'b' - ブラシの色をそれぞれ赤、緑、青に変更します。(必要に応じてさらに多くの色を定義できますが、少なくともこれら 3 つが必要です。)

SPACE BAR - ペイント モードを切り替えます。初期モードである「移動」モードでは、「筆」(カメ)は描画せずに画面上を動き回ります。「ペイント」モードでは、ブラシが動くと色付きの線が残ります。最も重要なことは、モードが「ペイント」から「移動」に変更されると、ブラシによってトレースされた領域が色で塗りつぶされることです。

from turtle import *
from functools import partial 
bgpic("Colour_A_Turkey.gif") # change this to change the picture

#control the accuracy/speed of the drawing 
step_size =8
pensize(4)
penup()

# whenever spacebar is pressed the current state  and next state switch values 
current_state = penup
next_state = pendown
def space_bar():
    global current_state, next_state
    next_state()
    current_state, next_state = next_state, current_state
    #if the current stat is penup fill in with current colour
    if current_state == penup:
        end_fill()
    else:
        begin_fill()
onkey(space_bar, " ")

# undo do a mistake function
def mistake():
    undo()
onkey(mistake, "z")

#using partial function to store the following functions
#so they can be called  as arguments from a dictionary
#movement
strait = partial(fd, step_size)
reverse = partial(bk, step_size)
turn_rt = partial(rt, step_size)
turn_lf = partial(lt, step_size)

#colour
brow = partial(color, "brown")
gree = partial(color, "green")
yell = partial(color, "yellow")
oran = partial(color, "orange")
purp = partial(color, "purple")
red = partial(color, "red")
blue = partial(color, "blue")


#create a dictionary to store all the keys and there abilities 
key_action = {"b" : blue, "r" : red, "p" : purp, "o" : oran,\
          "y" : yell, "g" : gree, "w" : brow, "Right" : turn_rt , "Up" : strait,\
          "Down" : reverse, "Left" : turn_lf, "z" : undo()}

#when a key in then above dictionary
#is pressed it's function  is activated
for pressed_key, activated_key in key_action.items():
    onkey(activated_key, pressed_key)  

#make turtle look for key strokes with predefined function
listen()
#finish
done()
4

3 に答える 3

1

Python では、すべてがオブジェクトであり、実際には. 関数もオブジェクトです。関数をディクショナリに格納できます。実際、それはまさにあなたがここでやりたいと思っていることです。

turn_lf = lt(step_size )

ltここでの重要な問題は、「をstep_size引数として呼び出す関数」を格納したいということですが、ここではすぐltに引数としてを呼び出しstep_size、戻り値を格納しています。

おそらく、必要なものを取得する最も簡単な方法は、引数functools.partialを「バインド」することです。step_size

from functools import partial
turn_lf = partial(lt, step_size) # `lt` is not called yet.

# Now, later on, we can do
turn_lf() # and it's just as if we did `lt(step_size)`.
# So now we can store `turn_lf` in a dict, look it up and call it later, etc.

# Similarly for all the other functions you want to make.

(もう 1 つの問題は、これに一貫性がないことです。すべてを 1 つの dict に入れたい場合は、color関数のバインドも指定する必要があります。'brown'結局のところ、単なる文字列です。幸いなことに、これは単なる文字列です。他の関数と同じように単純partial(color, 'brown')です。

については"z" : delete、そうですね - バインドする引数はありませんundo。したがって、パターンに従って書くこともできpartial(undo)ますが(何もバインドしていないため、これ以上引数がないことに注意してください)、直接書くだけの方がはるかに理にかなっていundoます。

余談ですが、これを単純化できます。

for key in key_action:
    pressed_key = key
    activated_key = key_action[key]

これに:

for pressed_key, activated_key in key_action.items():
于 2013-04-11T07:23:24.133 に答える
-1

なぜすべての関数を定義するのですか? 直接使用できます:

key_action = {"b" : "blue", "r" : "red", "p" : "purple", "o" : "orange", "y" : "yellow","g" : "green", "w" : "brown","Right" : rt , "Left": lt, "Up" : fd, "Down" : bk,"z" : undo}


no_input = ["z"]

one_input = ["Right", "Left", "Up", "Down"]

for key in key_action:
    activated_key = key_action[key]
    if key in no_input:
       activated_key()
    elif key in one_input():
        activated_key(step_size)
    else:
        onkey(color(activated_key), key)
于 2013-04-11T05:18:53.270 に答える