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); }
//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; } } } }
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]); } }
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); }