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