为什么屏幕中间有一个小箭头?

问题描述 投票:0回答:1

我隐藏了所有应该隐藏的乌龟。我想知道为什么屏幕中间总是有一个小箭头,我检查了很多次代码,看起来效果很好,但是这个小箭头有点烦人,所以你们知道如何制作它吗消失?非常感谢!!!!

......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

python turtle-graphics python-turtle
1个回答
0
投票

这里发生了很多事情。调试中一个非常重要的概念是最小化问题。这里的代码太多,无法真正理解这个问题。解决此问题的一种方法是删除代码片段,直到问题消失(逐项或以“分而治之”的方式),然后重新添加最后一位作为隔离问题的方法。 另一种方法是从头开始,添加代码直到问题出现。

按照代码删除方法,我能够最小化该示例。问题仍然存在,但噪音和干扰少了很多,让我更容易了解情况。将来,我建议在发布之前执行此操作,注意不要删除太多可能相关的上下文。

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 内部结构的令人困惑的错误消息。

相反,在使用 Turtle 时始终使用组合(“has-a”)。这将减少混乱和枪声。您可以将其视为“记分板有一支可以用来绘图的乌龟笔”,而不是“记分板是一只可以绘图的乌龟”。

例如:

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模块,并向其添加了属性。鉴于海龟有数百个属性,因此很容易覆盖某些内容,并在海龟报告无法调用其自己的方法时陷入非常混乱的情况!

相关:

    为什么会有第二只乌龟?
  • 海龟的第三个克隆
© www.soinside.com 2019 - 2024. All rights reserved.