我是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()
答案 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()/2
和if 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()
这段代码正在运行,因为我是通过继承来完成的。您需要创建一个类,然后继承所有属性,然后在那里创建两个方法,然后在主类中调用这些函数。