如何让海龟停止离开屏幕

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