我正在用Python编写一个骰子游戏模拟,并试图找到以面向对象的方式处理以下情况的最佳方法。
我有一个Dice类来处理掷骰子和报告骰子的事情。此类的方法包括修改骰子值的roll()
方法,以及描述骰子状态的各种报告方法,例如have_n_of_a_kind()
,is_scoring_combination()
和get_roll_value()
。
有两个类使用这个Dice类。由人类直接控制的玩家不受信任,总是采取合法行动。还有一个Turn类,它强制执行游戏规则。
那么,Player和Turn类都需要能够通过调用描述方法的状态向Dice询问其值,但是不允许Player直接调用roll()
方法,因为人类播放器可能会在不应该播放时滚动。
我是否有一个好方法允许Turn类调用Dice对象的roll()
方法,但不允许玩家这样做?
答案 0 :(得分:1)
让Player
通过调用例如Turn
来turn.roll_dice()
滚动Turn
。然后,roll
可以决定是NotYourTurnError
骰子还是提出Player
。
您无法阻止die.roll()
班级直接拨打roll
,但您可以通过重命名__roll
使die
成为私有。但是,由于我假设播放器通过某种(G?)UI控制die
,因此您无法在所述界面中包含告诉roll
到_foo
的任何方式。
一般情况下,你不能在任何程度的安全性下隐藏任意Python代码这样的方法; Python非常强大,几乎可以肯定能够找到解决方案。相反,您将它们设为受保护(__foo
)或私有({{1}}),并假设打电话给他们的人知道他们在做什么。