所以,我正在try 制作一个国际象棋引擎,以弥补我的不足,我通常是一名C#程序员.
在C#中,对于我的数据表示,我应该有如下内容:
public abstract class Piece
{
public Coordinate Location;
public abstract bool IsWhite {get;}
public abstract string PieceCode {get;} // e.g. K for a king
public abstract Move[] GetPossibleMoves(Board board);
}
public sealed class Pawn:Piece {//etc...}
然后我的冲浪板就会有一组所有的零件来处理.
我相信,在Rust中,像这样的东西将是应用更高级的枚举的一个很好的例子,所以如下所示:
struct Piece {
position: Coordinate,
isWhite: bool,
charCode: char
}
enum PieceType {
King(Piece),
Queen(Piece),
Bishop(Piece),
Knight(Piece),
Rook(Piece),
Pawn(Piece)
}
但是我真的不确定我应该把我的实现放在哪里,以获得可能的移动.每个Piece
实例都不知道它是什么类型,将PieceType
枚举添加到Piece
struct 中感觉就像是这种 struct 试图实现的对立面.
我想我可以有一个带有Vec<PieceType>
的Board
struct ,它有一个类似于GetMovesFor(PieceType)
的方法,里面有一个switch ?然而,在这一点上,感觉一个方法将远远不止一个工作,它将拥有每一部分的实现细节,而不是像我用C#构建它的方式那样只有一部分的实现细节.
另一种 Select 是,我可以走一条非常类似于我在C#中采用的路由,只给我们一个Piece
特征,在每种类型上实现它,并给我的董事会打Vec<Piece>
分.不过,在这一点上,我觉得我只是在try 模仿多态,而不是以质朴的方式行事.
所以我觉得我要么误解了这些扩展枚举的目标是什么,而这实际上并不是如何使用它们.或者,我遗漏了一些实现细节.
可以解决这两个问题的答案将是非常棒的!