在 Python 中构建此状态机的最佳方式是什么?
What is the best way to structure this state machine in Python?
我是 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
我也是初学者,但你的代码对我来说还不错。
为了改进代码,您可以做的一件事是将 state = X 变成:
state = state % 3 + 1
状态机的想法不错,这取决于您尝试为其编写机器人的游戏类型。您观察到代码将变得比您希望的更复杂,这是一个很好的观察结果,现在是退后一步并考虑您的选择的好时机。
从您的代码和问题来看,您似乎对编程还很陌生,因此您可能需要了解一些基础知识以确定它们是否对您有帮助。
例如,如果您需要一个以上的状态机,或者想由多个较小的状态机组成您的状态机,您可能需要考虑将您的状态机编写为 class,您可以然后重复使用。如果你想为不同的游戏编写不同的代码,或者为玩相同游戏的不同策略编写不同的代码,这同样适用。
你问的是键盘输入,这是你可以单独解决的问题,但是当你开始添加东西时,只有一个主循环,在被按键打断的步骤中进行可能不是最好的方法。考虑什么样的输入和状态变化会影响你的程序正在做什么,并在担心如何将它们组合在一起之前专注于正确处理重要部分。
回答您的问题:有更好的方法来编写您的代码,并且由于有限状态机是一个非常常见的计算机科学概念,因此有许多库,其中一个可能会满足您的需求并节省您的时间很多时间。例如,查看 https://github.com/pytransitions/transitions
至于检查按键:你可以简单地用 input()
强制用户输入一些东西,但如果你想看看是否碰巧按下了一个键,你应该检查一个库,比如 keyboard
特别是 is_pressed()
https://github.com/boppreh/keyboard#keyboard.is_pressed
请注意,我不推荐这些库,我只是想指出对于常见问题,库通常是最好的解决方法。看看已经投入其中的大量工作以及作者花费的时间就可以了。
并非每个库都是完美的,一些程序员不喜欢包含他们不需要的代码的想法,但如果您想做一些可以做某事而不需要花几天时间重新发明轮子的东西,这绝对是一个可行的方法。一旦你有了一些有用的东西,你总是可以考虑用更简洁的东西替换一个库,如果你有信心你可以做得更好——也许你想自己将它作为一个库发布!
你的代码在你有几个状态的情况下运行良好。随着状态数量的增加,管理起来将变得更加困难。关于如何抢先准备代码,我有一些建议。
鉴于您现在的编码方式(在 if/elif 块中使用整数),您最好使用 switch/case 语句而不是一大块 if/elif 语句。
理想情况下,不要随意更改 state 的值,而是创建一个函数来标识每个循环开始时 运行 的当前状态。
同时实现这两个功能将使您可以在状态总数增加时更轻松地添加更多状态,同时还可以让您大致了解程序的实际情况 运行ning。 (即处于状态 x 的实际含义以及如果您处于状态 x 状态机的下一个周期会发生什么)
我是 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
我也是初学者,但你的代码对我来说还不错。
为了改进代码,您可以做的一件事是将 state = X 变成:
state = state % 3 + 1
状态机的想法不错,这取决于您尝试为其编写机器人的游戏类型。您观察到代码将变得比您希望的更复杂,这是一个很好的观察结果,现在是退后一步并考虑您的选择的好时机。
从您的代码和问题来看,您似乎对编程还很陌生,因此您可能需要了解一些基础知识以确定它们是否对您有帮助。
例如,如果您需要一个以上的状态机,或者想由多个较小的状态机组成您的状态机,您可能需要考虑将您的状态机编写为 class,您可以然后重复使用。如果你想为不同的游戏编写不同的代码,或者为玩相同游戏的不同策略编写不同的代码,这同样适用。
你问的是键盘输入,这是你可以单独解决的问题,但是当你开始添加东西时,只有一个主循环,在被按键打断的步骤中进行可能不是最好的方法。考虑什么样的输入和状态变化会影响你的程序正在做什么,并在担心如何将它们组合在一起之前专注于正确处理重要部分。
回答您的问题:有更好的方法来编写您的代码,并且由于有限状态机是一个非常常见的计算机科学概念,因此有许多库,其中一个可能会满足您的需求并节省您的时间很多时间。例如,查看 https://github.com/pytransitions/transitions
至于检查按键:你可以简单地用 input()
强制用户输入一些东西,但如果你想看看是否碰巧按下了一个键,你应该检查一个库,比如 keyboard
特别是 is_pressed()
https://github.com/boppreh/keyboard#keyboard.is_pressed
请注意,我不推荐这些库,我只是想指出对于常见问题,库通常是最好的解决方法。看看已经投入其中的大量工作以及作者花费的时间就可以了。
并非每个库都是完美的,一些程序员不喜欢包含他们不需要的代码的想法,但如果您想做一些可以做某事而不需要花几天时间重新发明轮子的东西,这绝对是一个可行的方法。一旦你有了一些有用的东西,你总是可以考虑用更简洁的东西替换一个库,如果你有信心你可以做得更好——也许你想自己将它作为一个库发布!
你的代码在你有几个状态的情况下运行良好。随着状态数量的增加,管理起来将变得更加困难。关于如何抢先准备代码,我有一些建议。
鉴于您现在的编码方式(在 if/elif 块中使用整数),您最好使用 switch/case 语句而不是一大块 if/elif 语句。
理想情况下,不要随意更改 state 的值,而是创建一个函数来标识每个循环开始时 运行 的当前状态。
同时实现这两个功能将使您可以在状态总数增加时更轻松地添加更多状态,同时还可以让您大致了解程序的实际情况 运行ning。 (即处于状态 x 的实际含义以及如果您处于状态 x 状态机的下一个周期会发生什么)