/// <summary> /// returns the number of ways in which soldier on coord can be captured; /// </summary> /// <param name="board"></param> /// <param name="coord"></param> /// <param name="player"></param> /// <returns></returns> public int CanBeCaptured(Board board, Coordinate coord, Player player) { int num = 0; Rules rule = new Rules(); IList<Coordinate> optionalCoords = rule.OptionalMoves(board, coord, player); IList<Coordinate> coordsInDir = rule.GetMovesInDirection(board, coord, player); //collect all coords behind coord IList<Coordinate> coordsfrombehind = optionalCoords.Where(opCor => !coordsInDir.Contains(opCor)).ToList(); foreach (var cid in coordsInDir) { if (board.GetPlayer(board[cid.X, cid.Y]) == board.GetOpponent(player) && rule.CoordsToCaptureAndDest(board, cid, coord, board.GetOpponent(player)).Count > 0) num++; } foreach (var cfb in coordsfrombehind) { if (board.GetPlayer(board[cfb.X, cfb.Y]) == board.GetOpponent(player) && board.IsKing(coord) && rule.CoordsToCaptureAndDest(board, cfb, coord, board.GetOpponent(player)).Count > 0) num++; } return num; }
/// <summary> /// Check the safeness of a coordinate (can be captured). if the sold is on boundary than safe (4) else return the /// delta between number of player soldiers and number of Opp soldiers around the coord. /// </summary> /// <param name="board"></param> /// <param name="coord"></param> /// <param name="player"></param> /// <returns></returns> private int Safeness(Board board, Coordinate coord, Player player) { int playerCoords = 0; int opponentCoords = 0; Rules rule = new Rules(); if (coord.X == 1 || coord.X == 8 || coord.Y == 1 || coord.Y == 8) { return 4; } IList<Coordinate> coordinates = rule.OptionalMoves(board, coord, player); foreach (var coordinate in coordinates) { if (player == board.GetPlayer(coordinate)) { playerCoords++; } else if (board.GetOpponent(player) == board.GetPlayer(coordinate)) { opponentCoords++; } } return playerCoords - opponentCoords; }