Code: Select all
public class PieceNonCaptureMoveIterator
{
protected IField location;
IChessPosition pos;
int i = 0;
int dir = 0;
List<MoveBase> dirMoves;
int nDirMoves = 0;
PieceOffsets pieceOffsets = PieceOffsets.Instance;
DirectionMoves allDirMoves = null;
ColorSign colSign;
ChessPiece.Sort pieceSort;
public PieceNonCaptureMoveIterator()
{
}
public void Init(IField pieceLocation, IChessPosition pos)
{
this.pos = pos;
this.location = pieceLocation;
if (pos != null) colSign = (ColorSign)pos.CurPlayer;
}
public void Reset()
{
var occupier = location.Occupier;
pieceSort = occupier.PieceSort;
allDirMoves = location.XRayDirectionMoves(pieceSort);
dir = pieceOffsets[occupier.PieceKind].Length;
i = 1000;
}
public bool Next()
{
while (dir-- > 0)
{
if ((pieceSort == ChessPiece.Sort.whitePawn || pieceSort == ChessPiece.Sort.blackPawn)
&& (dir == (int)Pawn.Direction.EP_RIGHT || dir == (int)Pawn.Direction.EP_LEFT))
{
continue;
}
dirMoves = allDirMoves[dir];
nDirMoves = dirMoves.Count;
if (nDirMoves > 0)
{
i = -1;
return true;
}
}
return false;
}
public MoveBase Next2()
{
switch (pieceSort)
{
case ChessPiece.Sort.whiteKing:
case ChessPiece.Sort.blackKing:
while (Next())
{
MoveBase move = dirMoves[0];
if (move.CanMove(colSign, pos, location))
{
return move;
}
}
break;
case ChessPiece.Sort.whitePawn:
while (i < nDirMoves - 1 || Next())
{
MoveBase move = dirMoves[++i];
IField mvEnd = move.End;
if (mvEnd.ColNr == move.Start.ColNr)
{
if (mvEnd.Occupier == null)
{
return move;
}
else
{
i = 1000;
}
}
}
break;
case ChessPiece.Sort.blackPawn:
while (i < nDirMoves - 1 || Next())
{
MoveBase move = dirMoves[++i];
IField mvEnd = move.End;
if (mvEnd.ColNr == move.Start.ColNr)
{
if (mvEnd.Occupier == null)
{
return move;
}
else
{
i = 1000;
}
}
}
break;
case ChessPiece.Sort.whiteQueen:
case ChessPiece.Sort.whiteRook:
case ChessPiece.Sort.whiteBishop:
case ChessPiece.Sort.blackQueen:
case ChessPiece.Sort.blackRook:
case ChessPiece.Sort.blackBishop:
while (i < nDirMoves - 1 || Next())
{
MoveBase move = dirMoves[++i];
var occupier2 = move.End.Occupier;
if (occupier2 == null)
{
return move;
}
else
{
if (!Next()) break;
}
}
break;
case ChessPiece.Sort.whiteKnight:
case ChessPiece.Sort.blackKnight:
while (Next())
{
if (dirMoves[0].End.Occupier == null)
{
return dirMoves[0];
}
}
break;
}
return null;
}
}