用python制作弹跳龟

时间:2016-10-01 15:17:27

标签: python turtle-graphics

我是python的初学者 我写了这个代码,用它制作弹跳球,但有一些像球消失的错误

import turtle
turtle.shape("circle")
xdir = 1
x = 1
y = 1
ydir = 1
while True:
     x = x + 3 * xdir
     y = y + 3 * ydir
    turtle.goto(x , y)
    if x >= turtle.window_width():
        xdir = -1
    if x <= -turtle.window_width():
        xdir = 1
    if y >= turtle.window_height():
        ydir = -1
    if y <= -turtle.window_height():
        ydir = 1
    turtle.penup()
turtle.mainloop()

4 个答案:

答案 0 :(得分:2)

虽然您解决问题的方法有效(我的返工):

import turtle

turtle.shape("circle")
turtle.penup()

x, y = 0, 0
xdir, ydir = 3, 3
xlimit, ylimit = turtle.window_width() / 2, turtle.window_height() / 2

while True:
    x = x + xdir
    y = y + ydir

    if not -xlimit < x < xlimit:
        xdir = -xdir
    if not -ylimit < y < ylimit:
        ydir = -ydir

    turtle.goto(x, y)

turtle.mainloop()

从长远来看,这是错误的做法。在这种情况下,由于无限循环while True,永远不会调用mainloop()方法,因此没有其他乌龟事件处理程序处于活动状态。例如,如果我们想要使用exitonclick()而不是mainloop(),那么它就不会起作用。而是考虑:

import turtle

turtle.shape("circle")
turtle.penup()

x, y = 0, 0
xdir, ydir = 3, 3
xlimit, ylimit = turtle.window_width() / 2, turtle.window_height() / 2

def move():
    global x, y, xdir, ydir

    x = x + xdir
    y = y + ydir

    if not -xlimit < x < xlimit:
        xdir = -xdir
    if not -ylimit < y < ylimit:
        ydir = -ydir

    turtle.goto(x, y)

    turtle.ontimer(move, 5)

turtle.ontimer(move, 5)

turtle.exitonclick()

在这里,我们将控制权转回到主循环,并且动作在事件计时器上。其他龟事件可以执行,因此exitonclick()有效。在你自己编程和你的乌龟进入一个角落之前,只需考虑一下前进的事情。

答案 1 :(得分:1)

您需要window_height()/2if x >= turtle.window_width()/2: xdir = -1 if x <= -turtle.window_width()/2: xdir = 1 if y >= turtle.window_height()/2: ydir = -1 if y <= -turtle.window_height()/2: ydir = 1 才能保留在窗口内。

{{1}}

答案 2 :(得分:1)

你应该放 turtle.penup() 在while循环之前,使代码更好,更快一点。这几乎是一个错误!

答案 3 :(得分:0)

你可以反弹你的墙,如果你想从上墙反弹,屏幕宽度为800,长度为600

from turtle import turtle
turtle=Turtle()
    def move(self)://This will move your ball in diagonal direction
        x_dir=self.xcor()+self.x
        y_dir=self.ycor()+self.y
        self.goto(x_dir,y_dir)
    def bounce(self)://This will bounce back
        self.y *=-1
turtle.bounce()

这段代码正在运行,因为我是通过继承来完成的。您需要创建一个类,然后继承所有属性,然后在那里创建两个方法,然后在主类中调用这些函数。