我越看问题,我就会想到更多的状态/流程图。
状态对象可以包含多个转换。
甲转变包括:
- 条件(一个或多个)
- 动作(一个或多个)
- 每个对象可以有多个规则需要在要被施加特定序列。当规则1结束后,第2条应该然后开始验证等
通过使用状态图,你会得到多个规则,并通过国家具体的行动序列和状态转换
- 每单独的规则(例如:只能移动1个方块,只能对角移动等)必须属于自己的类,并且必须可重用并适用于需要规则的对象。
这可以通过封装条件检查行为作为一个阶级
public class Condition
{
public string Name {get; set;}
public Func<Move,bool> IsMet {get;set;}
}
// Captures the behaviour of moving diagonally by 1-step
// This can now be referenced/composed by other classes to build
// a more complex condition
var moveDiagonalCondition = new Condition
{
Name="Move diagonal",
IsMet = move =>
{
var delta = (move.ToPosition - move.FromPosition);
// 1 step to the left or right
return Math.Abs(delta.X) == 1
// 1 step upwards (if player),
// or 1 step downwards (if opponent)
&& delta.Y == move.IsPlayer1Move ? -1 : 1
}
}
在国际象棋的情况下,我建议绕过move
参数:
public class Move
{
public Point FromPosition {get;set;}
public Point ToPosition {get;set;}
public Piece Piece {get;set;}
}
与此同时,各州应该能够访问整个游戏键盘。 这使得该州做的事情一样
// Check for empty cell
GameBoard.GetPieceAt(move.ToPosition) == null;
// Check for opponent's piece
GameBoard.GetPieceAt(move.ToPosition).IsPlayer2;
为了进一步通过参数这扩展到您的MMORPG的情况下,我会通过任何“源”和/或“目标”
结论
与状态问题非常相似,我认为查看基于状态的解决方案是一个不错的主意。
例如,State Pattern,有限状态机,状态转变表,自动机等
或者你可以尝试寻找了决策表和决策树(还没有真正使用这些我自己,所以我无法对他们说很多)。
不幸的是,我不认为我可以推荐一个确切的解决方案。
但希望上面的几个例子/关键字将帮助您开始。
谢谢,我一定会仔细看看它。我已经看到这种模式在其他答案中被命名,但我不完全确定如何实现这一点。 – Thomas