[英]How can I prevent my python game from reiterating and instead carry on?
我使用pygame和livewires制作了一个简单的游戏,其中精灵必须避免掉下蘑菇。 在特定时间掉落的蘑菇数量意味着随着分数的增加而增加。 这是我的意思:
from livewires import games,color
import random
games.init(screen_width=633,screen_height=479,fps=50)
class Stick_Man(games.Sprite):
def update(self):
self.x=games.mouse.x
if self.left<0:
self.left=0
if self.right>games.screen.width:
self.right=games.screen.width
self.check_collision()
def check_collision(self):
if self.overlapping_sprites:
self.over_message()
def over_message(self):
b=games.Message(value="Game Over", size=100, color=color.red,x=games.screen.width/2,y=games.screen.height/2,lifetime=250,after_death=games.screen.quit)
games.screen.add(b)
class Mushroom(games.Sprite):
score=0
start=200
score_required=100
level=1
total_score=0
speed=1
mushroom=games.load_image("mushroom.jpg")
x_position=random.randrange(640)
@staticmethod
def next_level():
indicate='Level ', + Mushroom.level, ' cleared'
message=games.Message(value=indicate,size=50,color=color.red,x=games.screen.width/2,y=games.screen.height/2, lifetime=150)
games.screen.add(message)
Mushroom().score_required+=50
Mushroom().score-=Mushroom.score_required
Mushroom().start-=150
Mushroom().speed+=5
Mushroom().level+=1
if Mushroom().start==20:
Mushroom().start+=10
def __init__(self):
super(Mushroom,self).__init__(image=Mushroom.mushroom,x=games.mouse.x,y=0)
def update(self):
self.dy=Mushroom.speed
self.check()
self.check2()
def check(self):
if self.bottom==games.screen.height:
self.destroy()
Mushroom.score+=50
Mushroom.total_score+=Mushroom.score
if Mushroom().score==Mushroom.score_required:
self.next_level()
def check2(self):
if self.top==Mushroom.start:
self.duplicate()
def duplicate(self):
new_mush=Mushroom()
games.screen.add(new_mush)
background_image=games.load_image("background.jpg", transparent=False)
games.screen.background=background_image
stickman_image=games.load_image("stickman.png", transparent=True)
stickman=Stick_Man(image=stickman_image,left=1,bottom=480)
games.screen.add(stickman)
games.mouse.is_visible=False
b=Mushroom()
c=Mushroom()
a=Mushroom()
games.screen.add(b)
games.screen.add(a)
games.screen.add(c)
games.screen.event_brab=True
games.screen.mainloop()
该代码是很容易解释的,每当一个蘑菇等于开始时,就会创建一个新对象,从而意味着一个新的蘑菇进入。但是,发生的情况是该代码第二次无法正常运行,而蘑菇却无法正常工作。也不会更快地产生。 同样,当游戏第一次开始时,第一个蘑菇到达底部的那一刻,它说级别1已清除,应该在两个蘑菇之后。 精灵只是一个红色的蘑菇,也是一个火柴人,如果要模拟,可以在g图像上找到它。
所以我的问题是,如何使对象的STATS在出现另一个蘑菇时从中断的地方继续进行,并在正确的时间显示消息
您的问题出在所有看起来像这样的行中:
Mushroom().score_required+=50
这里有很多问题,所有这些问题加起来使它没有任何用处:
Mushroom
实例(此行完成后即消失)。 a += b
实际上与a = a + b
。* 因此,当您将它们放在一起时,您正在做的是创建一个等于Mushroom.score_required + 50
的新值,然后将该值分配给临时实例的新实例属性(该实例立即消失)。 这对class属性或任何其他实例没有影响。
您在类似的行中有一个相关但不同的问题:
x_position=random.randrange(640)
除非您希望所有蘑菇都具有相同的x_position
, x_position
这不应是class属性,而应是instance属性,否则您将遇到各种奇怪的问题。
将游戏统计信息存储为随机类的类属性是一件奇怪的事情。 您可以通过多种方法进行这项工作,但没有充分的理由尝试。 类属性对于类的所有实例都可能共享的常量很有用,但它们不能代替全局变量。
更好的设计应该是这样的:
class Game(object):
def __init__(self):
self.score = 0
self.start = 200
self.score_required = 100
self.level = 1
self.total_score = 0
def next_level(self):
indicate = 'Level ', + Mushroom.level, ' cleared'
message = games.Message(value=indicate, size=50, color=color.red,
x=games.screen.width/2, y=games.screen.height/2,
lifetime=150)
games.screen.add(message)
self.score_required += 50
self.score -= self.score_required
self.start -= 150
self.speed += 5
self.level += 1
if self.start == 20:
self.start += 10
def update_score(self, n):
game.score += n
game.total_score += game.score
if self.score == self.score_required:
self.next_level()
class Mushroom(games.Sprite):
mushroom=games.load_image("mushroom.jpg")
def __init__(self, game):
self.x_position=random.randrange(640)
self.game = game
super(Mushroom,self).__init__(image=Mushroom.mushroom,x=games.mouse.x,y=0)
def update(self):
self.dy=Mushroom.speed
self.check()
self.check2()
def check(self):
if self.bottom == games.screen.height:
self.destroy()
game.update_score(50)
def check2(self):
if self.top == Mushroom.start:
self.duplicate()
def duplicate(self):
games.screen.add(Mushroom(self.game))
game = Game()
games.screen.add(Mushroom(game))
games.screen.add(Mushroom(game))
games.screen.add(Mushroom(game))
games.screen.event_brab=True
*这不是完全正确的。 实际上, a = a + b
等效于a = a.__add__(b)
,而a += b
等效于a = a.__iadd__(b)
如果存在),仅当不存在时才回落到__add__
没错 对于像列表可变对象,这使得一个很大的区别,因为__iadd__
可以改变self
就地,然后返回它,这意味着你最终分配相同的对象回到a
是已经在那里了。 但是对于不可变的对象,没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.