如何乘以 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()
好的,所以我正在尝试制作一款流星游戏,您必须在其中躲避流星。但我不只想要 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()