如何解决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
相关产品推荐
相关产品推荐

