Architecture 在动态创建的菜单中避免全局状态

Architecture 在动态创建的菜单中避免全局状态,architecture,state,software-design,state-management,Architecture,State,Software Design,State Management,我正试图为自己的学习写一个游戏,我遇到了一个设计问题,这让我的大脑崩溃了。这是一个相当简单的回合制游戏,玩家有自己的状态,一个清单,和一个全有状态的家;理想情况下,我想在世界其他地方添加一些有状态的元素 我试图向玩家展示他们在任何时候都有哪些选择。我尝试过在游戏流程控制中创建每个选项,但它变得难以管理,所以我现在尝试使用更好的设计。我的第一个想法是拥有一个Action类,它的每个实例都编码了某种状态测试。这样,我就可以在一个大的配置文件中定义可能的操作,当涉及到向用户提供选项时,我可以迭代操作。

我正试图为自己的学习写一个游戏,我遇到了一个设计问题,这让我的大脑崩溃了。这是一个相当简单的回合制游戏,玩家有自己的状态,一个清单,和一个全有状态的家;理想情况下,我想在世界其他地方添加一些有状态的元素

我试图向玩家展示他们在任何时候都有哪些选择。我尝试过在游戏流程控制中创建每个选项,但它变得难以管理,所以我现在尝试使用更好的设计。我的第一个想法是拥有一个Action类,它的每个实例都编码了某种状态测试。这样,我就可以在一个大的配置文件中定义可能的操作,当涉及到向用户提供选项时,我可以迭代操作。可用的测试和返回true的测试将被显示

#obligatory pseudopython
class Action:
    def __init__ (self, available_test, other_args):
        #available is a function passed in, or perhaps some SQL query
        self.available = available_test

....
for a in action_array:
    if a.available():
    #or maybe if test_handler(a.available)
        options.append(a.option)

gui.show_menu(options)
这样做的问题似乎是动作对象(或者处理程序)需要全局访问所有游戏状态,以查看它们是否可以执行。这立刻在我的脑海中升起了警告信号,但我看不出有什么办法可以绕过它。拥有一个拥有所有访问权限的处理程序听起来并不是那么糟糕,但这会引发如何指定测试的问题,除非我将所有数据放在数据库中并用SQL编写测试。但是,如果我这样做,我会绕过整个程序中的所有数据访问方法,这似乎也不利于良好的设计

我在思考中做错了什么?有更好的方法吗?我并不特别热衷于这种方式,我还没有在这个版本中编写太多代码,我很高兴从零开始(已经这样做过一次)。我正在仔细研究一份借来的完整代码副本,试图给我一些想法,但尽管这一切听起来都很可靠,但我仍然在为实际做什么而挠头


我只是想说清楚:我正在设计状态同时存储的方式;我希望动作系统和状态存储协调地工作。在某种程度上,我希望围绕健壮但简单的操作访问来设计状态管理。我是用Python写的,但目的是学习良好的软件设计技能,所以我稍微倾向于非特定语言的答案。

我同意全球化不是一条路。此外,通过在内部添加每个可能对象上的每个可能动作来扩充角色的定义也不是一件好事。然而,我认为使用动作对象也不是正确的组织方式。除了操作适用的对象之外,操作通常没有意义。你可以打开锁,但不能打开石头

另外,如果角色在不同的位置移动,则每个位置可能都会提供有关该位置中存在的对象的信息。对于可移动对象,位置可以变为“在人身上”,您可能有办法请求角色的清单,该清单将提供对象列表

我建议,组织行动的最干净的方法是让每个ActionableObject知道可以在其上或使用它执行哪些行动,包括知道每个行动的要求。对于位置中的每个对象,或者对于个人清单中的任何对象,角色应该可以通过对对象本身的请求获得可以对该对象执行的操作

功能战术可以做什么

投入包括

  • 提出请求的角色(通常是玩家角色,但是 如果你有NPC运行,最终可能成为非玩家角色 使用人工智能)
  • 当前位置,除非始终在对象本身中维护当前位置信息
  • 输出是可以对该对象或使用该对象执行的可能操作的列表

    内部,对象将考虑每一个可能的定义动作,并执行一个函数来检查是否满足该动作的要求,给定(作为输入)字符和位置。通过character参数,函数可以调查角色的属性(例如,他是否足够强壮,没有负担,能够举起我?他是否在他的库存中有完成我的缺失部分?我是否在正确的位置,以便可以执行操作(这可能不同于试图采取的行动是否会产生任何影响)?等等)

    如果满足要求,检查函数将返回true,并将操作添加到将作为输出返回的操作列表中

    同样,该对象还将提供执行所选操作的函数

    功能动作

    投入包括

  • 所选操作(从以前获得的列表中)
  • 提出请求的角色(通常是玩家角色,但是 如果你有NPC运行,最终可能成为非玩家角色 使用人工智能)
  • 当前位置,除非始终在对象本身中维护当前位置信息
  • 即使进行了需求检查以获得操作列表,最安全的方法还是再次检查需求是否仍然满足。如果满足,对象将调用函数来执行操作

    请注意,在这种设计中,当请求一个动作时,对象将操纵角色和环境的状态,这在一开始可能看起来很奇怪。但是,这是对角色选择执行动作的响应,从而产生动作对角色或环境的影响。对象调解了这一点通过提供所有需求(包括那些不明显的需求)的必要内部知识,以及由此产生的所有影响(包括cha