public IEnumerable <Move> GetMoves(Checkerboard checkerboard, Pawn pawn) { Position posPlus1; Position posPlus2; if (pawn.PawnColor == PawnColor.White) { posPlus1 = pawn.Position + new Position(0, 1); posPlus2 = posPlus1 + new Position(0, 1); } else { posPlus1 = pawn.Position - new Position(0, 1); posPlus2 = posPlus1 - new Position(0, 1); } bool canMove1SquareForward = checkerboard.IsEmptyButExists(posPlus1); bool canMove2SquareForward = pawn.Position.Digit == (pawn.PawnColor == PawnColor.White ? 1 : 6) && checkerboard.IsEmptyButExists(posPlus2); if (canMove1SquareForward) { yield return(checkerboard.GetMove(pawn, posPlus1)); if (canMove2SquareForward) { yield return(checkerboard.GetMove(pawn, posPlus2)); } } foreach (var take in GetTakes(checkerboard, pawn)) { yield return(checkerboard.GetMove(pawn, take.NewPawnPos, take.TakenPawn)); } }
Move?FindMove(Checkerboard checkerboard, Pawn pawn, Position position) { if (checkerboard.IsEmptyButExists(position)) { return(checkerboard.GetMove(pawn, position)); } return(null); }
public IEnumerable <Move> GetTakes(Checkerboard checkerboard, Pawn pawn) { Position leftPos; Position rightPos; Position frontLeftPos; Position frontRightPos; int curPawnLetter = pawn.Position.Letter; int curPawnDigit = pawn.Position.Digit; if (pawn.PawnColor == PawnColor.White) { frontLeftPos = new Position((curPawnLetter - 1), curPawnDigit + 1); frontRightPos = new Position((curPawnLetter + 1), curPawnDigit + 1); leftPos = new Position((curPawnLetter - 1), curPawnDigit); rightPos = new Position((curPawnLetter + 1), curPawnDigit); } else { frontLeftPos = new Position((curPawnLetter + 1), curPawnDigit - 1); frontRightPos = new Position((curPawnLetter - 1), curPawnDigit - 1); leftPos = new Position((curPawnLetter - 1), curPawnDigit); rightPos = new Position((curPawnLetter + 1), curPawnDigit); } if (checkerboard.IsOccupied(leftPos, out Pawn oppositeLeftPawn) && CanTakeEnPassant(checkerboard, pawn, oppositeLeftPawn, frontLeftPos, out Pawn frontLeftPawn)) { yield return(checkerboard.GetMove(pawn, frontLeftPos, frontLeftPawn)); } if (checkerboard.IsOccupied(rightPos, out Pawn oppositeRightPawn) && CanTakeEnPassant(checkerboard, pawn, oppositeRightPawn, frontRightPos, out Pawn frontRightPawn)) { yield return(checkerboard.GetMove(pawn, frontRightPos, frontRightPawn)); } if (checkerboard.IsOccupied(frontLeftPos, out Pawn frontLeftPawn1) && pawn.AreOppositeColor(frontLeftPawn1)) { yield return(checkerboard.GetMove(pawn, frontLeftPos, frontLeftPawn1)); } if (checkerboard.IsOccupied(frontRightPos, out Pawn frontRightPawn1) && pawn.AreOppositeColor(frontRightPawn1)) { yield return(checkerboard.GetMove(pawn, frontRightPos, frontRightPawn1)); } }
public static IEnumerable <Move> FindMovesAlongDirection(this Checkerboard checkerboard, Pawn pawn, Position delta) { var currPosition = pawn.Position + delta; while (Checkerboard.Exists(currPosition)) { if (checkerboard.IsOccupied(currPosition, out Pawn currPosPawn)) { if (currPosPawn.AreOppositeColor(pawn)) { yield return(checkerboard.GetMove(pawn, currPosition, currPosPawn)); } break; } else if (checkerboard.IsEmptyButExists(currPosition)) { yield return(checkerboard.GetMove(pawn, currPosition)); } currPosition += delta; } }