コード例 #1
0
ファイル: GameManager.cs プロジェクト: Startick28/ARChess
    public void MakeMove(Vector2 pos)
    {
        // Si le move est autorisé :
        GameManager.ChessPieces[][] board_t = new GameManager.ChessPieces[8][];
        for (int k = 0; k < 8; k++)
        {
            board_t[k] = new GameManager.ChessPieces[8];
            for (int n = 0; n < 8; n++)
            {
                board_t[k][n] = currentBoard[k][n];
            }
        }
        board_t[(int)currentSelectedPiece.position.x][(int)currentSelectedPiece.position.y] = 0;
        board_t[(int)pos.x][(int)pos.y] = currentSelectedPiece.pieceType;

        if ((playerPlaying == Player.White && rules.IsCheck(board_t) != 1 || playerPlaying == Player.Black && rules.IsCheck(board_t) != 2) && rules.IsCheck(board_t) != 3)
        {
            currentBoard[(int)currentSelectedPiece.position.x][(int)currentSelectedPiece.position.y] = 0;
            currentSelectedPiece.position        = pos;
            currentBoard[(int)pos.x][(int)pos.y] = currentSelectedPiece.pieceType;

            Vector3 tmp = GetPosition((int)pos.x, (int)pos.y);

            currentSelectedPiece.gameObject.transform.localPosition = new Vector3(tmp.x, currentSelectedPiece.gameObject.transform.localPosition.y, tmp.z);

            playerPlaying   = 1 - playerPlaying;
            playerText.text = playerPlaying == Player.White ? "White to play" : "Black to play";

            // Si on a win
            //    finalText.text = playerPlaying == Player.White ? "CheckMate\\Black Won" : "CheckMate\\White Won";
            //    finalText.gameObject.SetActive(true);
            //    button1.SetActive(true);
            //    button2.SetActive(true);
        }

        else
        {
            StartCoroutine(FadingPopup());
        }
    }
コード例 #2
0
ファイル: ChessRules.cs プロジェクト: Startick28/ARChess
    public int IsMate(GameManager.ChessPieces[][] board)
    {
        int mate  = 0;
        int mate2 = 0;

        GameManager.ChessPieces[][] board_t = new GameManager.ChessPieces[8][];
        for (int k = 0; k < 8; k++)
        {
            board_t[k] = new GameManager.ChessPieces[8];
            for (int n = 0; n < 8; n++)
            {
                board_t[k][n] = GameManager.instance.currentBoard[k][n];
            }
        }

        List <Vector2> l     = new List <Vector2>();
        ChessPiece     piece = new ChessPiece(board[0][0], new Vector2(0, 0));

        // White mated
        mate = 1;
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (mate == 1)
                {
                    piece.position  = new Vector2(i, j);
                    piece.pieceType = board[i][j];

                    if (IsWhite(piece.pieceType))
                    {
                        l = PossibleMoves(piece, board);
                        for (int k = 0; k < l.Count; k++)
                        {
                            board_t[(int)l[k].x][(int)l[k].y] = piece.pieceType;
                            board_t[i][j] = GameManager.ChessPieces.Void;

                            if (IsCheck(board_t) != 1)
                            {
                                mate = 0;
                                board_t[(int)l[k].x][(int)l[k].y] = board[(int)l[k].x][(int)l[k].y];
                                board_t[i][j] = piece.pieceType;
                            }

                            board_t[(int)l[k].x][(int)l[k].y] = board[(int)l[k].x][(int)l[k].y];
                            board_t[i][j] = piece.pieceType;
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }

        // Black mated
        mate2 = 2;
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (mate2 == 2)
                {
                    piece.position  = new Vector2(i, j);
                    piece.pieceType = board[i][j];

                    if (!IsWhite(piece.pieceType))
                    {
                        l = PossibleMoves(piece, board);
                        for (int k = 0; k < l.Count; k++)
                        {
                            board_t[(int)l[k].x][(int)l[k].y] = piece.pieceType;
                            board_t[i][j] = GameManager.ChessPieces.Void;

                            if (IsCheck(board_t) != 2)
                            {
                                mate2 = 0;
                            }

                            board_t[(int)l[k].x][(int)l[k].y] = board[(int)l[k].x][(int)l[k].y];
                            board_t[i][j] = piece.pieceType;
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }

        return(mate + mate2);
    }
コード例 #3
0
ファイル: ChessRules.cs プロジェクト: Startick28/ARChess
 public bool IsWhite(GameManager.ChessPieces piece)
 {
     return(1 <= (int)piece && (int)piece <= 6);
 }
コード例 #4
0
ファイル: ChessRules.cs プロジェクト: Startick28/ARChess
    public List <Vector2> PossibleMoves(ChessPiece piece, GameManager.ChessPieces[][] board_alt)
    {
        List <Vector2> l = new List <Vector2>();
        int            x = (int)piece.position.x;
        int            y = (int)piece.position.y;


        switch (piece.pieceType)
        {
        case GameManager.ChessPieces.WhitePawn:
            // Diagonal Left
            if (x != 0 && y != 7)
            {
                if (board_alt[x - 1][y + 1] != 0 && !IsWhite(board_alt[x - 1][y + 1]))
                {
                    l.Add(new Vector2(x - 1, y + 1));
                }
            }
            // Diagonal Right
            if (x != 7 && y != 7)
            {
                if (board_alt[x + 1][y + 1] != 0 && !IsWhite(board_alt[x + 1][y + 1]))
                {
                    l.Add(new Vector2(x + 1, y + 1));
                }
            }

            // Forward
            if (y != 7)
            {
                if (board_alt[x][y + 1] == 0)
                {
                    l.Add(new Vector2(x, y + 1));
                }
            }
            // Two Steps Forward
            if (y == 1)
            {
                if (board_alt[x][y + 1] == 0 && board_alt[x][y + 2] == 0)
                {
                    l.Add(new Vector2(x, y + 2));
                }
            }
            break;

        case GameManager.ChessPieces.BlackPawn:
            // Diagonal Left
            if (x != 0 && y != 0)
            {
                if (board_alt[x - 1][y - 1] != 0 && IsWhite(board_alt[x - 1][y - 1]))
                {
                    l.Add(new Vector2(x - 1, y - 1));
                }
            }
            // Diagonal Right
            if (x != 7 && y != 0)
            {
                if (board_alt[x + 1][y - 1] != 0 && IsWhite(board_alt[x + 1][y - 1]))
                {
                    l.Add(new Vector2(x + 1, y - 1));
                }
            }

            // Forward
            if (y != 0)
            {
                if (board_alt[x][y - 1] == 0)
                {
                    l.Add(new Vector2(x, y - 1));
                }
            }
            // Two Steps Forward
            if (y == 6)
            {
                if (board_alt[x][y - 1] == 0 && board_alt[x][y - 2] == 0)
                {
                    l.Add(new Vector2(x, y - 2));
                }
            }
            break;


        case GameManager.ChessPieces.WhiteBishop:
        case GameManager.ChessPieces.BlackBishop:

            // Top Left
            int x_t = x;
            int y_t = y;
            while (true)
            {
                x_t--;
                y_t++;
                if (x_t < 0 || y_t >= 8)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            // Top Right
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t++;
                y_t++;
                if (x_t >= 8 || y_t >= 8)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            // Bottom Left
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t--;
                y_t--;
                if (x_t < 0 || y_t < 0)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            // Bottom Right
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t++;
                y_t--;
                if (x_t >= 8 || y_t < 0)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            break;

        case GameManager.ChessPieces.WhiteKnight:
        case GameManager.ChessPieces.BlackKnight:

            List <Vector2> l_t = new List <Vector2>();

            // Up  Left

            l_t.Add(new Vector2(x - 1, y + 2));
            l_t.Add(new Vector2(x - 2, y + 1));

            // Up  Right

            l_t.Add(new Vector2(x + 1, y + 2));
            l_t.Add(new Vector2(x + 2, y + 1));

            // Down  Left

            l_t.Add(new Vector2(x - 1, y - 2));
            l_t.Add(new Vector2(x - 2, y - 1));

            // Down  Right

            l_t.Add(new Vector2(x + 1, y - 2));
            l_t.Add(new Vector2(x + 2, y - 1));


            for (int i = 0; i < 8; i++)
            {
                if ((int)l_t[i].x >= 0 && (int)l_t[i].x < 8 && (int)l_t[i].y >= 0 && (int)l_t[i].y < 8)
                {
                    if (board_alt[(int)l_t[i].x][(int)l_t[i].y] == 0)
                    {
                        l.Add(new Vector2((int)l_t[i].x, (int)l_t[i].y));
                    }
                    else
                    {
                        if (IsWhite(piece.pieceType) != IsWhite(board_alt[(int)l_t[i].x][(int)l_t[i].y]))
                        {
                            l.Add(new Vector2((int)l_t[i].x, (int)l_t[i].y));
                        }
                    }
                }
            }
            break;


        case GameManager.ChessPieces.WhiteRook:
        case GameManager.ChessPieces.BlackRook:
            // Left
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t--;
                if (x_t < 0)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y]))
                    {
                        l.Add(new Vector2(x_t, y));
                    }
                    break;
                }
            }

            // Right
            x_t = x;
            while (true)
            {
                x_t++;
                if (x_t >= 8)
                {
                    break;
                }
                if (board_alt[x_t][y] == 0)
                {
                    l.Add(new Vector2(x_t, y));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y]))
                    {
                        l.Add(new Vector2(x_t, y));
                    }
                    break;
                }
            }

            // Bottom
            while (true)
            {
                y_t--;
                if (y_t < 0)
                {
                    break;
                }
                if (board_alt[x][y_t] == 0)
                {
                    l.Add(new Vector2(x, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x][y_t]))
                    {
                        l.Add(new Vector2(x, y_t));
                    }
                    break;
                }
            }

            // Up
            y_t = y;
            while (true)
            {
                y_t++;
                if (y_t >= 8)
                {
                    break;
                }
                if (board_alt[x][y_t] == 0)
                {
                    l.Add(new Vector2(x, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x][y_t]))
                    {
                        l.Add(new Vector2(x, y_t));
                    }
                    break;
                }
            }
            break;


        case GameManager.ChessPieces.WhiteQueen:
        case GameManager.ChessPieces.BlackQueen:

            // Bishop + Rook

            // Top Left
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t--;
                y_t++;
                if (x_t < 0 || y_t >= 8)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            // Top Right
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t++;
                y_t++;
                if (x_t >= 8 || y_t >= 8)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            // Bottom Left
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t--;
                y_t--;
                if (x_t < 0 || y_t < 0)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }

            // Bottom Right
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t++;
                y_t--;
                if (x_t >= 8 || y_t < 0)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y_t]))
                    {
                        l.Add(new Vector2(x_t, y_t));
                    }
                    break;
                }
            }
            // Left
            x_t = x;
            y_t = y;
            while (true)
            {
                x_t--;
                if (x_t < 0)
                {
                    break;
                }
                if (board_alt[x_t][y_t] == 0)
                {
                    l.Add(new Vector2(x_t, y));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y]))
                    {
                        l.Add(new Vector2(x_t, y));
                    }
                    break;
                }
            }

            // Right
            x_t = x;
            while (true)
            {
                x_t++;
                if (x_t >= 8)
                {
                    break;
                }
                if (board_alt[x_t][y] == 0)
                {
                    l.Add(new Vector2(x_t, y));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x_t][y]))
                    {
                        l.Add(new Vector2(x_t, y));
                    }
                    break;
                }
            }

            // Bottom
            while (true)
            {
                y_t--;
                if (y_t < 0)
                {
                    break;
                }
                if (board_alt[x][y_t] == 0)
                {
                    l.Add(new Vector2(x, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x][y_t]))
                    {
                        l.Add(new Vector2(x, y_t));
                    }
                    break;
                }
            }

            // Up
            y_t = y;
            while (true)
            {
                y_t++;
                if (y_t >= 8)
                {
                    break;
                }
                if (board_alt[x][y_t] == 0)
                {
                    l.Add(new Vector2(x, y_t));
                }
                else
                {
                    if (IsWhite(piece.pieceType) != IsWhite(board_alt[x][y_t]))
                    {
                        l.Add(new Vector2(x, y_t));
                    }
                    break;
                }
            }

            break;

        case GameManager.ChessPieces.WhiteKing:
        case GameManager.ChessPieces.BlackKing:

            l_t = new List <Vector2>();

            // Up  Left
            l_t.Add(new Vector2(x - 1, y + 1));

            // Up
            l_t.Add(new Vector2(x, y + 1));

            // Up  Right
            l_t.Add(new Vector2(x + 1, y + 1));

            // Right
            l_t.Add(new Vector2(x + 1, y));

            // Down  Right
            l_t.Add(new Vector2(x + 1, y - 1));

            // Down
            l_t.Add(new Vector2(x, y - 1));

            // Down  Left
            l_t.Add(new Vector2(x - 1, y - 1));

            // Left
            l_t.Add(new Vector2(x - 1, y));


            for (int i = 0; i < 8; i++)
            {
                if ((int)l_t[i].x >= 0 && (int)l_t[i].x < 8 && (int)l_t[i].y >= 0 && (int)l_t[i].y < 8)
                {
                    if (board_alt[(int)l_t[i].x][(int)l_t[i].y] == 0)
                    {
                        l.Add(new Vector2((int)l_t[i].x, (int)l_t[i].y));
                    }
                    else
                    {
                        if (IsWhite(piece.pieceType) != IsWhite(board_alt[(int)l_t[i].x][(int)l_t[i].y]))
                        {
                            l.Add(new Vector2((int)l_t[i].x, (int)l_t[i].y));
                        }
                    }
                }
            }

            // Castle handling

            GameManager.ChessPieces[][] board_t = new GameManager.ChessPieces[8][];
            for (int k = 0; k < 8; k++)
            {
                board_t[k] = new GameManager.ChessPieces[8];
                for (int n = 0; n < 8; n++)
                {
                    board_t[k][n] = board_alt[k][n];
                }
            }


            bool castle_possible = true;
            if (IsWhite(piece.pieceType))
            {
                if (!whiteKmoved && !whiteR1moved)
                {
                    if (board_t[1][0] == GameManager.ChessPieces.Void &&
                        board_t[2][0] == GameManager.ChessPieces.Void &&
                        board_t[3][0] == GameManager.ChessPieces.Void)
                    {
                        for (int k = 0; k < 3; k++)
                        {
                            board_t[k][0] = GameManager.ChessPieces.WhiteKing;
                            if (IsCheck(board_t) > 0)
                            {
                                castle_possible = false;
                            }
                        }
                        if (castle_possible)
                        {
                            l.Add(new Vector2(2, 0));
                        }
                    }

                    castle_possible = true;
                }
                if (!whiteKmoved && !whiteR2moved)
                {
                    if (board_t[5][0] == GameManager.ChessPieces.Void &&
                        board_t[6][0] == GameManager.ChessPieces.Void)
                    {
                        for (int k = 5; k < 7; k++)
                        {
                            board_t[k][0] = GameManager.ChessPieces.WhiteKing;
                            if (IsCheck(board_t) > 0)
                            {
                                castle_possible = false;
                            }
                        }
                        if (castle_possible)
                        {
                            l.Add(new Vector2(6, 0));
                        }
                    }
                    castle_possible = true;
                }
            }

            if (!IsWhite(piece.pieceType))
            {
                if (!blackKmoved && !blackR1moved)
                {
                    if (board_t[1][7] == GameManager.ChessPieces.Void &&
                        board_t[2][7] == GameManager.ChessPieces.Void &&
                        board_t[3][7] == GameManager.ChessPieces.Void)
                    {
                        for (int k = 0; k < 3; k++)
                        {
                            board_t[k][7] = GameManager.ChessPieces.BlackKing;
                            if (IsCheck(board_t) > 0)
                            {
                                castle_possible = false;
                            }
                        }
                        if (castle_possible)
                        {
                            l.Add(new Vector2(2, 7));
                        }
                    }
                    castle_possible = true;
                }
                if (!blackKmoved && !blackR2moved)
                {
                    if (board_t[5][7] == GameManager.ChessPieces.Void &&
                        board_t[6][7] == GameManager.ChessPieces.Void)
                    {
                        for (int k = 5; k < 7; k++)
                        {
                            board_t[k][7] = GameManager.ChessPieces.BlackKing;
                            if (IsCheck(board_t) > 0)
                            {
                                castle_possible = false;
                            }
                        }
                        if (castle_possible)
                        {
                            l.Add(new Vector2(6, 7));
                        }
                    }
                    castle_possible = true;
                }
            }

            break;
        }
        return(l);
    }
コード例 #5
0
 public ChessPiece(GameManager.ChessPieces pieceT, Vector2 pos)
 {
     pieceType = pieceT;
     position  = pos;
 }