我正在尝试为自己的学习编写游戏,但遇到了一个让我脑筋急转弯的设计问题。这是一个相当简单的回合制游戏,玩家拥有自己的状态、物品栏和拥有状态的家;理想情况下,我想在世界其他地方添加一些有状态的元素。
我试图向玩家展示他们可以随时使用的选项。我已经尝试在游戏流程控制中创建每个选项,但它变得无法管理,所以我现在正在尝试使用更好的设计。我的第一个想法是有一个 Action 类,它的每个实例都编码了某种状态测试。这样我就可以在一个大的配置文件中定义可能的操作,当向用户展示选项时,我可以迭代 Action.available 测试并呈现返回 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)
这样做的问题似乎是 Action 对象(或者可能是处理程序)需要全局访问所有游戏状态才能查看它们是否可以执行。这立即在我的脑海中升起了警告标志,但我看不到绕过它的方法。拥有一个拥有所有访问权限的处理程序听起来并没有那么糟糕,但这引发了如何指定测试的问题,除非我将所有数据放入数据库并用 SQL 编写测试。但是,如果我这样做,我将绕过整个程序中的每个数据访问方法,这似乎也违背了良好的设计。
我的想法做错了什么?有更好的方法吗?我并不特别喜欢这种做事方式,我在这个版本中没有写太多代码,我很高兴从头开始(已经这样做过一次)。我正在仔细研究借来的 Code Complete 副本,试图给我一些想法,但是虽然这一切听起来很扎实,但我仍然在摸索到底要做什么。
明确一点:我正在设计同时存储状态的方式;我希望 Action 系统和状态存储能够和谐地协同工作。在某种程度上,我想围绕通过 Actions 进行的健壮但简单的访问来设计状态管理。我正在用 Python 写作,但目的是学习一般的良好软件设计技能,所以我更喜欢非语言特定的答案。