我已经获得大学任务,我必须在C#WinForms中开发国际象棋游戏,并且建议我们遵循模型 - 视图 - 控制器设计模式。我很难确定代码应该放在哪里,所以我希望得到一些建议和对我的设计的一般批评。对于那些勇于尝试遍历我的意大利面条代码的人,here's the full project。对于其他人来说,这里描述了我到目前为止所做的事情:
模型图层:
Piece
- 代表一个棋子。是派生类King
,Queen
,Rook
等,它们会覆盖虚拟方法以定义每个片段类型的移动行为。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
答案 0 :(得分:6)
我认为你在那里有一个良好的开端,所有核心概念都已明确定义。
我以稍微不同的方式打破模型:
[List<PieceState> Pieces]
void PlacePiece(Piece, Square)
, void MovePiece(FromSquare, ToSquare)
, void RemovePiece(Square)
[Type]
, [Colour]
[Coordinates]
[Piece], [IsActive]
, [Square]
bool MoveIsValid(Piece, FromSquare, ToSquare)
InPlay
, CheckMate
, StaleMate
等。[Colour]
, [List<Piece> Pieces]
MoveValidator
,并包含逻辑以确保碎片保留在纸板边界内,并且正方形仅包含一个。此类还包含用于确定当前 GameState
的逻辑。
Board
MoveValidator
void SetupBoard(Board)
, bool CheckMoveIsValid(Piece, FromSquare, ToSquare)
, GameState GetGameState()
这是处理渲染的程序的一部分。
将您的模型视为包含游戏的所有逻辑和状态,并将视图层视为&#34;绘制&#34;的逻辑。它在屏幕上。
就任何设计模式而言,技术实施并不过分重要。 重要的是保留loosely coupled,并确保将事物分组到正确的区域。
视图的主要功能是:
控制器提供模型,视图和用户交互之间的管道。它&#34;胶水&#34;你的课程一起。
控制器需要利用和编排游戏类。责任是:
GameState
确定),则停止播放。这远非详尽无遗,但它应该提供一些思考的食物。
看看here for more info on MVC structure。
您可能希望查看的其他模式包括MVVM (model view view-model)和MVP (model view presenter)。在我看来,MVP是WinForms应用程序的最佳选择。
最后,没有正确的方式来做到这一点!遵循良好的设计练习(但不要教条主义关于它),保持松散耦合,你最终应该< strong>意大利面条代码。