【问题标题】:Make snowman moveable via arrow keys in Python turtle drawing通过 Python 海龟绘图中的箭头键使雪人可移动
【发布时间】:2019-04-15 03:12:33
【问题描述】:

预期结果:雪人可以通过箭头键向右、向左、向上和向下移动,也可以使用键盘上的箭头键移动。

已经尝试过t.speedt.gotot.move 等。我在网上找到的几乎所有命令都涉及海龟的动作。老实说,我在这里完全被难住了,可以使用任何帮助。

import turtle
t = turtle.Turtle()
def create_oval(color, radius, x, y):
    t.penup()
    t.fillcolor(color)
    t.goto(x,y)
    t.pendown()
    t.begin_fill()
    t.circle(radius)
    t.end_fill()

#drawing body for snowman
create_oval("#ffffff", 30, 0, -40)
create_oval("#ffffff", 40, 0, -100)
create_oval("#ffffff", 60, 0, -200)

create_oval("#ffffff", 2, -10, -10) #drawing left eye for snowman
create_oval("#ffffff", 2, 10, -10) #drawing right eye for snowman
create_oval("#ffffff", 3, 0, -15) #drawing nose for snowman

# drawing buttons for snowman
create_oval("#ffffff", 2, 0, -40) #drawing left eye for snowman
create_oval("#ffffff", 2, 0, -55) #drawing right eye for snowman
create_oval("#ffffff", 2, 0, -65)

def create_line(x, y, length, angle):
    t.penup()
    t.goto(x, y)
    t.setheading(angle)
    t.pendown()
    t.forward(length)
    t.setheading(angle + 20)
    t.forward(20)
    t.penup()
    t.back(20)
    t.pendown()
    t.setheading(angle - 20)
    t.forward(20)
    t.penup()
    t.home()

create_line(-70, -50, 50, 160) #drawing left arm for snowman
create_line(70, -50, 50, 20) #drawing right arm for snowman


def create_rectangle(x, y, width, height): #drawing hat for snowman
    t.penup()
    t.goto(x, y)
    t.fillcolor("black")
    t.pendown()
    t.fillcolor("black")
    t.begin_fill()
    t.forward(width)
    t.left(90)
    t.forward(height)
    t.left(90)
    t.forward(width)
    t.left(90)
    t.forward(height)
    t.left(90)
    t.end_fill()

create_rectangle(-22, 20, 50, 70)

def create_rectangle(x, y, width, height): #drawing hat for snowman
    t.penup()
    t.goto(x, y)
    t.fillcolor("black")
    t.pendown()
    t.fillcolor("black")
    t.begin_fill()
    t.forward(width)
    t.left(90)
    t.forward(height)
    t.left(90)
    t.forward(width)
    t.left(90)
    t.forward(height)
    t.left(90)
    t.end_fill()

create_rectangle(-35, 20, 75, 20)

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    我可以通过几种方式来解决这个问题。更优雅的方法是使用重塑的海龟来制作雪人的所有组件,例如通过shapesize() 和通过shape() 的内置形状。然后要移动雪人,你只需要集体要求组成它的所有海龟移动。这将允许更大范围的技巧。 (例如颠倒过来!)

    更暴力的方法是将构建雪人的所有命令封装到一个函数中,该函数接受 X 和 Y 参数,您将这些参数添加到您调用的命令的所有 X 和 Y 参数中。然后我们会关闭可见的屏幕更新 clear() 并在新位置完全重绘雪人。

    更暴力的方法需要对您的代码进行更少的更改,如下所示,仅实现雪人的左右箭头移动:

    from turtle import Screen, Turtle
    
    def create_oval(color, radius, x, y):
        turtle.penup()
        turtle.goto(x, y)
        turtle.pendown()
        turtle.fillcolor(color)
    
        turtle.begin_fill()
        turtle.circle(radius)
        turtle.end_fill()
    
    def create_line(x, y, length, angle):
        turtle.penup()
        turtle.goto(x, y)
        turtle.setheading(angle)
        turtle.pendown()
    
        turtle.forward(length)
        turtle.setheading(angle + 20)
        turtle.forward(20)
    
        turtle.penup()
        turtle.back(20)
        turtle.pendown()
    
        turtle.setheading(angle - 20)
        turtle.forward(20)
    
        turtle.penup()
    
    def create_rectangle(x, y, width, height): # drawing hat for snowman
        turtle.penup()
        turtle.goto(x, y)
        turtle.fillcolor("black")
        turtle.pendown()
    
        turtle.begin_fill()
        turtle.forward(width)
        turtle.left(90)
        turtle.forward(height)
        turtle.left(90)
        turtle.forward(width)
        turtle.left(90)
        turtle.forward(height)
        turtle.left(90)
        turtle.end_fill()
    
    def draw_snowman(x, y):
    
        # drawing body for snowman
        create_oval('white', 30, 0 + x, -40 + y)
        create_oval('white', 40, 0 + x, -100 + y)
        create_oval('white', 60, 0 + x, -200 + y)
    
        create_oval('white', 2, -10 + x, -10 + y)  # drawing left eye for snowman
        create_oval('white', 2, 10 + x, -10 + y)  # drawing right eye for snowman
        create_oval('white', 3, 0 + x, -15 + y)  # drawing nose for snowman
    
        # drawing buttons for snowman
        create_oval('white', 2, 0 + x, -40 + y)  # drawing left eye for snowman
        create_oval('white', 2, 0 + x, -55 + y)  # drawing right eye for snowman
        create_oval('white', 2, 0 + x, -65 + y)
    
        create_line(-70 + x, -50 + y, 50, 160)  # drawing left arm for snowman
        create_line(70 + x, -50 + y, 50, 20)  # drawing right arm for snowman
    
        create_rectangle(-22 + x, 20 + y, 50, 70)
        create_rectangle(-35 + x, 20 + y, 75, 20)
    
    snow_x, snow_y = 0, 0
    
    def move_left():
        global snow_x
    
        turtle.clear()
    
        snow_x -= 10
        draw_snowman(snow_x, snow_y)
    
    def move_right():
        global snow_x
    
        turtle.clear()
    
        snow_x += 10
        draw_snowman(snow_x, snow_y)
    
    screen = Screen()
    screen.tracer(False)
    
    turtle = Turtle(visible=False)
    
    draw_snowman(snow_x, snow_y)
    
    screen.onkey(move_left, "Left")
    screen.onkey(move_right, "Right")
    
    screen.listen()
    screen.mainloop()
    

    【讨论】: