Example #1
0
    public void AddPiece(GameObject prefab, Player player, int col, int row)
    {
        Debug.Log("Add Piece");
        Debug.Log(col.ToString());
        Debug.Log(row.ToString());
        GameObject pieceObject = board.AddPiece(prefab, col, row);

        player.pieces.Add(pieceObject);
        pieces[MapValue(-20, 20, 0, 4, col), MapValue(-20, 20, 0, 4, row)] = pieceObject;
    }
Example #2
0
 public bool TapAction(int x, int y)
 {
     //! Here we make sure that there's no piece here already before accepting the tap
     //! If you wanted to expand the AGD system to allow for tapping pieces, you'd change this
     if (state.Value(x, y) == 0)
     {
         //! By default, tapping an empty space spawns our piece in
         state.Set(x, y, Player.CURRENT);
         //! If we're in interactive mode, we notify the board that we've placed a piece
         if (interactiveMode)
         {
             playableGame.AddPiece(x, y, CurrentPlayer() - 1);
         }
         //! Automatically end the turn after a player has placed a piece
         //! Again, if you wanted to allow multiple actions, you'd change this.
         EndTurn();
         return(true);
     }
     else
     {
         return(false);
     }
 }
Example #3
0
    int MiniMax(Move[] allPossibleWhiteMoves, Move[] allPossibleBlackMoves, int depth, bool maximizingPlayer)
    {
        int currentState;

        if (maximizingPlayer)
        {
            if (boardManager.CalculateWhiteCheck() && allPossibleWhiteMoves.Length == 0)
            {
                currentState = int.MinValue;
                return(currentState);
            }
            else if (allPossibleWhiteMoves.Length == 0)
            {
                currentState = 0;
                return(currentState);
            }
        }
        else
        {
            if (boardManager.CalculateBlackCheck() && allPossibleBlackMoves.Length == 0)
            {
                currentState = int.MaxValue;
                return(currentState);
            }
            else if (allPossibleBlackMoves.Length == 0)
            {
                currentState = 0;
                return(currentState);
            }
        }
        if (depth == 0)
        {
            currentState = CalculateGameState(boardManager.allWhitePieces.ToArray(), boardManager.allBlackPieces.ToArray());
            return(currentState);
        }
        if (maximizingPlayer)
        {
            bool       kingMovement   = boardManager.whiteKingHasMoved;
            ChessPiece leftWhiteRook  = boardManager.ChessPieces [0, 0];
            ChessPiece rightWhiteRook = boardManager.ChessPieces [7, 0];
            int        maxState       = int.MinValue;
            for (int i = allPossibleWhiteMoves.Length - 1; i >= 0; i--)
            {
                ChessPiece pieceToMove = allPossibleWhiteMoves [i].pieceToMove;
                ChessPiece targetPiece = allPossibleWhiteMoves [i].targetPiece;
                if (targetPiece != null)
                {
                    boardManager.CaptureSimulation(targetPiece);
                }
                if (pieceToMove.GetType() == typeof(King))
                {
                    boardManager.whiteKingHasMoved = true;
                    if (allPossibleWhiteMoves [i].targetX == allPossibleWhiteMoves [i].currentX - 2)
                    {
                        boardManager.MoveInGame(3, 0, leftWhiteRook);
                    }
                    else if (allPossibleWhiteMoves [i].targetX == allPossibleWhiteMoves [i].currentX + 2)
                    {
                        boardManager.MoveInGame(5, 0, rightWhiteRook);
                    }
                }
                boardManager.MoveInGame(allPossibleWhiteMoves [i].targetX, allPossibleWhiteMoves [i].targetY, pieceToMove);
                currentState = MiniMax(null, boardManager.CalculateNextBlackMoves(), depth - 1, false);
                Evaluation evaluation = new Evaluation(allPossibleWhiteMoves [i], currentState);
                if (depth == numberOfMovesToLookAhead)
                {
                    evaluations.Add(evaluation);
                }
                if (currentState > maxState)
                {
                    maxState = currentState;
                }
                boardManager.RevertInGame(allPossibleWhiteMoves [i].currentX, allPossibleWhiteMoves [i].currentY, allPossibleWhiteMoves [i].targetX, allPossibleWhiteMoves [i].targetY, targetPiece, pieceToMove);
                if (pieceToMove.GetType() == typeof(King))
                {
                    boardManager.whiteKingHasMoved = kingMovement;
                    if (allPossibleWhiteMoves [i].targetX == allPossibleWhiteMoves [i].currentX - 2)
                    {
                        boardManager.RevertInGame(0, 0, 3, 0, null, leftWhiteRook);
                    }
                    else if (allPossibleWhiteMoves [i].targetX == allPossibleWhiteMoves [i].currentX + 2)
                    {
                        boardManager.RevertInGame(7, 0, 5, 0, null, rightWhiteRook);
                    }
                }
                if (targetPiece != null)
                {
                    boardManager.AddPiece(targetPiece, allPossibleWhiteMoves [i].targetX, allPossibleWhiteMoves [i].targetY);
                }
            }
            return(maxState);
        }
        else
        {
            bool       kingMovement   = boardManager.blackKingHasMoved;
            ChessPiece leftBlackRook  = boardManager.ChessPieces [0, 7];
            ChessPiece rightBlackRook = boardManager.ChessPieces [7, 7];
            int        minState       = int.MaxValue;
            for (int i = allPossibleBlackMoves.Length - 1; i >= 0; i--)
            {
                ChessPiece pieceToMove = allPossibleBlackMoves [i].pieceToMove;
                ChessPiece targetPiece = allPossibleBlackMoves [i].targetPiece;
                if (targetPiece != null)
                {
                    boardManager.CaptureSimulation(targetPiece);
                }
                if (pieceToMove.GetType() == typeof(King))
                {
                    boardManager.blackKingHasMoved = true;
                    if (allPossibleBlackMoves [i].targetX == allPossibleBlackMoves [i].currentX - 2)
                    {
                        boardManager.MoveInGame(3, 7, leftBlackRook);
                    }
                    else if (allPossibleBlackMoves [i].targetX == allPossibleBlackMoves [i].currentX + 2)
                    {
                        boardManager.MoveInGame(5, 7, rightBlackRook);
                    }
                }
                boardManager.MoveInGame(allPossibleBlackMoves [i].targetX, allPossibleBlackMoves [i].targetY, pieceToMove);
                currentState = MiniMax(boardManager.CalculateNextWhiteMoves(), null, depth - 1, true);
                Evaluation evaluation = new Evaluation(allPossibleBlackMoves [i], currentState);
                if (depth == numberOfMovesToLookAhead)
                {
                    evaluations.Add(evaluation);
                }
                if (currentState < minState)
                {
                    minState = currentState;
                }
                boardManager.RevertInGame(allPossibleBlackMoves [i].currentX, allPossibleBlackMoves [i].currentY, allPossibleBlackMoves [i].targetX, allPossibleBlackMoves [i].targetY, targetPiece, pieceToMove);
                if (pieceToMove.GetType() == typeof(King))
                {
                    boardManager.blackKingHasMoved = kingMovement;
                    if (allPossibleBlackMoves [i].targetX == allPossibleBlackMoves [i].currentX - 2)
                    {
                        boardManager.RevertInGame(0, 7, 3, 7, null, leftBlackRook);
                    }
                    else if (allPossibleBlackMoves [i].targetX == allPossibleBlackMoves [i].currentX + 2)
                    {
                        boardManager.RevertInGame(7, 7, 5, 7, null, rightBlackRook);
                    }
                }
                if (targetPiece != null)
                {
                    boardManager.AddPiece(targetPiece, allPossibleBlackMoves [i].targetX, allPossibleBlackMoves [i].targetY);
                }
            }
            return(minState);
        }
    }
Example #4
0
    void TouchInput()
    {
        foreach (Touch touch in Input.touches)
        {
            if (touch.phase == TouchPhase.Began)
            {
                if (selectCooldown > 0)                  //if it was touched before the cooldown was ended
                {
                    selectCooldown = Mathf.Min(selectCooldown * 1.5f, selectDelay);
                }
                if (selectCooldown <= 0 && Physics.Raycast(Camera.main.ScreenPointToRay(touch.position), out hit, raycastHit))
                {
                    GameObject gHit = hit.collider.gameObject;
                    if (gHit.tag.Equals("Piece") || gHit.tag.Equals("Moving")) //if it is a piece on the board
                    {
                        if (selected == null)                                  //if nothing is selected
                        {
                            selectedRenderer          = gHit.GetComponentInChildren <Renderer>();
                            prevMaterial              = selectedRenderer.material;
                            selectedRenderer.material = selectedMaterial;
                            selected       = gHit;
                            selectCooldown = selectDelay;
                        }
                        else if (!gHit.Equals(selected))                          //if something else is selected
                        {
                            if (Deselect())
                            {
                                selectedRenderer          = gHit.GetComponentInChildren <Renderer>();
                                prevMaterial              = selectedRenderer.material;
                                selectedRenderer.material = selectedMaterial;
                                selected       = gHit;
                                selectCooldown = selectDelay;
                            }
                        }
                        else if (gHit.Equals(selected))                          //if the selected piece is selected
                        {
                            Deselect();
                        }
                    }
                    else if (gHit.tag.Equals("Tile") && selected != null)                      //after it has selected a piece, if it is selecting a tile
                    {
                        if (shelfPlace)
                        {
                            GameObject tmp = Instantiate(selected, transform);
                            tmp.transform.localPosition = gHit.transform.parent.localPosition;
                            boardManager.AddPiece(tmp);
                            Deselect();
                        }
                        else
                        {
                            PieceMover tmp;
                            if (selected.tag.Equals("Moving"))                              //if it is already moving
                            {
                                tmp = selected.GetComponent <PieceMover>();
                            }
                            else
                            {
                                tmp = selected.AddComponent <PieceMover>();
                            }
                            tmp.MoveTo(gHit.transform.parent.localPosition);

                            Deselect();
                        }
                    }
                    else if (selectCooldown <= 0)                      //if something not part of the board was hit
                    {
                        Deselect();
                    }
                }
                else if (selectCooldown <= 0)                  //if nothing was hit
                {
                    Deselect();
                }
            }             //touchphase began
            break;
        }
    }