public static bool isCheckForSide(Color color, Board[] boards) { List <Vector3> kingPosList = PieceFinder.findPiecesOnBoards(typeof(King), color, boards); if (kingPosList.Count != 1) { throw new DragonChessException("King wasn't found or they are too many! Number kings is: " + kingPosList.Count); } Vector3 kingPos = kingPosList.ToArray() [0]; for (int boardId = 0; boardId < boards.Length; boardId++) { for (int x = 0; x < boards [boardId].GetLength(); x++) { for (int y = 0; y < boards [boardId].GetHeight(); y++) { if (WillBeKingKilledByPieceOn(new Vector3(x, y, boardId), kingPos, boards)) { return(true); } } } } return(false); }
public override void DoTurn() { var piecesPosList = PieceFinder.findAllPieces(Color, _boards); //First three tries working like this: RANDOM(select piece)->RANDOM(select move) for (int i = 0; i < 3; i++) { int selectedPiece = Random.Range(0, piecesPosList.Count); var turns = new List <Vector3> (); var piece = GetPiece(piecesPosList [selectedPiece]); var startPos = piecesPosList [selectedPiece]; turns.AddRange(piece.GetAvailableMoves(startPos, _boards)); turns.AddRange(piece.GetAvailableCaptures(startPos, _boards)); if (turns.Count != 0) { int selectedEndPoint = Random.Range(0, turns.Count); _gameManager.DoTurn(ConstructMove(piecesPosList [selectedPiece], turns [selectedEndPoint])); return; } } //Fallback to the RANDOM(get all pathes) var allTurns = new Dictionary <Vector3, List <Vector3> >(piecesPosList.Count); int totalCount = 0; for (int i = 0; i < piecesPosList.Count; i++) { allTurns [piecesPosList [i]] = new List <Vector3> (); var piece = GetPiece(piecesPosList [i]); var startPos = piecesPosList [i]; allTurns [piecesPosList [i]].AddRange(piece.GetAvailableMoves(startPos, _boards)); allTurns [piecesPosList [i]].AddRange(piece.GetAvailableCaptures(startPos, _boards)); totalCount += allTurns[piecesPosList [i]].Count; } int skipped = 0; int selectedMove = Random.Range(0, totalCount); for (int i = 0; i < piecesPosList.Count; i++) { if (skipped + allTurns[piecesPosList [i]].Count > selectedMove) { _gameManager.DoTurn(ConstructMove(piecesPosList [i], allTurns[piecesPosList[i]][selectedMove - skipped])); return; } skipped += allTurns [piecesPosList [i]].Count; } throw new DragonChessException("Can't choose the turn. Algorithm's problem"); }
public static bool isCheckMateForSide(Color color, Board[] boards) { List <Vector3> ourPiecesPositions = PieceFinder.findAllPieces(color, boards); foreach (Vector3 piecePos in ourPiecesPositions) { Piece piece = GetCell(piecePos, boards).Piece.GetComponent <Piece>(); if (piece.GetAvailableMoves(piecePos, boards).Count != 0 || piece.GetAvailableCaptures(piecePos, boards).Count != 0) { return(false); } } return(true); }
public void apply(Vector3 start, Vector3 end, Board[] boards) { //If basilisk moves if (GetCell(end, boards).Piece.GetComponent <Piece> ().GetType() == typeof(Basilisk)) { var startPieceAbove = GetCell(start + Step.UP, boards).Piece; if (startPieceAbove != null && startPieceAbove.GetComponent <Piece>().Color != GetCell(end, boards).Piece.GetComponent <Piece> ().Color) { startPieceAbove.GetComponent <Piece> ().GetFormedMove().RemoveConstraint(typeof(Immobilized)); startPieceAbove.GetComponent <Piece> ().GetFormedCapture().RemoveConstraint(typeof(Immobilized)); } var endPieceAbove = GetCell(end + Step.UP, boards).Piece; if (endPieceAbove != null && endPieceAbove.GetComponent <Piece>().Color != GetCell(end, boards).Piece.GetComponent <Piece> ().Color) { endPieceAbove.GetComponent <Piece> ().GetFormedMove().AddConstraint(new Immobilized()); endPieceAbove.GetComponent <Piece> ().GetFormedCapture().AddConstraint(new Immobilized()); } return; } //If basilisk is under you var activePiece = GetCell(end, boards).Piece.GetComponent <Piece>(); if (end.z != 0 && GetCell(end + Step.DOWN, boards).Piece != null && GetCell(end + Step.DOWN, boards).Piece.GetComponent <Piece> ().Color != activePiece.Color && GetCell(end + Step.DOWN, boards).Piece.GetComponent <Piece> ().GetType() == typeof(Basilisk)) { activePiece.GetFormedMove().AddConstraint(new Immobilized()); activePiece.GetFormedCapture().AddConstraint(new Immobilized()); return; } //If basilisk was captured var newBasiliskPositions = PieceFinder.findPiecesOnBoards(typeof(Basilisk), Color.WHITE, boards); newBasiliskPositions.AddRange(PieceFinder.findPiecesOnBoards(typeof(Basilisk), Color.BLACK, boards)); if (newBasiliskPositions.Count != oldBasiliskPositions.Count) { var difference = oldBasiliskPositions.Find((Vector3 el) => (!newBasiliskPositions.Contains(el))); if (oldBasiliskPositions.Contains(difference)) { GetCell(difference + Step.UP, boards).Piece.GetComponent <Piece> ().GetFormedMove().RemoveConstraint(typeof(Immobilized)); GetCell(difference + Step.UP, boards).Piece.GetComponent <Piece> ().GetFormedCapture().RemoveConstraint(typeof(Immobilized)); } oldBasiliskPositions = newBasiliskPositions; } }