我越是关注问题,就越会想起状态/流程图。
状态对象可以包含多个转换。
过渡包括:
- 条件)
- 行动
- 每个对象都可以有多个需要按特定顺序应用的规则。规则 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;}
}
同时,各州应该可以访问整个 GameBoard。这允许国家做一些事情,比如
// Check for empty cell
GameBoard.GetPieceAt(move.ToPosition) == null;
// Check for opponent's piece
GameBoard.GetPieceAt(move.ToPosition).IsPlayer2;
为了进一步将此扩展到您的 MMORPG 场景,我将通过参数传递任何“源”和/或“目标”
结论
与状态问题如此相似,我认为查看基于状态的解决方案是个好主意。
例如,状态模式、有限状态机、状态转换表、自动机等。
或者您可以尝试查找决策表和决策树(我自己并没有真正使用过这些,所以我无法对它们多说)。
不幸的是,我认为我不能推荐一个确切的解决方案。
但希望上面的几个示例/关键字可以帮助您入门。