【问题标题】:How to make turtle stop from going off screen如何让乌龟停止离开屏幕
【发布时间】:2021-11-15 14:51:19
【问题描述】:

我正在尝试制作一个简单的游戏,现在我正在尝试防止乌龟离开屏幕。我在课堂上添加了一个函数来阻止它,但它不起作用。我不知道为什么。另外,当我尝试打印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)

【问题讨论】:

  • turtle 非常适合绘制图形,但对于游戏来说则是更好的模块 - 例如 pygame pgzero (pygame zero)、Arcade
  • aalways 将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 我看不出哪个函数应该停止它。而且我看不到你在哪里打印turtle.xcor() - 也许你忘记了(),它显示了函数的位置
  • 对于我在move 中你应该检查forward 之后的位置,如果它在屏幕外然后运行backward 并停止或改变方向left/right
  • 对我来说,你应该在 move 之后运行 wall_checker forward

标签: python turtle-graphics


【解决方案1】:

你应该在 move() 之后运行 wall_check() forward()

    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) 在屏幕上停止自动更新海龟,然后在所有移动之后使用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
但对于游戏来说,有更好的模块 - 即。 pygamepygame zeroarcade

【讨论】:

    【解决方案2】:

    您应该从设置屏幕边界开始,然后制定一个类似的 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#
    

    【讨论】:

      【解决方案3】:

      我做了一个简单的代码试试这个。

      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
        
      
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      相关资源
      最近更新 更多