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
我认为你在那里有一个良好的开端,所有的核心概念都有明确的定义.
我将模型略微区别开来:
[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.
BoardMoveValidatorvoid SetupBoard(Board),bool CheckMoveIsValid(Piece, FromSquare, ToSquare),GameState GetGameState()这是处理渲染的程序的一部分.
将您的模型视为包含游戏的所有逻辑和状态,将视图层视为在屏幕上"绘制"它的逻辑.
就任何设计模式而言,技术实施并不过分重要.什么是重要的是让事情变得松散耦合,并确保东西被分成正确的领域.
该视图的主要功能是:
控制器提供模型,视图和用户交互之间的管道.它将你的课程"粘在一起".
控制器需要利用和编排游戏类.职责是:
GameState),则停止游戏.这远非详尽无遗,但它应该提供一些思考的食物.
有关MVC结构的更多信息,请查看此处.
您可能希望查看的其他模式是MVVM(模型视图视图模型)和MVP(模型视图演示器).在我看来,MVP是WinForms应用程序的最佳选择.
最后,没有正确的方法来做到这一点!遵循良好的设计实践(但不要对其进行教条),保持松散耦合,最终你应该使用不含意大利面条的代码.
| 归档时间: |
|
| 查看次数: |
1822 次 |
| 最近记录: |