如何乘以 python 流星对象

How multiply python meteors objects

好的,所以我正在尝试制作一款流星游戏,您必须在其中躲避流星。但我不只想要 1 颗流星,我想要多颗。那么如何将我的第一颗流星复制到更多呢?

我试过用一个函数来做更多。但它给了我一个错误。我试过使用 while 循环,所以它运行流星代码 10 次,但没有用

    import turtle
    import random
    # meteorgame by Daniel99oslo

    wn = turtle.Screen()
    wn.title("Meteor")
    wn.bgcolor("black")
    wn.setup(width=500, height=600)
    wn.tracer(0)

    #Player    
    Player = turtle.Turtle()
    Player.speed(0)
    Player.shape("square")
    Player.color("Blue")
    Player.shapesize(stretch_wid=1, stretch_len=1)
    Player.penup()
    Player.goto(0, -100)

    #Meteor    
    Meteor = turtle.Turtle()
    Meteor.speed(0)
    Meteor.shape("square")
    Meteor.color("red")
    Meteor.shapesize(stretch_wid=1, stretch_len=1)
    Meteor.penup()
    Meteor.goto(0, 290)

    y1 = (random.randint(500,600))
    y2 = Meteor.ycor()
    Meteor.sety(y1)


    # left/right
    def Player_Left():
        x = Player.xcor()
        x -= 5
        Player.setx(x)
    def Player_Right():
        x = Player.xcor()
        x += 5
        Player.setx(x)

    # Keyboard binds a/d
    wn.listen()
    wn.onkeypress(Player_Left, "a")
    wn.onkeypress(Player_Right, "d")

    # Main game loop
    while True:
        wn.update()

        #Meteor respawn/location
        x1 = (random.randint(-230,230))
        y = Meteor.ycor()
        y -= 0.1
        Meteor.sety(y)
        if Meteor.ycor() <-300:
            Meteor.sety(290)


            x = Meteor.xcor()
            Meteor.setx(x1)
        #Meteor hit player detection

        if Player.distance(Meteor) < 25:
            #Code that will kill player add here
            pass

如果你只是循环遍历 meteor 代码你有 10 次你仍然只会得到一个结果,因为每次循环它时变量都会被覆盖。处理此问题的一种简单方法是创建一个列表并将流星存储在其中。

meteors = []
for i in range(10):
     Meteor = turtle.Turtle()
     ...
     meteors.append(Meteor)
#code:
import turtle
import random
import time
# meteorgame by Daniel99oslo

wn = turtle.Screen()
wn.title("Meteor")
wn.bgcolor("black")
wn.setup(width=500, height=600)
wn.tracer(0)




# Pen
score = 0
highscore = 0
pen = turtle.Turtle()
pen.speed(0)
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)









#Player

Player = turtle.Turtle()
Player.speed(0)
Player.shape("square")
Player.color("Blue")
Player.shapesize(stretch_wid=1, stretch_len=1)
Player.penup()
Player.goto(0, -100)



#Number of meteors
number_of_meteors = 10

#Meteor
meteors = []
for i in range(number_of_meteors):
    Meteor = turtle.Turtle()
    Meteor.speed(0)
    Meteor.shape("square")
    Meteor.color("red")
    Meteor.shapesize(stretch_wid=1, stretch_len=1)
    Meteor.penup()
    Meteor.setposition(0, 290)
    meteors.append(Meteor)

    def restart():
        for Meteor in meteors:
            y1 = (random.randint(500,2000))
            y2 = Meteor.ycor()
            Meteor.sety(y1)


# left/right
def Player_Left():
    x = Player.xcor()
    x -= 5
    Player.setx(x)
def Player_Right():
    x = Player.xcor()
    x += 5
    Player.setx(x)



# Keyboard binds a/d
wn.listen()
wn.onkeypress(Player_Left, "a")
wn.onkeypress(Player_Right, "d")



#Timer
Timer = turtle.Turtle()
Timer.speed(0)
Timer.shape("square")
Timer.color("orange")
Timer.shapesize(stretch_wid=1, stretch_len=1)
Timer.penup()
Timer.goto(-240, 290)



restart()


# Main game loop
while True:

        wn.update()


        #scoreadjust
        time = 0.2

        #Timerfaller
        y = Timer.ycor()
        y -= time
        Timer.sety(y)

        if Timer.ycor() <-300:
            Timer.goto(-240, 290)
            pen.clear()
            score += 10
            pen.write("Score: {}  Highscore: {}".format(score, highscore), align="center", font=("Courier", 24, "normal"))


        #Meteor respawn/location


        for Meteor in meteors:
            x1 = (random.randint(-230,230))
            y = Meteor.ycor()
            y -= 0.1
            Meteor.sety(y)
            if Meteor.ycor() <-300:
                Meteor.sety(290)


                x = Meteor.xcor()
                Meteor.setx(x1)
        #Meteor hit player detection

        for Meteor in meteors:
            if Player.distance(Meteor) < 25:
                #Restart
                restart()

                #Score if tests
                if score == highscore:
                    score -= score
                if score > highscore:
                    highscore -= highscore
                if highscore > score:
                    score -= score
                highscore += score
                score -= score

                pen.clear()
                pen.write("Score: {}  Highscore: {}".format(score, highscore), align="center", font=("Courier", 24, "normal"))

                pass

另一种方法是初始化一个流星原型,然后使用它的 .clone() 方法来填充你的流星数组:

from turtle import Screen, Turtle
from random import randint

# ...

# Meteors
prototype_meteor = Turtle()
prototype_meteor.shape('square')
prototype_meteor.speed('fastest')
prototype_meteor.color('red')
prototype_meteor.penup()
prototype_meteor.setposition(randint(-230, 230), randint(250, 300))

meteors = [prototype_meteor]

for i in range(9):
    meteor = prototype_meteor.clone()
    meteor.setposition(randint(-230, 230), randint(250, 300))
    meteors.append(meteor)

完整代码:

from turtle import Screen, Turtle
from random import randint

WIDTH, HEIGHT = 500, 600
FONT_SIZE = 24
FONT = ('Courier', FONT_SIZE, 'normal')
TURTLE_SIZE = 20

# left/right

def player_left():
    x = player.xcor() - 5

    player.setx(x)

def player_right():
    x = player.xcor() + 5

    player.setx(x)

def random_horizontal():
    return randint(TURTLE_SIZE - WIDTH/2, WIDTH/2 - TURTLE_SIZE)

def random_vertical():
    return randint(HEIGHT / 3, HEIGHT/2 - TURTLE_SIZE)

def restart():
    for meteor in meteors:
        meteor.setposition(random_horizontal(), random_vertical())

screen = Screen()
screen.title("Meteor")
screen.bgcolor('black')
screen.setup(width=WIDTH, height=HEIGHT)
screen.tracer(0)

# Pen
score = 0
highscore = 0
pen = Turtle()
pen.hideturtle()
pen.color("white")
pen.penup()
pen.sety(260)
pen.write("Score: {}  Highscore: {}".format(score, highscore), align="center", font=FONT)

# Timer
timer = Turtle()
timer.shape('square')
timer.speed('fastest')
timer.color('orange')
timer.penup()
timer.goto(TURTLE_SIZE/2 - WIDTH/2, HEIGHT/2 - TURTLE_SIZE)

# Player
player = Turtle()
player.shape('square')
player.speed('fastest')
player.color('blue')

player.penup()
player.sety(-HEIGHT / 3)

# Meteors
number_of_meteors = 10

prototype_meteor = Turtle()
prototype_meteor.shape('square')
prototype_meteor.speed('fastest')
prototype_meteor.color('red')
prototype_meteor.penup()

meteors = [prototype_meteor] + [prototype_meteor.clone() for i in range(number_of_meteors - 1)]

restart()

# Keyboard binds a/d
screen.onkeypress(player_left, 'a')
screen.onkeypress(player_right, 'd')
screen.listen()

# Main game loop
while True:

    timer.sety(timer.ycor() - 0.2)

    if timer.ycor() < TURTLE_SIZE - HEIGHT/2:
        timer.goto(TURTLE_SIZE/2 - WIDTH/2, HEIGHT/2 - TURTLE_SIZE)
        score += 10

    for meteor in meteors:
        # Meteor respawn/location

        y = meteor.ycor() - 1

        if y < TURTLE_SIZE - HEIGHT/2:
            meteor.setposition(random_horizontal(), random_vertical())
        else:
            meteor.sety(y)

        # Meteor hit player detection

        if player.distance(meteor) < TURTLE_SIZE:
            score -= 20
            restart()
            break

    if score > highscore:
        highscore = score

    pen.clear()
    pen.write("Score: {}  Highscore: {}".format(score, highscore), align="center", font=FONT)

    screen.update()