【问题标题】:Cannot move 2 turtles at same time in Python不能在 Python 中同时移动 2 只海龟
【发布时间】:2020-07-05 10:49:19
【问题描述】:

我是 Python 新手。我正在尝试创建一个太空游戏,其中两艘太空船互相争斗。用户控制一个,另一个将随机飞行和射击。用户必须保护自己并在另一艘船上开火。如果任何一艘船都能成功击中另一艘船 10 次,则那艘船获胜。

问题:我无法同时看到两艘船。当我控制一只乌龟时,另一只乌龟不显示。请帮忙。

from turtle import * 
import random
import pygame

class Application:
    space_ship = Turtle()
    window = Screen()
    window_X = 640
    window_Y = 640
    ship_x = space_ship.xcor()
    Clock = pygame.time.Clock()



    def __init__(self):
        self.game_config()
        self.enemy_config()


        
    def enemy_config(self):    
        enemy = Turtle()
        enemy.penup()
        enemy.speed(0)
        enemy.shapesize(2)
        enemy.setposition(0,-250)
        while True:
            self.Clock.tick(20)
            enemy.fd(10)

            if enemy.ycor() >= 340:
                enemy.right(50)
                enemy.sety(-320)
                
            elif enemy.ycor() <= -340:
                enemy.right(50)
                enemy.sety(320)


            elif enemy.xcor() >= 340:
                enemy.right(50)
                enemy.setx(-320)


            elif enemy.xcor() <= -340:
                enemy.right(50)
                enemy.setx(320)
            

    def movefd(self):       
        while True:
            self.Clock.tick(20)
            self.space_ship.fd(10)

            if self.space_ship.ycor() >= 340:
                self.space_ship.sety(-320)
            
            elif self.space_ship.ycor() <= -340:
                self.space_ship.sety(320)

            elif self.space_ship.xcor() >= 340:
                self.space_ship.setx(-320)

            elif self.space_ship.xcor() <= -340:
                self.space_ship.setx(320)

            

    def moverg(self):
        self.space_ship.right(15)

    def movelf(self):
        self.space_ship.left(15)


    def game_config (self):
        bgcolor("white")
        self.space_ship.shapesize(2)
        self.space_ship.speed(0)
        self.space_ship.color("green")
        self.window.setup(self.window_X,self.window_Y)
        self.space_ship.left(90)
        self.space_ship.penup()
        onkeypress(self.moverg, "Right")
        onkeypress(self.movelf, "Left")
        onkeypress(self.movefd, "Up")
        listen()
        done()
if __name__ == '__main__':
    Application()

【问题讨论】:

    标签: python python-turtle


    【解决方案1】:

    问题:无法同时看到两艘船。当使用控制一只乌龟时 然后另一只乌龟没有出现。

    对我来说,更大的问题是你完全忽略了面向对象编程的重点。让我们通过对您的代码进行彻底的返工来解决我们的两个问题。但在我们这样做之前,请一遍又一遍地重复,“while True: 在海龟这样的事件驱动世界中没有任何业务。”

    from turtle import Screen, Turtle
    
    class SpaceShip(Turtle):
        def __init__(self):
            super().__init__()
    
            self.shapesize(2)
            self.color("green")
            self.speed('fastest')
            self.penup()
            self.setheading(90)
    
        def movefd(self):
            self.forward(10)
    
            if self.ycor() >= 340:
                self.sety(-320)
            elif self.ycor() <= -340:
                self.sety(320)
    
            if self.xcor() >= 340:
                self.setx(-320)
            elif self.xcor() <= -340:
                self.setx(320)
    
        def moverg(self):
            self.right(15)
    
        def movelf(self):
            self.left(15)
    
    class EnemyShip(SpaceShip):
        def __init__(self):
            super().__init__()
    
            self.hideturtle()
            self.color("black")
            self.setheading(-50)
            self.sety(-250)
            self.showturtle()
    
    class Application:
        SCREEN_X = 640
        SCREEN_Y = 640
    
        def __init__(self):
            self.screen = Screen()
            self.screen.setup(self.SCREEN_X, self.SCREEN_Y)
    
            self.space_ship = SpaceShip()
            self.enemy = EnemyShip()
    
            self.screen.onkeypress(self.space_ship.moverg, "Right")
            self.screen.onkeypress(self.space_ship.movelf, "Left")
            self.screen.onkeypress(self.space_ship.movefd, "Up")
            self.screen.listen()
    
            self.movefd()
    
            self.screen.mainloop()
    
        def movefd(self):
            self.enemy.movefd()
            self.screen.ontimer(self.movefd, 100)
    
    if __name__ == '__main__':
        Application()
    

    【讨论】:

    • 非常感谢您的帮助。有时我觉得一切都很清楚,但是当我开始编写代码时,我的代码并没有像我想象的那样工作。我使用了 while 循环,因为首先我想手动向前移动船,但后来我意识到,如果船连续向前移动,则更退出,并且用户可以左右旋转并开火。这就是为什么我认为while循环是最好的选择。我仍在阅读您的代码以了解整个事情。有些点仍然让我感到困惑:ontimer、self、super、继承的类和方法。但我正在尝试从 youtube 视频剪辑中获得帮助。