示例#1
0
    private int Negamax(Vector2Int cell, int depth, bool white)
    {
        if (depth == 0 || (boardData.IsCellOccupied(FigureType.King, cell) &&
                           boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
        {
            return(Evaluate(boardData.GetFigureType(cell), cell));
        }

        int evaluation = int.MinValue;

        Vector2Int[] whitePieces = boardData.GetAllChessPiecesByColor(white);
        foreach (Vector2Int piece in whitePieces)
        {
            FigureType   type          = boardData.GetFigureType(piece);
            Vector2Int[] possibleMoves = boardData.GetPossibleMoves(type, piece, white);
            foreach (Vector2Int position in possibleMoves)
            {
                int i = -Negamax(position, depth - 1, !white);

                if (i > evaluation)
                {
                    evaluation    = i;
                    trueMove.from = piece;
                    trueMove.to   = position;
                }
            }
        }

        return(evaluation);
    }
    private GameObject GetFigureToSpawn(int c, int r)
    {
        Vector2Int pos        = new Vector2Int(c, r);
        FigureType figureType = boardData.GetFigureType(pos);

        switch (figureType)
        {
        case FigureType.Pawn:
            return(boardData.IsCellOccupied(FigureType.White, pos) ? whiteFigurePrefabs.pawn : blackFigurePrefabs.pawn);

        case FigureType.Rook:
            return(boardData.IsCellOccupied(FigureType.White, pos) ? whiteFigurePrefabs.rook : blackFigurePrefabs.rook);

        case FigureType.Knight:
            return(boardData.IsCellOccupied(FigureType.White, pos) ? whiteFigurePrefabs.knight : blackFigurePrefabs.knight);

        case FigureType.Bishop:
            return(boardData.IsCellOccupied(FigureType.White, pos) ? whiteFigurePrefabs.bishop : blackFigurePrefabs.bishop);

        case FigureType.Queen:
            return(boardData.IsCellOccupied(FigureType.White, pos) ? whiteFigurePrefabs.queen : blackFigurePrefabs.queen);

        case FigureType.King:
            return(boardData.IsCellOccupied(FigureType.White, pos) ? whiteFigurePrefabs.king : blackFigurePrefabs.king);
        }

        return(null);
    }
示例#3
0
    //TODO: Rewrite for better reading/understanding
    public void CalculateNextMove(bool white = false)
    {
        Vector2Int[] gamePieces = boardData.GetAllChessPiecesByColor(white);
        int          index      = white ? -int.MaxValue : int.MaxValue;

        foreach (Vector2Int cell in gamePieces)
        {
            figureType = boardData.GetFigureType(cell);
            int i = AlphaBetaPruning(cell, difficulty, -int.MaxValue, int.MaxValue, white);
            if (white)
            {
                if (i > index)
                {
                    index        = i;
                    figureToMove = cell;
                    bestMove     = tempBestMove;
                }
            }
            else
            {
                if (i < index)
                {
                    index        = i;
                    figureToMove = cell;
                    bestMove     = tempBestMove;
                }
            }
        }
    }
示例#4
0
    public void HighlightPossibleMoves(Vector2Int pos)
    {
        UnhighlightPreviousMoves();
        FigureType figureType = boardData.GetFigureType(pos.x, pos.y);

        savedPossibleMoves = boardData.GetPossibleMoves(figureType, pos.x, pos.y);
        for (int i = 0; i < savedPossibleMoves.Length; i++)
        {
            HighlightCell(savedPossibleMoves[i]);
        }
    }
示例#5
0
    public int GetCellValue(FigureType figureType, Vector2Int cell, bool white = true)
    {
        int value = 0;

        switch (figureType)
        {
        case FigureType.Pawn:
            value = white ? pawnBoardValues[cell.y * boardSize + cell.x] : pawnBoardMirroredValues[cell.y * boardSize + cell.x];
            if (boardData.IsCellOccupied(boardData.GetFigureType(cell), cell) && (boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
            {
                value += GetFigureValue(figureType, white);
            }

            break;

        case FigureType.Rook:
            value = white ? rookBoardValues[cell.y * boardSize + cell.x] : rookBoardMirroredValues[cell.y * boardSize + cell.x];
            if (boardData.IsCellOccupied(boardData.GetFigureType(cell), cell) && (boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
            {
                value += GetFigureValue(figureType, white);
            }

            break;

        case FigureType.Knight:
            value = white ? knightBoardValues[cell.y * boardSize + cell.x] : knightBoardMirroredValues[cell.y * boardSize + cell.x];
            if (boardData.IsCellOccupied(boardData.GetFigureType(cell), cell) && (boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
            {
                value += GetFigureValue(figureType, white);
            }

            break;

        case FigureType.Bishop:
            value = white ? bishopBoardValues[cell.y * boardSize + cell.x] : bishopBoardMirroredValues[cell.y * boardSize + cell.x];
            if (boardData.IsCellOccupied(boardData.GetFigureType(cell), cell) && (boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
            {
                value += GetFigureValue(figureType, white);
            }

            break;

        case FigureType.Queen:
            value = white ? queenBoardValues[cell.y * boardSize + cell.x] : queenBoardMirroredValues[cell.y * boardSize + cell.x];
            if (boardData.IsCellOccupied(boardData.GetFigureType(cell), cell) && (boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
            {
                value += GetFigureValue(figureType, white);
            }

            break;

        case FigureType.King:
            value = white ? kingBoardMiddleGameValues[cell.y * boardSize + cell.x] : kingBoardMirroredMiddleGameValues[cell.y * boardSize + cell.x];
            if (boardData.IsCellOccupied(boardData.GetFigureType(cell), cell) && (boardData.IsCellOccupied(white ? FigureType.Black : FigureType.White, cell)))
            {
                value += GetFigureValue(figureType, white);
            }

            break;

        default:
            Debug.Log("Illegal call to GetCellValue with " + figureType + ". You can call this only on figures.");
            break;
        }

        return(value);
    }