在python中创建状态机

时间:2017-02-27 10:11:17

标签: python state-machine

之前我在python中创建了各种简单的二维游戏,因为它们很简单,我不需要创建这样的东西。但我现在需要它,因为需要回到第四位。 为了向前发展,我需要某种方向......

我大约有200行进入一个新游戏,我还没有开始实际游戏,它目前所有处理窗口,事件和状态

### state machine

def run:
  #~setup window

  # Current state
  state = menu()

  running = True
  while running:
    #~event handler

    returns = state.update(events)
    if returns == "playgame":
      state = game()
    state.draw(window)
#menu state
class menu:
  def __init__(self):
    #~define vars for the menu (buttons, etc...)
    self.clickables = [] # filled with gui etc..
    self.image = image() # image of the menu

  def update(self, events):
    for event in events: # go through events
      for clickable in self.clickables: # go through clickables
        if clickable.testClicked(event.pos) != False: # Returns if clicked
          return clickable.testClicked(event.pos)

  def draw(self, window):
    self.image.draw(window)
#game state
class game(menu): # Exactly the same as menu (just used as example)
  def __init__(self):
    super(menu).__init__()
#gui button
class button: # Extremely shortened for example use
  def __init__(self, do): # do is a string 
    self.whenClickedDo = do

  def testClicked(self, mousePos):
    if mousePos in self.myRect: # myRect is the area of the button (Example!)
      return self.whenClickedDo
    return False

上面这个例子是完全匆忙的,但我思考的问题是......有什么更好的方法来实现这一目标,或者上述是一种可实现的/聪明的做事方式?

TLDR;函数“run”具有值“state”,其可以返回将用于将其自身改变为不同状态的值。这是制作状态机的合理方法吗?

1 个答案:

答案 0 :(得分:0)

我用C ++编写了一个简单的游戏引擎,并使用了基于屏幕的系统。我现在试着在python中编写一个简单的版本。这个想法是游戏的每个部分都是不同的屏幕。所以主菜单是一个屏幕,有一个游戏界面(所有动作发生的地方),可能有一个选项屏幕供用户更改设置等等。这些都是由屏幕列表管理,每个屏幕在列表中有一个位置,您可以根据游戏事件在屏幕之间切换。因此,如果主菜单屏幕处于活动状态,当用户点击“播放”按钮时,游戏播放屏幕现在已加载。

我无法想到我的头脑究竟是如何将它移植到python中的,但这应该会让你至少从某个地方开始。

所以屏幕会是这样的类:

class Screen:

    # you can have objects in the screen as variables of the class here
    # e.g self.player = None

    def onEntry(self):
        # here you would init the assets for your screen
        # this could be the interface, sprites etc
        # e.g self.player = Player()

    def onExit(self):
        # do any clean up
        # maybe save player data if this is a gameplay screen
        # e.g self.player.save()

    def update(self):
        # main loop for this screen
        # e.g self.player.update()

您游戏的每个特定屏幕都将继承自Screen类,并使用该屏幕的自定义逻辑实现这些功能。然后屏幕列表基本上只是这些自定义Screen类的列表。你的游戏只会在这些屏幕之间翻转。