智能卡游戏......
计算机用卡攻击人类。作为回应,玩家在视图上移动卡片以击败它。
在这种情况下,请确认:
(1) View可以知道屏幕“登陆区域”在哪里而不询问控制器
(2) View可以在不询问控制器的情况下知道屏幕上的“后卫”卡的位置
如果视图知道攻击者和防御者都是谁,(3)视图是否可以确定攻击者是否可以击败防御者?
如果这还不行,那么(4)是否可以查看View以外的其他控制器以获取此信息(想想Utils类),还是它应该始终是控制器?
(5)是否更好的方法是向控制器发送一个委托方法,表明“攻击者卡落在了后卫卡上”,并期望布尔值是否会成功攻击?
答案 0 :(得分:2)
视图是被动输入/输出设备。它不应该对游戏规则有任何了解,比如攻击者是否可以击败防御者。即使控制器不应该知道游戏规则,模型也总是决定。
视图应该能够表示和处理所有可能的输入和输出状态,并将输入中继到控制器。控制器将输入信息传递给模型并根据新的模型状态更新视图。在您的情况下,视图检测到卡A落在卡B上并将信息传递给控制器。控制器将信息传递给模型,模型转换到新的游戏状态,控制器将视图更新为新状态。有时视图可以通过直接观察模型自动更新,这取决于具体情况。
考虑MVC分离规则的一个好方法是想象将游戏移植到不同的界面(GUI / CLI)或不同的皮肤。如果您发现必须重做大部分代码以支持不同的接口,那么除了特定于接口的内容之外,您还必须触摸某些内容,这意味着设计不是最佳的。
设计直觉的另一个好的来源是测试&模拟。如果想要运行一些自动测试或游戏模拟,则必须将游戏代码与模型内的输入和输出分开。当逻辑散布在整个MVC上时,测试和模拟游戏会让你感到害怕,并提醒你有些事情是错误的。