0

我使用 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()

代码很容易解释,只要其中一个蘑菇等于开始,就会创建一个新对象,因此意味着一个新蘑菇进来。然而,发生的情况是代码第二次无法正常运行,蘑菇不也不会变得更快产卵更快。此外,当游戏第一次开始时,当第一个蘑菇落到底部的那一刻,它会说一级已通过,此时应该是在两个蘑菇之后。精灵只是一个红色蘑菇,也是一个火柴人,如果你想模拟,可以在 g 图像上找到。

所以我的问题是我如何让对象的 STATS 在另一个蘑菇出现时从它停止的地方继续,并在正确的时间显示消息

4

1 回答 1

0

您的问题出现在所有如下所示的行中:

Mushroom().score_required+=50

这里有许多问题,这些问题加在一起使这没有用处:

  • Mushroom() 创建一个新Mushroom实例(此行完成后该实例消失)。
  • 通过实例分配(包括更新分配)属性总是会创建或更新实例属性,即使存在同名的类属性。
  • += 运算符不会就地改变整数等不可变值(因为那是不可能的);a += b实际上与a = a + b.*相同

因此,当您将它们放在一起时,您所做的是创建一个等于 的新值Mushroom.score_required + 50,然后将该值分配给临时实例的新实例属性(立即消失)。这对类属性或任何其他实例没有影响。

您有一个相关但不同的问题,如下所示:

x_position=random.randrange(640)

除非您希望所有蘑菇都具有相同的x_position,否则这不应该是类属性,而是实例属性,您将遇到各种奇怪的问题。

将游戏统计数据存储为随机类的类属性是一件奇怪的事情。有一些方法可以使这项工作发挥作用,但没有充分的理由去尝试。类属性对于类的所有实例可能共享的常量很有用,但它们不能用作全局变量的替代品。

更好的设计应该是这样的:

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), whilea += b等价于如果这样的方法存在,只有在不存在时才a = a.__iadd__(b)回退。__add__对于像列表这样的可变对象,这有很大的不同,因为__iadd__可以self就地更改然后返回它,这意味着您最终将相同的对象分配回a已经存在的对象。但是对于不可变的对象,没有区别。

于 2013-08-24T00:10:40.380 回答