示例#1
0
    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);
    }
示例#2
0
    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");
    }
示例#3
0
    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;
        }
    }