重构C#国际象棋游戏遵循MVC设计模式

时间:2014-07-20 06:09:50

标签: c# asp.net-mvc winforms

我已经获得大学任务,我必须在C#WinForms中开发国际象棋游戏,并且建议我们遵循模型 - 视图 - 控制器设计模式。我很难确定代码应该放在哪里,所以我希望得到一些建议和对我的设计的一般批评。对于那些勇于尝试遍历我的意大利面条代码的人,here's the full project。对于其他人来说,这里描述了我到目前为止所做的事情:

模型图层:

  • Piece - 代表一个棋子。是派生类KingQueenRook等,它们会覆盖虚拟方法以定义每个片段类型的移动行为。
  • Player - 一个小型实用工具类,除了将每个玩家的作品存储在List<Piece>对象中并对其执行全局操作(单件可以&#)之外,其他功能并不多39; t(或不应该)自己执行,例如检查,清除通行证和城堡移动等。

查看图层:

  • frmChess - 应用程序的主要形式。覆盖WndProc以在用户调整表单时保持表单的1:1宽高比,否则只是一个普通表单。
  • Board - 我在Visual Studio设计器中编辑的标准WinForms TableLayoutPanel的简单派生,有8列和行。这个类的一个实例位于主窗体上,除了简化方块的对齐和显示外,还没有任何

控制器图层:

  • Game - 一个静态类,它在List<Square>对象中存储64 Square s(见下文),并且有多种方法可以让方形达到给定(x, y)协调,保存/加载游戏状态到/从二进制文件加载并检测将死。

不确定

  • Square - 标准WinForms控件的另一个简单派生,即Panel。其中64个已在设计时添加到Board,并且每个都是空的,或者在任何给定时间保存单个Piece实例。那件作品还有一个圆形的方形参考,我想改变它,因为它看起来像是视图层中的正方形,而模型应该对视图一无所知。我还覆盖了方形的OnPaint方法,在其前景中绘制其包含的片段图像,并在主窗体中连接一个事件处理程序,连接到每个方块&#39; ■单击事件,以便可以选择和移动片段。我也可以从这里想到许多其他的事情,例如确定可以攻击或正在攻击这个方块的其他方块。所以这让我觉得也许应该毕竟是模特的一部分...任何想法?

  • PieceMove - 此类在测试检查时处理移动的执行和撤消,并且还允许测试移动是否会导致对移动棋子的团队进行检查,从而使移动无效。我真的不知道这应该被视为模型的一部分还是移动控制器。另外就是说,我应该有一个单独的移动控制器,视图控制器等,还是只有一个控制器类可以完成所有这些操作?

最后,我知道这篇文章太长了所以我为此道歉,但我想实现一个事件驱动的方法来通知模型的变化,例如:选择一块,移动一块,团队处于检查状态,团队处于将死状态,等等。我将如何处理?

提前感谢大家花时间阅读本文和/或我的代码;对此,我真的非常感激! :d

1 个答案:

答案 0 :(得分:6)

我认为你在那里有一个良好的开端,所有核心概念都已明确定义。

我以稍微不同的方式打破模型:

模型

  • Board - 包含电路板上当前的碎片状态。
    • 属性: [List<PieceState> Pieces]
    • 方法: void PlacePiece(Piece, Square) void MovePiece(FromSquare, ToSquare) void RemovePiece(Square)
  • [Type] [Colour]
  • Square - 代表棋盘上的正方形。
    • 属性: [Coordinates]
  • PieceState [Piece], [IsActive] [Square]
  • MoveValidator - 确保作品可以执行所需的移动。
    • 方法: bool MoveIsValid(Piece, FromSquare, ToSquare)
  • GameState - 描述游戏的整体状态。
    • 值: InPlay CheckMate StaleMate 等。
  • 玩家:代表玩家。
    • 属性: [Colour] [List<Piece> Pieces]
  • GameLogic - 利用 MoveValidator ,并包含逻辑以确保碎片保留在纸板边界内,并且正方形仅包含一个。此类还包含用于确定当前 GameState 的逻辑。
    • 属性: Board
    • 有: MoveValidator
    • 方法: void SetupBoard(Board) bool CheckMoveIsValid(Piece, FromSquare, ToSquare) GameState GetGameState()

视图

这是处理渲染的程序的一部分。

将您的模型视为包含游戏的所有逻辑和状态,并将视图层视为&#34;绘制&#34;的逻辑。它在屏幕上。

就任何设计模式而言,技术实施并不过分重要。 重要的是保留loosely coupled,并确保将事物分组到正确的区域。

视图的主要功能是:

  1. 呈现董事会。
  2. 使用正确的图标和颜色在棋盘上渲染碎片。
  3. 显示相关游戏统计数据,得分,活跃棋子,游戏时间等。
  4. 控制器

    控制器提供模型,视图和用户交互之间的管道。它&#34;胶水&#34;你的课程一起。

    控制器需要利用和编排游戏类。责任是:

    1. 设置一个新的电路板,然后将其传回视图进行渲染。
    2. 接收用户输入,验证它,然后相应地更新电路板。将更新视图传递回来进行渲染。
    3. 如果玩家获胜,或达到陈旧配合(由 GameState 确定),则停止播放。
    4. 这远非详尽无遗,但它应该提供一些思考的食物。

      看看here for more info on MVC structure

      您可能希望查看的其他模式包括MVVM (model view view-model)MVP (model view presenter)。在我看来,MVP是WinForms应用程序的最佳选择。

      最后,没有正确的方式来做到这一点!遵循良好的设计练习(但不要教条主义关于它),保持松散耦合,你最终应该< strong>意大利面条代码。