如何让海龟停止离开屏幕
How to make turtle stop from going off screen
我正在尝试制作一个简单的游戏,现在我正在努力防止乌龟离开屏幕。我在 class 中添加了一个函数来停止它,但它不起作用。我不知道为什么。此外,当我尝试打印 turtle.xcor() 时,我得到它的内存位置而不是它的 xcords,我也如何修复它。非常感谢!代码:
class Player(Turtle):
def __init__(self, speed=1):
Turtle.__init__(self, shape='turtle')
self.speed = speed
self.color(color)
self.hideturtle()
self.turtlesize(2)
self.setheading(90)
self.penup()
self.backward(180)
self.showturtle()
self.move()
self.wall_checker()
def move(self):
self.forward(self.speed)
screen.ontimer(self.move)
def turn_left(self):
self.left(10)
def turn_right(self):
self.right(10)
def accelerate(self):
self.speed += 1
def deaccelerate(self):
self.speed -= 1
if self.speed < 1:
self.speed = 1
def wall_checker(self):
if self.xcor() > 800:
self.goto(790, self.ycor())
elif self.xcor() < -800:
self.goto(-790, self.ycor())
elif self.ycor() > 800:
self.goto(self.xcor(), 790)
elif self.ycor() < -800:
self.goto(self.xcor(), -790)
我做了一个简单的代码试试这个。
import turtle
fred=turtle.Turtle()
#setting variables
run = True
speed = 1
#drawing straight Line
fred.lt(90)
fred.up()
fred.fd(100)
fred.down()
fred.rt(180)
fred.fd(200)
#re-position turtle fred
fred.up()
fred.setpos(-100,0)
fred.lt(90)
while(run):
fred.setpos(fred.xcor() + speed,fred.ycor())
#making turtle to stop after hitting vertical line
if(fred.xcor()>0):
run=False
您应该首先设置屏幕边界,然后制定一个 if 语句,例如:
from turtle import Screen
from turtle import Turtle
screen = Screen()
screen.setup(width=600, height=600)
turtle = Turtle()
if turtle.xcor() == 300 or turtle.xcor() == -300:
turtle.left(180) #to turn back on x-axis#
你应该在 forward()
之后 move()
里面 运行 wall_check()
def move(self):
self.forward(self.speed)
self.wall_checker()
screen.ontimer(self.move)
就这些了。
最少的工作代码。
在我的电脑上,我不得不在 wall_checker
中使用较小的值来检查 xcor()
、ycor()
- 可能我的屏幕较小。
from turtle import Turtle, Screen
class Player(Turtle):
def __init__(self, speed=1, color='red'):
Turtle.__init__(self, shape='turtle')
self.speed = speed
self.color(color)
self.hideturtle()
self.turtlesize(2)
self.setheading(90)
self.penup()
self.backward(180)
self.showturtle()
self.move()
def move(self):
self.forward(self.speed)
self.wall_checker()
screen.ontimer(self.move)
def turn_left(self):
self.left(10)
def turn_right(self):
self.right(10)
def accelerate(self):
self.speed += 1
def deaccelerate(self):
self.speed -= 1
if self.speed < 1:
self.speed = 1
def wall_checker(self):
#print(self.xcor(), self.ycor())
if self.xcor() > 300:
self.goto(290, self.ycor())
elif self.xcor() < -300:
self.goto(-290, self.ycor())
if self.ycor() > 300:
self.goto(self.xcor(), 290)
elif self.ycor() < -300:
self.goto(self.xcor(), -290)
screen = Screen()
player = Player(speed=10)
顺便说一句:
这段代码还有其他问题。它移动并显示在新位置,接下来检查位置,然后返回 - 所以乌龟在闪烁(你在两个地方都看到它)。
在游戏模块中可以先计算新的位置而不在新的地方显示,检查它是否在屏幕外并使用旧值,最后它会只在一个地方显示。
在 turtle
中,您可以使用 screen.tracer(False)
停止屏幕上的自动更新 turtle,然后在所有移动后使用 screen.update()
,但它无法像我预期的那样使用 goto
- 但它可以与 backward()
一起移回旧位置
from turtle import Turtle, Screen
class Player(Turtle):
def __init__(self, speed=1, color='red'):
Turtle.__init__(self, shape='turtle')
self.speed = speed
self.color(color)
self.hideturtle()
self.turtlesize(2)
self.setheading(90)
self.penup()
self.backward(180)
self.showturtle()
self.move()
def move(self):
self.forward(self.speed)
self.wall_checker()
screen.update() # update screen
screen.ontimer(self.move)
def turn_left(self):
self.left(10)
def turn_right(self):
self.right(10)
def accelerate(self):
self.speed += 1
def deaccelerate(self):
self.speed -= 1
if self.speed < 1:
self.speed = 1
def wall_checker(self):
#print(self.xcor(), self.ycor())
while self.xcor() > 300:
self.backward(1)
while self.xcor() < -300:
self.backward(1)
while self.ycor() > 300:
self.backward(1)
while self.ycor() < -300:
self.backward(1)
screen = Screen()
screen.tracer(False) # don't update screen automatically
player = Player(speed=10)
坦率地说,turtle
很适合画人物(参见 gallery)
但对于游戏来说,有更好的模块——即。 pygame, pygame zero, arcade
我正在尝试制作一个简单的游戏,现在我正在努力防止乌龟离开屏幕。我在 class 中添加了一个函数来停止它,但它不起作用。我不知道为什么。此外,当我尝试打印 turtle.xcor() 时,我得到它的内存位置而不是它的 xcords,我也如何修复它。非常感谢!代码:
class Player(Turtle):
def __init__(self, speed=1):
Turtle.__init__(self, shape='turtle')
self.speed = speed
self.color(color)
self.hideturtle()
self.turtlesize(2)
self.setheading(90)
self.penup()
self.backward(180)
self.showturtle()
self.move()
self.wall_checker()
def move(self):
self.forward(self.speed)
screen.ontimer(self.move)
def turn_left(self):
self.left(10)
def turn_right(self):
self.right(10)
def accelerate(self):
self.speed += 1
def deaccelerate(self):
self.speed -= 1
if self.speed < 1:
self.speed = 1
def wall_checker(self):
if self.xcor() > 800:
self.goto(790, self.ycor())
elif self.xcor() < -800:
self.goto(-790, self.ycor())
elif self.ycor() > 800:
self.goto(self.xcor(), 790)
elif self.ycor() < -800:
self.goto(self.xcor(), -790)
我做了一个简单的代码试试这个。
import turtle
fred=turtle.Turtle()
#setting variables
run = True
speed = 1
#drawing straight Line
fred.lt(90)
fred.up()
fred.fd(100)
fred.down()
fred.rt(180)
fred.fd(200)
#re-position turtle fred
fred.up()
fred.setpos(-100,0)
fred.lt(90)
while(run):
fred.setpos(fred.xcor() + speed,fred.ycor())
#making turtle to stop after hitting vertical line
if(fred.xcor()>0):
run=False
您应该首先设置屏幕边界,然后制定一个 if 语句,例如:
from turtle import Screen
from turtle import Turtle
screen = Screen()
screen.setup(width=600, height=600)
turtle = Turtle()
if turtle.xcor() == 300 or turtle.xcor() == -300:
turtle.left(180) #to turn back on x-axis#
你应该在 forward()
move()
里面 运行 wall_check()
def move(self):
self.forward(self.speed)
self.wall_checker()
screen.ontimer(self.move)
就这些了。
最少的工作代码。
在我的电脑上,我不得不在 wall_checker
中使用较小的值来检查 xcor()
、ycor()
- 可能我的屏幕较小。
from turtle import Turtle, Screen
class Player(Turtle):
def __init__(self, speed=1, color='red'):
Turtle.__init__(self, shape='turtle')
self.speed = speed
self.color(color)
self.hideturtle()
self.turtlesize(2)
self.setheading(90)
self.penup()
self.backward(180)
self.showturtle()
self.move()
def move(self):
self.forward(self.speed)
self.wall_checker()
screen.ontimer(self.move)
def turn_left(self):
self.left(10)
def turn_right(self):
self.right(10)
def accelerate(self):
self.speed += 1
def deaccelerate(self):
self.speed -= 1
if self.speed < 1:
self.speed = 1
def wall_checker(self):
#print(self.xcor(), self.ycor())
if self.xcor() > 300:
self.goto(290, self.ycor())
elif self.xcor() < -300:
self.goto(-290, self.ycor())
if self.ycor() > 300:
self.goto(self.xcor(), 290)
elif self.ycor() < -300:
self.goto(self.xcor(), -290)
screen = Screen()
player = Player(speed=10)
顺便说一句:
这段代码还有其他问题。它移动并显示在新位置,接下来检查位置,然后返回 - 所以乌龟在闪烁(你在两个地方都看到它)。
在游戏模块中可以先计算新的位置而不在新的地方显示,检查它是否在屏幕外并使用旧值,最后它会只在一个地方显示。
在 turtle
中,您可以使用 screen.tracer(False)
停止屏幕上的自动更新 turtle,然后在所有移动后使用 screen.update()
,但它无法像我预期的那样使用 goto
- 但它可以与 backward()
一起移回旧位置
from turtle import Turtle, Screen
class Player(Turtle):
def __init__(self, speed=1, color='red'):
Turtle.__init__(self, shape='turtle')
self.speed = speed
self.color(color)
self.hideturtle()
self.turtlesize(2)
self.setheading(90)
self.penup()
self.backward(180)
self.showturtle()
self.move()
def move(self):
self.forward(self.speed)
self.wall_checker()
screen.update() # update screen
screen.ontimer(self.move)
def turn_left(self):
self.left(10)
def turn_right(self):
self.right(10)
def accelerate(self):
self.speed += 1
def deaccelerate(self):
self.speed -= 1
if self.speed < 1:
self.speed = 1
def wall_checker(self):
#print(self.xcor(), self.ycor())
while self.xcor() > 300:
self.backward(1)
while self.xcor() < -300:
self.backward(1)
while self.ycor() > 300:
self.backward(1)
while self.ycor() < -300:
self.backward(1)
screen = Screen()
screen.tracer(False) # don't update screen automatically
player = Player(speed=10)
坦率地说,turtle
很适合画人物(参见 gallery)
但对于游戏来说,有更好的模块——即。 pygame, pygame zero, arcade