如何从画布上弹回龟

时间:2016-07-24 09:20:08

标签: python function graphics turtle-graphics bounce

我目前正在学习Charles Dierbach的书“使用Python的计算机科学导论”。

我正试图让我的乌龟从画布上反弹,但它不起作用。我尝试了不同的变化,但无法解决它

这是我的代码:

    #Drunkard walk PYTHON

from turtle import *
from random import *

#draw a house
def house(t):
    pu()
    goto(270,100)
    pd()
    pensize(5)
    for i in range(4):
        fd(100)
        right(90)
    setheading(120)
    fd(100)
    setheading(240)
    fd(100)
    pu()
    goto(200,0)
    pd()
    setheading(90)
    fd(70)
    setheading(0)
    fd(40)
    setheading(270)
    fd(70)
    pu()


#make roads
def road(t):
    pu()
    goto(80, 280)
    pd()
    begin_fill()
    color('black')
    setheading(270)
    fd(250)
    setheading(180)
    fd(100)
    setheading(90)
    fd(250)
    setheading(0)
    fd(100)
    end_fill()
    pu()
    goto(80,25)
    pd()
    begin_fill()
    color('white')
    setheading(270)
    for i in range(4):
        fd(70)
        right(90)
        fd(100)
        right(90)
    end_fill()
    pu()
    goto(80, -45)
    pd()
    begin_fill()
    color('black')
    setheading(270)
    fd(240)
    setheading(180)
    fd(100)
    setheading(90)
    fd(240)
    setheading(0)
    fd(100)
    end_fill()

  #this is my code to keep turtle on canvas   
def isInScreen(window, t):
    xmin=-299
    xmax=299
    ymin=-299
    ymax=299

    xTcor = t.xcor()
    yTcor = t.ycor()

    if xTcor<xmin or xTcor>xmax:
        new_heading = (180 - t.heading())
        return new_heading
    if yTcor<ymin or yTcor>ymax:
        new_heading = (360 - t.heading())
        return new_heading
    #house coord
    if (170<=xTcor<=200 or 200<=xTcor<=270)and yTcor==0:
        new_heading = (360 - t.heading())
        return new_heading
    if xTcor==170 and 0<=yTcor<=100:
        new_heading = (180 - t.heading())
        return new_heading
    if (170<=xTcor<=200 or 200<=xTcor<=270) and yTcor==100:
        new_heading = (360 - t.heading())
        return new_heading
    if xTcor==270 and 0<=yTcor<=100:
        new_heading = (180 - t.heading())
        return new_heading
    if 170<=xTcor<=271 and 100<=yTcor<=150:
        new_heading = (360 - t.heading())
        return new_heading
    if  200<=xTcor<=240 and yTcor ==0:
        new_heading = 0 
        return new_heading
    return  100




#################MAIN####################
setup(600,600)
window=Screen()
window.title("Drunkard walk")
window.bgcolor("grey")


#get the turtle and change the shape
t=getturtle()
t.shape('turtle')
shapesize(2,1.2,1.2)

pu()

#change coords and make the ouer roads
goto(290,290)
pd()
setheading(270)
pensize(10)

for i in range(4):
    fd(580)
    right(90)


shape('circle')
house(t)
goto(80,0)
road(t)
penup()
goto(-250,-260)
shapesize(1,1,1)
walking = True
while walking:
    pendown()
    fd(10)
    color = choice(["black", "red", "yellow", "blue", "white", "green"]) 
    fillcolor(color)
    ch = randrange(2)
    if ch == 0:
        left(90)
    else:
        right(90)
    setheading(isInScreen(window, t))


mainloop()
exitonclick()

1 个答案:

答案 0 :(得分:0)

我从你的代码中提取了一个最小的例子,让它在屏幕上弹跳。关键变化是:

1)你的例行程序决定乌龟是否应该从墙上弹回来,如果乌龟实际上没有到达墙上也不应该做任何事情 - 但是无论如何你都会返回一个新的标题

2)使用乌龟图形时不应该创建无限循环,这会阻止事件处理程序运行(例如exitonclick()在代码中不起作用,因为它从未到达。)Intead使用计时器功能提供在事件框架内运行您的乌龟:

import turtle

CANVAS_WIDTH, CANVAS_HEIGHT = 600, 600

def headIntoCanvas(t):
    """ keep turtle on canvas """
    xmin, xmax = -CANVAS_WIDTH // 2, CANVAS_WIDTH // 2
    ymin, ymax = -CANVAS_HEIGHT // 2, CANVAS_HEIGHT // 2

    xTcor, yTcor = t.position()

    old_heading = t.heading()

    if not xmin < xTcor < xmax:
        new_heading = (180 - old_heading)
        return new_heading  # bounce off wall

    if not ymin < yTcor < ymax:
        new_heading = (360 - old_heading)
        return new_heading  # bounce off floor/ceiling

    return old_heading  # stay the course

def motion():
    """ make the turtle march around """
    t.forward(5)
    t.setheading(headIntoCanvas(t))
    turtle.ontimer(motion, 25)  # again!

turtle.setup(CANVAS_WIDTH, CANVAS_HEIGHT)

# get the turtle and change the shape
t = turtle.Turtle()
t.shape('circle')
t.shapesize(1, 1, 1)
t.speed("fastest")

t.penup()
t.goto(- CANVAS_WIDTH // 3, - CANVAS_HEIGHT // 3)
t.pendown()

t.setheading(120)

motion()

turtle.exitonclick()

enter image description here