游戏设计改进

时间:2010-12-10 09:23:58

标签: c#

我正与我的开发人员讨论以下游戏设计。

我在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个对象。

6 个答案:

答案 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,只需要StateProcessMove(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。为什么在这里有这个名单?

认为这样,你已经在代码中声明了很多变量而没有使用它们。保持代码清洁和简单是一种很好的做法=)