예제 #1
0
 void setPiece(ChessPiece3D p, int x, int y)
 {
     pieces[y * 8 + x] = p;
     if (p != null)
         pieces[y * 8 + x].Pos2D = new Vector2(x, y);
 }
예제 #2
0
 void setPiece(ChessPiece3D p, Vector2 pos)
 {
     pieces[(int)(pos.Y * 8 + pos.X)] = p;
     if (p != null)
         pieces[(int)(pos.Y * 8 + pos.X)].Pos2D = pos;
 }
예제 #3
0
        public override int Update(GameTime gameTime)
        {
            int hPos = -1;
            int sPos = -1;
            bool moved = false;

            if (!isBattle && !isPromote) // Chưa có đánh nhau va chua co thang cap
                ms = Mouse.GetState();

            if (!isClicked)
            {
                if (ms.X >= 0 && ms.X < Util.screenWidth && ms.Y >= 0 && ms.Y < Util.screenHeight)
                {
                    if (!surrender.Update(gameTime))
                        return (turn + 1) % 2 + 1;

                    if (!back.Update(gameTime))
                        return 6;

                    Color[] data = new Color[Util.screenWidth * Util.screenHeight];

                    mainRenderTarget.GetData<Color>(data);
                    Color c = data[ms.Y * Util.screenWidth + ms.X];
                    hoverPos = getPosFromColorDepth(c); // Vị trí tương ứng trên bàn cờ dc chọn

                    hPos = (int)(hoverPos.Y * 8 + hoverPos.X);

                    if (ms.LeftButton == ButtonState.Pressed) // Nếu có click chuột
                    {
                        sPos = hPos;
                        if (lstNewPos.Count + lstDie.Count + lstSpecial.Count != 0) // Có con cờ đang được chọn
                        {
                            foreach (Vector2 p in lstNewPos) // Duyệt toàn bộ các vị trí có thể di chuyển đến
                                if ((int)p.X == (int)hoverPos.X && (int)p.Y == (int)hoverPos.Y) // Nếu vị trí click chuột nằm trong ds vị trí này thì ok, chạy tới đó
                                {
                                    if (passant == 1) // Con chốt di chuyển đầu tiên
                                        passantX = (int)p.X;

                                    movePiece(selectingPos, p);

                                    moved = true;
                                    if (checkCheck(p)) // Con vua đối phương bị check
                                    {
                                        checkPos = kingPos;
                                        chekedSide = selectingPiece.Side == Util.PieceSide.White ? 1 : 2;
                                    }
                                    else
                                    {
                                        checkPos = new Vector2(-1, -1);
                                        chekedSide = 0;
                                    }

                                    selectingPiece = null;
                                    selectingPos = new Vector2(-1, -1);

                                    lstNewPos.Clear();
                                    lstDie.Clear();
                                    lstSpecial.Clear();
                                    break;
                                }
                            foreach (Vector2 p in lstDie) // Duyệt các con có thể ăn được
                                if ((int)p.X == (int)hoverPos.X && (int)p.Y == (int)hoverPos.Y) // Nếu vị trí click chuột nằm trong ds vị trí này thì ok, phang nó
                                {
                                    ChessPiece3D t = getPiece(p);
                                    if (t.Type == Util.PieceType.King) // Con bị ăn là con vua
                                        testWin = true;

                                    killPiece(selectingPos, p);

                                    if (isBattle) // Đánh nhau
                                    {
                                        return 4;
                                    }

                                    if (testWin && winSide == turn % 2) // Con vua đối phương bị ăn
                                        return turn % 2 + 1;

                                    moved = true;
                                    if (checkCheck(p)) // Con vua đối phương bị check
                                    {
                                        checkPos = kingPos;
                                        chekedSide = selectingPiece.Side == Util.PieceSide.White ? 1 : 2;
                                    }
                                    else
                                    {
                                        checkPos = new Vector2(-1, -1);
                                        chekedSide = 0;
                                    }

                                    selectingPiece = null;
                                    selectingPos = new Vector2(-1, -1);

                                    lstNewPos.Clear();
                                    lstDie.Clear();
                                    lstSpecial.Clear();

                                    break;
                                }
                            foreach (Vector2 p in lstSpecial) // Duyệt các vị trí có thể di chuyển đặc biệt
                                if ((int)p.X == (int)hoverPos.X && (int)p.Y == (int)hoverPos.Y) // Nếu vị trí click chuột nằm trong ds vị trí này thì ok
                                {
                                    moved = true;
                                    switch (moveSpecial)
                                    {
                                        case Util.MoveSpecial.Castling:
                                            movePiece(selectingPos, p);
                                            if ((int)p.X == 1)
                                            {
                                                movePiece(0, (int)p.Y, 2, (int)p.Y);
                                                if (checkCheck(new Vector2(4, p.Y))) // Con vua đối phương bị check
                                                    checkPos = kingPos;
                                                else
                                                    checkPos = new Vector2(-1, -1);
                                            }
                                            else
                                            {
                                                movePiece(7, (int)p.Y, 4, (int)p.Y);

                                                if (checkCheck(new Vector2(4, p.Y))) // Con vua đối phương bị check
                                                    checkPos = kingPos;
                                                else
                                                    checkPos = new Vector2(-1, -1);
                                            }
                                            break;
                                        case Util.MoveSpecial.EnPassant:
                                            if (selectingPiece.Side == Util.PieceSide.White)
                                            {
                                                killPiece(selectingPos, new Vector2(p.X, p.Y - 1));
                                                if (isBattle) // Đánh nhau
                                                {
                                                    return 4;
                                                }
                                                movePiece(new Vector2(p.X, p.Y - 1), p);
                                                //removePiece((int)p.X, (int)p.Y - 1);
                                            }
                                            else
                                            {
                                                killPiece(selectingPos, new Vector2(p.X, p.Y + 1));
                                                if (isBattle) // Đánh nhau
                                                {
                                                    return 4;
                                                }
                                                movePiece(new Vector2(p.X, p.Y + 1), p);
                                                //removePiece((int)p.X, (int)p.Y + 1);
                                            }
                                            //movePiece(selectingPos, p);
                                            break;
                                        case Util.MoveSpecial.Promotion:

                                            Util.PieceType tmp = getPromotion();

                                            if (isPromote) // Thang cap
                                                return 5;

                                            if (getPiece(hoverPos) != null)
                                                movePiece(selectingPos, p);
                                            else
                                                killPiece(selectingPos, p);

                                            moved = true;

                                            switch (tmp)
                                            {
                                                case Util.PieceType.Bishop:
                                                    setPiece(new Bishop(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p);
                                                    break;
                                                case Util.PieceType.Knight:
                                                    setPiece(new Knight(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p);
                                                    break;
                                                case Util.PieceType.Queen:
                                                    setPiece(new Queen(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p);
                                                    break;
                                                case Util.PieceType.Rook:
                                                    setPiece(new Rook(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p);
                                                    break;
                                            }

                                            break;
                                    }

                                    if (checkCheck(p)) // Con vua đối phương bị check
                                    {
                                        checkPos = kingPos;
                                        chekedSide = selectingPiece.Side == Util.PieceSide.White ? 1 : 2;
                                    }
                                    else
                                    {
                                        checkPos = new Vector2(-1, -1);
                                        chekedSide = 0;
                                    }

                                    selectingPiece = null;
                                    selectingPos = new Vector2(-1, -1);

                                    lstNewPos.Clear();
                                    lstDie.Clear();
                                    lstSpecial.Clear();
                                    break;
                                }
                        }
                    }
                }
            }

            for (int i = 0; i < 64; ++i)
            {
                if (pieces[i] != null) // có con cờ tại vị trí đang xét
                {
                    if (pieces[i].Type == Util.PieceType.King && (pieces[i].Side == Util.PieceSide.Black) == (turn % 2 == 0))
                        kingPos = new Vector2(i % 8, i / 8);
                    if (i == hPos) // Con cờ đang xét trùng với vị trí đang hover chuột
                        if (i == sPos) // Có sự click tại đây
                            if (moved) // Nếu là con cờ vừa di chuyển tới nơi thì Normal
                            {
                                pieces[i].State = ChessPiece3D.PieceState.Normal;
                                ++turn;
                                if (passant == 1)
                                    passant = 2;
                                else
                                    passant = 0;
                            }
                            else
                            {
                                if (turn % 2 == 0 && pieces[i].Side == Util.PieceSide.White || turn % 2 != 0 && pieces[i].Side == Util.PieceSide.Black) // Xét lượt đánh hợp lệ
                                {
                                    pieces[i].State = ChessPiece3D.PieceState.Click;
                                    selectingPiece = pieces[i];
                                    selectingPos = pieces[i].Pos2D;
                                    getNextPos(i);
                                }
                                else
                                    pieces[i].State = ChessPiece3D.PieceState.Normal;
                            }
                        else
                            pieces[i].State = ChessPiece3D.PieceState.Hover;
                    else
                        pieces[i].State = ChessPiece3D.PieceState.Normal;
                    pieces[i].Update(gameTime);
                }
            }

            isClicked = (ms.LeftButton == ButtonState.Pressed);

            camera.Update(gameTime);
            return 0;
        }