我正与我的开发人员讨论以下游戏设计。
我在Move
课程中收集了Game
。我的开发人员队友要求我删除该集合,并且只有当前的移动信息。
你的建议是什么?
public class Game
{
public String Id { get; set; }
public String CreatorId { get; set; }
public List<Player> Players { get; set; }
public List<Move> Moves { get; set; }
}
public class Player
{
public String Id { get; set; }
public String Name { get; set; }
}
public class Move
{
public String Id { get; set; }
public String PlayerId { get; set; }
public String PlayerName { get; set; }
public String NextMoveId { get; set; }
public String NextPlayerId { get; set; }
public String Position { get; set; }
}
修改
我的开发人员队友建议我在Move
课程中只有一个Game
个对象。
答案 0 :(得分:6)
我们任何人都无法为您的设计提供真正正确的方法。这不是一个干脆的情况;没有“正确”或“错误”的答案。鉴于我们不了解游戏设计背后的所有细节,我们特别难以提出建议。例如,正如我在评论中提到的那样,其他几个答案已暗示,如果你有“撤消”或“重播”功能,你将需要来存储所有动作的历史记录。如果没有,并且您不希望实现此类功能,则 no 需要存储有关所有移动的信息。
这是您需要学习如何成为程序员的设计决策。考虑一种方法的所有可能的好处以及另一种方法的好处,然后确定哪种方法最适合您的应用。如果您觉得有用,请制作一个“T”图表。类似的东西:
Keeping List of All Moves | Storing Only Last Move ---------------------------------------|------------------------------------ - Allows you to implement Undo | - Simplifies your game's design or Replay feature | - Consumes more memory | - Saves memory by only storing the | minimum amount of data | | ...etc.
最后,您(以及您的同事)是最有能力做出此决定的人。确保您自己仔细比较优缺点确保你做出正确的最佳方法。
答案 1 :(得分:3)
游戏通常由一个或多个玩家执行的一组动作组成。在每次移动之间,游戏处于某种状态。
如果您具有当前状态,并且无需播放或撤消任何移动,则永远不会访问先前的移动。未来的动作尚未公布,因此仅使用您提供的信息,我会说Game
不应该有Move
,只需要State
和ProcessMove(Move move)
方法更改Game
的{{1}}。 State
由其中一个Move
生成。
答案 2 :(得分:1)
public class Game
{
public String Id { get; set; }
public String CreatorId { get; set; }
public List<Player> Players { get; set; }
public String PlayerId { get; set; }
}
public class Player
{
public String Id { get; set; }
public String Name { get; set; }
public String Position { get; set; }
public Move(string NewPosition);
public event EventHandler onMoved;
}
这将是我首选的选项,虽然不知道它是什么类型的游戏但它很难知道。无论哪种方式,玩家都应该封装自己的位置,游戏应该知道当前玩家。
至于移动,它的游戏依赖,但移动会改变玩家的位置,这可能会或可能不会影响其他玩家,所以我可能会对玩家实施移动并对玩家进行onMoved事件,其中游戏订阅..
答案 3 :(得分:0)
我认为在那里有一系列动作没有错。你可以用另一个属性公开当前的移动,然后你和你的伙伴都会得到满足。
对于您提供的信息,我只能说。我不知道你的游戏逻辑。当你需要有移动历史(例如重放功能)或者你想要计划好几步时,移动集合可能是一个优势。除了你可能不一定需要它之外,我认为没有错。
顺便说一句:List<T>
用于实现,而不是用于ObjectModels。我将List包装在一个名为MovesCollection的类中。并且Move应该实现一个接口(一个抽象合同),以防你需要许多不同的移动实现(例如AttackMove,Fortify-Move,Retreat-Move ......)
答案 4 :(得分:0)
我认为拥有该集合可能有助于在游戏中实现“撤消移动”功能。 Move对象列表可以是命令的实现,您可以使用命令中的信息保存/恢复游戏状态。
答案 5 :(得分:0)
从我的角度来看。如果您不想要UNDO
功能,那么放置MOVES列表是没用的,因为您已经提到了no we do not have Undo feature, nor we think about having it
。为什么在这里有这个名单?
认为这样,你已经在代码中声明了很多变量而没有使用它们。保持代码清洁和简单是一种很好的做法=)