示例#1
0
    private Square GetMouseSquare()
    {
        if (!Camera.main)
        {
            return(null);
        }

        RaycastHit hit;

        if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity, LayerMask.GetMask("Board")))
        {
            int x = (int)Mathf.Floor((hit.point.x - boardCenter.x) / tileSize) + 4, y = (int)Mathf.Floor((hit.point.z - boardCenter.z) / tileSize) + 4;
            return((Square.Exists(x, y)) ? Square.At(x, y) : null);
        }

        return(null);
    }
示例#2
0
文件: King.cs 项目: jaraki/Chess
 private bool CanQueensideCastle() {
     bool overAndIntoCheck = false;
     foreach (Piece p in Board.instance.GetOpposingPieces(color)) {
         foreach (Board.Move move in p.GetAvailableMoves(Board.instance.GetBoard())) {
             Board.Square s = (color == Color.white ? Board.instance.GetSquare(0, 1) : Board.instance.GetSquare(7, 1));
             Board.Square s2 = (color == Color.white ? Board.instance.GetSquare(0, 2) : Board.instance.GetSquare(7, 2));
             Board.Square s3 = (color == Color.white ? Board.instance.GetSquare(0, 3) : Board.instance.GetSquare(7, 3));
             if ((move.file == s.file && move.rank == s.rank) || (move.file == s2.file && move.rank == s2.rank) || (move.file == s3.file && move.rank == s3.rank)) {
                 overAndIntoCheck = true;
             }
         }
     }
     return !overAndIntoCheck && moveHistory.Count == 0 && checkCount == 0 && (color == Color.white ? Board.instance.GetSquare(0, 1).piece == null : Board.instance.GetSquare(7, 1).piece == null)
         && (color == Color.white ? Board.instance.GetSquare(0, 2).piece == null : Board.instance.GetSquare(7, 2).piece == null)
         && (color == Color.white ? Board.instance.GetSquare(0, 3).piece == null : Board.instance.GetSquare(7, 3).piece == null)
         && (color == Color.white ? Board.instance.GetSquare(0, 0).piece != null && Board.instance.GetSquare(0, 0).piece.moveHistory.Count == 0 :
         Board.instance.GetSquare(7, 0).piece != null && Board.instance.GetSquare(7, 0).piece.moveHistory.Count == 0);
 }
示例#3
0
    private void Take(Square square)
    {
        GamePiece g = Get(square);

        Set(square, null);
        g.Highlight(false);
        if (g.color == PieceColor.White)
        {
            int index = whitePiecesTaken.Count(x => x != null);
            whitePiecesTaken[index] = g;
            g.Move(GetSquareCenter(square), whiteGraveyard.GetChild(index).position);
        }
        else
        {
            int index = blackPiecesTaken.Count(x => x != null);
            blackPiecesTaken[index] = g;
            g.Move(GetSquareCenter(square), blackGraveyard.GetChild(index).position);
        }
    }
示例#4
0
    /*
     * private Vector3 GetSquareCenter(Square square, bool local = false)
     * {
     *  return (local) ? tileRight * (square.file + 0.5f) + tileForward * (square.rank + 0.5f) : boardCenter + tileRight * (square.file - 3.5f) + tileForward * (square.rank - 3.5f);
     * }
     */

    private Vector3 GetSquareCenter(Square square)
    {
        return(boardCenter + tileRight * (square.file - 3.5f) + tileForward * (square.rank - 3.5f));
    }
示例#5
0
 private void Set(Square square, GamePiece piece)
 {
     gamePieces[8 * square.rank + square.file] = piece;
 }
示例#6
0
 private GamePiece Get(Square square)
 {
     return(gamePieces[8 * square.rank + square.file]);
 }
示例#7
0
    void Update()
    {
        if (updateSceneCoroutine != null || board.status != BoardStatus.Playing || resigned)
        {
            return;
        }

        if (playerAI != null && playerAI.color == board.whoseTurn)
        {
#if UNITY_WEBGL || UNITY_EDITOR
            if (!findingMove)
            {
                playerAI.FindMove(new Board(board));
                findingMove = true;
            }
            else if (!playerAI.isCalculating)
            {
                findingMove = false;
#else
            if (playerAIThread == null)
            {
                playerAIThread = new Thread(new ParameterizedThreadStart(playerAI.FindMove));
                playerAIThread.Start(new Board(board));
            }
            else if (!playerAIThread.IsAlive)
            {
                playerAIThread = null;
#endif
                Move move    = playerAI.foundMove;
                bool success = board.MakeMove(move);
                Debug.Assert(success);

                UpdateScene((board.sideEffect != null) ? new List <Move>()
                {
                    move, board.sideEffect.Value
                } : new List <Move>()
                {
                    move
                });
            }
        }
        else
        {
            mouseSquare = GetMouseSquare();

            if (Input.GetMouseButtonDown(0))
            {
                if (mouseSquare != null)
                {
                    if (selectedSquare == null) // clicked on the board, but no previously selected square
                    {
                        GamePiece g = Get(mouseSquare);
                        if (g != null && g.color == board.whoseTurn) // only select if it's one of the current player's pieces
                        {
                            Square temp = mouseSquare;
                            mouseSquare    = null; // remove highlight before selecting
                            selectedSquare = temp;
                        }
                    }
                    else if (mouseSquare == selectedSquare)
                    {
                        selectedSquare = null;
                        mouseSquare    = null; // ensures the piece at mouseSquare can be re-highlighted on next update (after piece is finished moving)
                    }
                    else // the player has attempted to make a move
                    {
                        Move move = new Move(selectedSquare, mouseSquare);
                        if (board.MakeMove(move))
                        {
                            selectedSquare = null;
                            mouseSquare    = null; // ensures the piece at mouseSquare can be re-highlighted on next update (after piece is finished moving)

                            GamePiece g = Get(move.from), h = Get(move.to);
                            g.transform.position = GetSquareCenter(move.to);
                            if (h != null)
                            {
                                Take(move.to);
                                waitForPiecesCoroutine = StartCoroutine(WaitForPiecesRoutine(new List <GamePiece>()
                                {
                                    g, h
                                }));
                            }
                            else
                            {
                                waitForPiecesCoroutine = StartCoroutine(WaitForPiecesRoutine(new List <GamePiece>()
                                {
                                    g
                                }));
                            }
                            Set(move.from, null);
                            Set(move.to, g);

                            UpdateScene((board.sideEffect != null) ? new List <Move>()
                            {
                                board.sideEffect.Value
                            } : null);
                        }
                    }
                }
            }
        }
    }
示例#8
0
 // Update is called once per frame
 void Update()
 {
     if (Input.GetKeyDown(KeyCode.Escape))
     {
         SceneManager.LoadScene("Menu");
     }
     if (Input.GetMouseButtonDown(0))
     {
         RaycastHit hitInfo = new RaycastHit();
         bool       hit     = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo);
         if (hit)
         {
             if (hitInfo.transform.gameObject.tag == "Piece")
             {
                 if (selected)
                 {
                     selected.GetComponent <Light>().enabled = false;
                 }
                 selected      = hitInfo.transform.gameObject;
                 selectedPiece = selected.GetComponent <Piece>();
                 if (selectedPiece.color != turnColor)
                 {
                     return;
                 }
                 Board.instance.ClearMoves();
                 King k = Board.instance.GetKing(turnColor);
                 foreach (Board.Move m in selectedPiece.GetAvailableMoves(Board.instance.GetBoard()))
                 {
                     if (k.CheckForCheck(Board.instance.GetBoard()))
                     {
                         if (k.checkCount > 1)
                         {
                             selectedPiece = k;
                             break;
                         }
                         List <Board.Move> blocks = GetBlocks();
                         foreach (Board.Move block in blocks)
                         {
                             if (m.piece == selectedPiece)
                             {
                                 Board.instance.CreateMove(m.file, m.rank);
                             }
                         }
                     }
                     else
                     {
                         checkText.text = "";
                         Board.instance.CreateMove(m.file, m.rank);
                     }
                 }
                 hitInfo.transform.GetComponent <Light>().enabled = true;
             }
             else if (hitInfo.transform.gameObject.tag == "Move")
             {
                 Board.Square square = Board.instance.GetSquareFromString(hitInfo.transform.parent.name);
                 Board.instance.MakeMove(new Board.Move(square.file, square.rank, selectedPiece), selected);
                 Board.instance.GetKing(turnColor).checkCount = 0;
                 SwitchTurns();
                 StartCoroutine(RotateCamera(selectedPiece.color == Color.white));
             }
         }
     }
 }