You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Python turtle超出屏幕及xcor()返回内存地址问题

边界检测失效修复

你当前的wall_checker()方法仅在类初始化时执行了一次,turtle持续移动的过程中没有反复调用检测逻辑,自然无法触发边界限制。
修复方案:将wall_checker()的调用嵌入move()方法中,每次移动后立刻执行边界检测,修改后的move()方法如下:

def move(self):
    self.forward(self.speed)
    self.wall_checker() # 新增每次移动后检测边界
    screen.ontimer(self.move, 10) # 建议加上定时器间隔,避免运行速度不可控

打印xcor得到内存地址修复

这个问题是调用方法时遗漏了括号导致的:

  • 如果你写的是print(player.xcor),拿到的是xcor方法对象本身的内存地址
  • 改为print(player.xcor()),加括号执行方法后就能拿到返回的x坐标数值

代码其他隐性问题修复

你现有代码中__init__方法里的self.color(color)一行,color变量没有预先定义,运行会直接报错,可以改为传参或者固定颜色值,比如self.color("green")。另外不建议用speed作为自定义属性名,和turtle自带的speed()方法重名可能引发未知冲突。


修正后完整可运行参考代码

from turtle import Turtle, Screen

screen = Screen()
screen.setup(width=1600, height=1600) # 对应你设置的±800边界

class Player(Turtle):
    def __init__(self, speed=1):
        Turtle.__init__(self, shape='turtle')
        self.speed_val = speed # 避免和原生方法重名
        self.color("green") # 修复未定义的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_val)
        self.wall_checker()
        screen.ontimer(self.move, 10)

    def turn_left(self):
        self.left(10)

    def turn_right(self):
        self.right(10)

    def accelerate(self):
        self.speed_val += 1

    def deaccelerate(self):
        self.speed_val -= 1
        if self.speed_val < 1:
            self.speed_val = 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)

player = Player()
# 绑定键盘控制示例
screen.listen()
screen.onkeypress(player.turn_left, "Left")
screen.onkeypress(player.turn_right, "Right")
screen.onkeypress(player.accelerate, "Up")
screen.onkeypress(player.deaccelerate, "Down")

screen.mainloop()

内容的提问来源于stack exchange,提问作者user15214975

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:36:05