我目前的项目是尝试将流行的纸牌游戏《毛》移植到局域网游戏(多人游戏)中,其中计算机将成为“大师”。它将跟踪规则、套牌、玩家等。但是,Mao 没有正式的规则集;相反,玩家制定规则。因此,我的规则类具有非常基本的属性设置,因此可以使用 RuleHandler 类(其实例在单独的线程中运行)仅从几个属性生成代码:
- 触发器(一张牌(当它放在牌堆上时)或文本/动作)
- 可选条件(即:如果没有完整的牌组,那么......)
- 6(大部分)对游戏中任何变量的基本操作:
- 删除变量(如删除卡或删除玩家)
'del({variable})'
- 将变量设置为一个值(例如,将播放器顺序(一个 int)设置为负数(这将反转顺序))
'{variable} = {value}'
- '替换'两个变量(a,b = b,a;例如交换两个玩家的手或甲板和堆
'{variable1}, {variable2} = {variable2}, {variable1}'
(真的只是一个花哨的Set
动作)
- 'New',生成一个新对象(比如一张新卡片)
'{list}.append({class}({parametres}))'
(使用参数创建一个新的类对象并将其添加到适当的列表(要堆或甲板的卡片,RuleHandler 的新规则等))
- 调用,它只是调用另一个规则的代码
'self.rules.get({rule})rule'
(rules 是一个字典,键是包含所有信息的规则对象,值是compile
-ing 后生成的代码)
- 说,让玩家说些什么
- 不是一个简单的单线,并且超越了它的类界限(参考玩家连接和聊天)
- 删除变量(如删除卡或删除玩家)
最后一个是最复杂的,也是我遇到麻烦的一个。例如,毛泽东的一条普遍规则是,如果有人放下任何西装的“7”,他们必须说“祝你有美好的一天”。如果下一位玩家打出“7”,那么他们必须说“祝你有美好的一天”。“very's”不断添加,直到有人没有输入“7”,他们必须说“非常感谢”,其中“very's”的数量是最后一个“Have a very nice”中“very's”的数量day' + 1,同时也抽出该数量的牌作为惩罚。虽然是一个复杂的规则,但大部分都可以通过临时变量和最后一张牌的日志来轻松实现。然而,确保玩家说出正确短语的代码让我感到困惑。其余的操作在幕后进行,不需要任何用户输入。等待用户输入是服务器代码工作的一部分,不应该是 RuleHandler 类的一部分。
我该怎么做才能确保Say
操作简单并且不会超出面向对象编程的单一职责属性?