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

Ken*_*y83 1 c# asp.net-mvc winforms

我已经获得了大学任务,我必须在C#WinForms中开发一个国际象棋游戏,并且建议我们遵循模型 - 视图 - 控制器设计模式.我很难确定哪些代码应该放在哪里,所以我希望得到一些建议和对我的设计的一般批评.对于那些勇于尝试遍历我的意大利面条代码的人来说,这是完整的项目.对于其他人来说,这是对我迄今为止所提出的内容的描述:

模型层:

  • Piece - 代表一个棋子.已经派生类King,Queen,Rook等,它们重写虚拟方法来定义每个片类型的运动行为.
  • Player- 一个小的实用程序类,除了将每个玩家的部分存储在一个List<Piece>对象中并对它们执行全局操作(单个部分不能(或不应该)自己执行)(如检查,清除) en passant和castle move等

查看图层:

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

控制器层:

  • Game- 一个静态类,它将64s Square(见下文)存储在一个List<Square>对象中,并且有各种方法允许在给定(x,y)坐标处获得正方形,将游戏状态保存/加载到二进制文件中或从二进制文件中加载击破.

不确定:

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

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

最后,我知道这个帖子太长了所以我为此道歉,但我想实现一个事件驱动的方法来通知模型的变化视图,例如选择一块,移动一块,团队在检查,团队在将死,等等.我该怎么办?

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

Dav*_*and 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()

视图

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

将您的模型视为包含游戏的所有逻辑和状态,将视图层视为在屏幕上"绘制"它的逻辑.

就任何设计模式而言,技术实施并不过分重要.什么重要的是让事情变得松散耦合,并确保东西被分成正确的领域.

该视图的主要功能是:

  1. 渲染板.
  2. 使用正确的图标和颜色在棋盘上渲染碎片.
  3. 显示相关游戏统计数据,得分,活跃棋子,游戏时间等.

调节器

控制器提供模型,视图和用户交互之间的管道.它将你的课程"粘在一起".

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

  1. 设置一个新板,然后将其传递回视图进行渲染.
  2. 接收用户输入,验证它,然后相应地更新电路板.将更新视图传递回以进行渲染.
  3. 如果玩家获胜,或达到陈旧配合(由确定GameState),则停止游戏.

这远非详尽无遗,但它应该提供一些思考的食物.

有关MVC结构的更多信息,请查看此处.

您可能希望查看的其他模式是MVVM(模型视图视图模型)MVP(模型视图演示器).在我看来,MVP是WinForms应用程序的最佳选择.

最后,没有正确的方法来做到这一点!遵循良好的设计实践(但不要对其进行教条),保持松散耦合,最终你应该使用不含意大利面条的代码.