用Python构造此状态机的最佳方法是什么?

时间:2020-01-31 03:54:37

标签: python loops state-machine

我对python还是很陌生,正在尝试着手进行编码。我正在尝试创建一个简单的机器人来玩Facebook游戏,并且在进行了一些研究之后,我相信状态机是他们正确的选择。这是我正在尝试做的概述,但是我确信这不是编写代码的正确方法。一旦程序变得更加复杂,该代码就会变得很复杂。有人可以帮助我将其转换为更强大的状态机代码吗?另外,是否有一种方法可以在用户按下按键时在状态之间进行检查,以便我可以暂停机器?谢谢。

state = 1

def runStateMachine():
    global state
    if state == 1:
        doSomething()
        state = 2
    elif state == 2:
        if checkSomething():
            state = 3
        else:
            state = 1
    elif state == 3:
        finishSomething()
        state = 1

while True:
    runStateMachine()
    sleep(5)
    #check if a key has been pressed and pause here until the key is pressed again

3 个答案:

答案 0 :(得分:1)

状态机的想法不是一个坏主意,这取决于您要编写机器人的游戏类型。您的观察表明,代码将变得比您希望的要复杂得多,这是一个很好的时机,这是您退后一步并考虑您的选择的好时机。

从您的代码和问题开始,您似乎对编程尚不陌生,因此您可能需要研究一些基础知识来确定它们是否对您有所帮助。

例如,如果您需要多个状态机,或者想要由多个较小的状态机组成状态机,则可能要考虑将状态机编写为一个类,然后可以重用。如果您想为不同的游戏编写不同的游戏,或者为玩同一游戏的不同策略编写同样的游戏。

您正在询问键盘输入,这是您可以单独解决的问题,但是只有一个主循环,逐步进入被按键中断的步骤可能不是您开始添加内容时的最佳方法。考虑什么类型的输入和状态更改会影响程序的工作,并在过于担心如何将所有内容组合在一起之前,着重于正确使用重要部分。

回答您的问题:有更好的方法来编写代码,并且由于有限状态机是一种非常普遍的计算机科学概念,因此那里有许多库,其中一个库很可能满足您的需求并为您节省了很多时间时间。例如,查看https://github.com/pytransitions/transitions

关于检查按键:您可以简单地用input()强制用户输入内容,但是如果要查看是否碰巧按下了按键,则应检出{{1 }},特别是keyboard https://github.com/boppreh/keyboard#keyboard.is_pressed

请注意,我不建议使用这些库,我只想指出,对于常见问题,库通常是最好的选择。只需看看已经完成的大量工作,以及作者完成工作所需的时间。

并不是每个库都是完美的,有些程序员不喜欢包含不需要的代码的想法,但是如果您想从事某些工作而又不用花几天的时间来重新设计轮子,那么这绝对是一条路。一旦有了可用的东西,您总是可以考虑用更简洁的东西替换库,如果您确信自己可以做得更好-也许您想自己将其作为库发布!

答案 1 :(得分:0)

我也是初学者,但是您的代码对我来说很好。

您可以做的一件改进代码的事情是将state = X变成:

Public Class rptContribution

Private Sub rptContribution_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    Me.tbl_ContributionTableAdapter.Fill(Me.DS_Contrib.tbl_Contribution)

    Me.ReportViewer1.RefreshReport()
End Sub

答案 2 :(得分:0)

您的代码按原样在您有几种状态的情况下也能很好地工作。随着州数量的增加,它将变得更加难以管理。我对如何抢先准备代码有一些建议。

  • 鉴于您现在的编码方式(在if / elif块中使用整数),最好使用switch / case语句,而不要使用较大的if / elif语句块。

  • 理想地,而不是看似随意更改state的值,而是创建一个函数来标识在每个循环开始时运行的当前状态。

同时执行这两个步骤,将使您可以随着状态总数的增加而更轻松地添加更多状态,同时还可以使您大致了解程序的实际运行方式。 (即,处于状态x的实际含义,以及如果处于状态x的状态机在下一状态机中会发生什么)

相关问题