class Planet:
def __init__(self, name, radius, colour, speed, distance, mass, angle, orbitcentrex,
orbitcentrey):
self.x = None
self.y = None
self._name = name
self._radius = radius
self._colour = colour
self._speed = speed
self._distance = distance
self._angle = angle
self._centreX = orbitcentrex
self._centreY = orbitcentrey
def updateSpeed(*planets):
planets._speed = (0.2*(planets._speed))
Sun = Planet("Sun", 50, SunColour, 0, 0, 0, 0, size[0] / 2, size[1] / 2)
Mercury = Planet("Mercury", 4, MercuryColour, 0.00477, 70, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Venus = Planet("Sun", 5.5, VenusColour, 0.00354, 125, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Earth = Planet("Earth", 6, EarthColour, 0.003, 180, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Mars = Planet("Mars", 4, MarsColour, 0.002424, 235, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Jupiter = Planet("Jupiter", 17, JupiterColour, 0.001317, 290, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Saturn = Planet("Saturn", 12, SaturnColour, 0.000975, 345, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Uranus = Planet("Uranus", 10, UranusColour, 0.000684, 400, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Neptune = Planet("Neptune", 10, NeptuneColour, 0.000546, 455, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
Pluto = Planet("Pluto", 4, PlutoColour, 0.000471, 510, 0, random.uniform(0, 6.2832), size[0] / 2, size[1] / 2)
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN and 30 < Mouse[0] < 195 and 155 < Mouse[1] < 220:
Planet.updateSpeed(Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto)
我正在嘗試使用 *args 在運行 updateSpeed 方法時將所有行星作為引數傳遞。但是它不能這樣做,因為 *args 創建了一個行星名稱的元組。有什么辦法可以解決這個問題,這樣我就不必撰寫單獨的行來改變每個行星的速度。我之前的情況是這樣的:
if event.type == pygame.MOUSEBUTTONDOWN and 30 < Mouse[0] < 195 and 250 < Mouse[1] < 315:
click.play()
Mercury._speed = 0.002862
Venus._speed = 0.002124
Earth._speed = 0.0018
Mars._speed = 0.0014544
Jupiter._speed = 0.0007902
Saturn._speed = 0.0005850
Uranus._speed = 0.0004104
Neptune._speed = 0.0003276
Pluto._speed = 0.0002826
我想要的是這樣的:
if event.type == pygame.MOUSEBUTTONDOWN and 30 < Mouse[0] < 195 and 155 < Mouse[1] < 220:
Planet.updateSpeed(Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto)
uj5u.com熱心網友回復:
您可以列出要應用該方法的物件,并在 for 回圈中應用所述方法
class Planet:
def __init__(self,...):
... #same as yours
def updateSpeed(self):
self._speed *= 0.2
...
Planets = [Mercury, Venus,...]
for p in Planets:
p.updateSpeed()
uj5u.com熱心網友回復:
使用for回圈遍歷每個行星并更新其速度。
def updateSpeed(*planets):
for planet in planets:
planet._speed = (0.2 * (planet._speed))
uj5u.com熱心網友回復:
您可以使用串列理解或映射來更改多個類。
class Foo:
def __init__(self, integer):
self.integer = integer
def add_one(self):
self.integer = 1
return self
def __str__(self):
return self.integer
Foo1 = Foo(1)
Foo2 = Foo(2)
Foos = [Foo1, Foo2]
print(f"Original Foos: {[i.__str__() for i in Foos]}")
# Loop over Foos and apply add_one to each element.
Foos = [i.add_one() for i in Foos]
print(f"Changed Foos: {[i.__str__() for i in Foos]}")
Foo1 = Foo(1)
Foo2 = Foo(2)
Foos = [Foo1, Foo2]
print(f"Original Foos: {[i.__str__() for i in Foos]}")
# Apply add_one to each element of Foos using a lambda function and using mapping.
Foos = list(map(lambda x: x.add_one(), Foos))
print(f"Changed Foos: {[i.__str__() for i in Foos]}")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/389195.html
