我隐藏了所有应该隐藏的乌龟。我想知道为什么屏幕中间总是有一个小箭头,我检查了很多次代码,看起来效果很好,但是这个小箭头有点烦人,所以你们知道如何制作它吗消失?非常感谢!!!!
......Python代码
import time
from turtle import Screen
from player import Player
from car_manager import CarManager
from scoreboard import Scoreboard
play = Player()
scoreboard = Scoreboard()
car_manager = CarManager()
screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)
screen.listen()
screen.onkey(play.turtle_move_up, "Up")
game_is_on = True
while game_is_on:
time.sleep(0.1)
screen.update()
car_manager.create_car()
car_manager.car_move()
if play.is_at_cross_line():
scoreboard.score_increase()
car_manager.speed_up()
play.move_to_starting_point()
for car in car_manager.car_list:
if car.distance(play) < 20:
scoreboard.game_over()
game_is_on = False
screen.exitonclick()
# classes
from turtle import Turtle
FONT = ("Courier", 24, "normal")
class Scoreboard(Turtle):
def __init__(self):
super().__init__()
self.hideturtle()
self.penup()
self.level = 1
self.score_update()
def score_update(self):
self.clear()
self.goto(-260, 260)
self.write(f"Level:{self.level}", align="left", font=FONT)
def score_increase(self):
self.level += 1
self.score_update()
def game_over(self):
self.goto(0, 0)
self.write("Game Over", align='center', font=FONT)
from turtle import Turtle
STARTING_POSITION = (0, -280)
MOVE_DISTANCE = 10
FINISH_LINE_Y = 280
class Player(Turtle):
def __init__(self):
super().__init__()
self.penup()
self.speed = MOVE_DISTANCE
self.shape("turtle")
self.move_to_starting_point()
def move_to_starting_point(self):
self.goto(0, -280)
self.setheading(90)
def turtle_move_up(self):
self.forward(MOVE_DISTANCE)
def is_at_cross_line(self):
if self.ycor() > 280:
return True
else:
return False
from turtle import Turtle
import random
COLORS = ["red", "orange", "yellow", "green", "blue", "purple"]
STARTING_MOVE_DISTANCE = 5
MOVE_INCREMENT = 10
class CarManager(Turtle):
def __init__(self):
super().__init__()
self.car_list = []
self.speed = STARTING_MOVE_DISTANCE
def create_car(self):
random_chance = random.randint(1,6)
if random_chance == 1:
new_car = Turtle("square")
new_car.penup()
new_car.shapesize(stretch_wid=1, stretch_len=2)
new_car.color(random.choice(COLORS))
new_car.goto(300, random.randint(-230, 230))
self.car_list.append(new_car)
def car_move(self):
for car in self.car_list:
car.backward(self.speed)
def speed_up(self):
self.speed += MOVE_INCREMENT
这里发生了很多事情。调试中一个非常重要的概念是最小化问题。这里的代码太多,无法真正理解这个问题。解决此问题的一种方法是删除代码片段,直到问题消失(逐项或以“分而治之”的方式),然后重新添加最后一位作为隔离问题的方法。 另一种方法是从头开始,添加代码直到问题出现。
按照代码删除方法,我能够最小化该示例。问题仍然存在,但噪音和干扰少了很多,让我更容易了解情况。将来,我建议在发布之前执行此操作,注意不要删除太多可能相关的上下文。
from turtle import Screen, Turtle
class CarManager(Turtle):
def __init__(self):
super().__init__()
def create_car(self):
new_car = Turtle("square")
new_car.penup()
new_car.shapesize(stretch_wid=1, stretch_len=2)
new_car.goto(100, 100)
screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)
cm = CarManager()
cm.create_car()
screen.update()
screen.exitonclick()
这是最小的,因为删除
CarManager
会使问题消失。
CarManager
是一个Turtle
(继承),但它也生产汽车龟(“has-a”,组合)。在这种情况下,CarManager
成为一只海龟是没有意义的:它只是一个具有生成海龟方法的容器类,但self
永远不会用作海龟来移动或绘制其他东西,就像其他乌龟一样类。子类化 Turtle
会创建一只乌龟(即您在屏幕中央看到的乌龟),但如果您不将其用于任何用途,它将位于屏幕中央。最简单的解决方法是:
class CarManager: # remove subclass
def __init__(self):
... # remove super()
# rest is the same
但根本问题是子类化海龟是一种反模式
。通过将您的库混合到海龟中,由于您将继承 120 多个方法,可能会发生很大的混乱,self.some_method()
调用是否引用您的方法或海龟方法之间的混淆,管理自动实例化海龟的困难(就像这里的情况一样),并且当错误发生时,涉及 Deep Turtle 或 tkinter 内部结构的令人困惑的错误消息。
例如:
class Scoreboard: # no inheritance!
def __init__(self):
self.t = t = Turtle() # Scoreboard "has-a" turtle
t.hideturtle()
t.penup()
t.score_update()
self.level = 1
def score_update(self):
self.t.clear()
self.t.goto(-260, 260)
self.t.write(f"Level:{self.level}", align="left", font=FONT)
请注意,
self.level
不在乌龟身上。您的原始代码实际上侵入了turtle模块,并向其添加了属性。鉴于海龟有数百个属性,因此很容易覆盖某些内容,并在海龟报告无法调用其自己的方法时陷入非常混乱的情况!
相关: