Beispiel #1
0
 public Promotion(int t) : base()
 {
     //Tham số t truyền vào là lượt đi của quân phong cờ
     //t chẵn là quân Trắng, t lẻ là quân Đen
     InitializeComponent();
     //Load icon của form
     Icon = Icon.ExtractAssociatedIcon(Environment.CurrentDirectory + "\\img\\logo.ico");
     //Gán promo là this để có thể truy xuất trong hàm static
     promo = this;
     //Xóa lựa chọn trước đó nếu có
     if (tmp != null)
     {
         tmp.Dispose();
         tmp = new AbstractChessPiece();
     }
     //Khởi tạo 4 lựa chọn quân cờ
     AbstractChessPiece[] p = new AbstractChessPiece[4];
     p[0] = new Queen(0, 0, t);
     p[1] = new Rook(0, 1, t);
     p[2] = new Bishop(0, 2, t);
     p[3] = new Knight(0, 3, t);
     for (int i = 0; i < 4; i++)
     {
         p[i].Location    = new Point(3 + i * AbstractChessPiece.piece_size, 3);
         p[i].MouseClick += AbstractChessPiece_Click;
         p[i].MouseClick -= Form1.AbstractChessPiece_Click;
         Controls.Add(p[i]);
     }
 }
Beispiel #2
0
        //Nhóm hàm protected
        #region Nhóm hàm protected

        //Lê Thanh Tâm + Nguyễn Quang Thạch + Huỳnh Viết Thám
        //Di chuyển quân cờ P đến vị trí hiện tại
        protected void MoveFromP(ref AbstractChessPiece p)
        {
            string movement = "";

            //Nếu quân cờ P không phải là chốt, vì trong quy ước ghi biên bản, chốt không ghi tên
            if (p.cName.Substring(1, 1) != "P")
            {
                movement = p.cName.Substring(1, 1);
            }
            //Bổ sung quân cờ đi
            movement += Convert.ToChar(97 + p.column).ToString() + (p.row + 1).ToString();
            //Cộng điểm từ quân cờ bị ăn
            player[turn % 2].score += cScore;
            //Nếu ăn được quân đối phương (không phải là di chuyển đến ô trống)
            if (cScore != 0)
            {
                //Kí hiệu của nước đi ăn quân là chữ x
                movement += "x";
                //Thêm quân cờ ăn được vào thông tin người chơi
                player[turn % 2].AddEatenPiece(this.Image, this.cName);
            }
            else
            {   //Kí hiệu nước đi di chuyển thông thường
                movement += "-";
            }
            //Bổ sung điểm đến
            movement += Convert.ToChar(97 + column).ToString() + (row + 1).ToString();
            //Hủy quân cờ hiện tại
            Dispose();
            //Di chuyển đến vị trí mới và xóa vị trí cũ
            #region Di chuyển đến vị trí mới và xóa vị trí cũ
            //Khởi tạo lại quân cờ dựa vào tên của quân cờ P
            string nc = p.cName;
            int    t  = 0;
            if (nc[0] == 'b')
            {
                t = 1;
            }
            switch (nc[1])
            {
            case 'P':
            {
                if (t == 0)
                {
                    cw[row, column] = new WhitePawn(row, column);
                }
                else
                {
                    cw[row, column] = new BlackPawn(row, column);
                }
            }; break;

            case 'R': cw[row, column] = new Rook(row, column, t);; break;

            case 'N': cw[row, column] = new Knight(row, column, t);; break;

            case 'B': cw[row, column] = new Bishop(row, column, t);; break;

            case 'Q': cw[row, column] = new Queen(row, column, t);; break;

            case 'K': cw[row, column] = new King(row, column, t);; break;
            }
            cw[row, column].moved = true;
            instance.Controls.Add(cw[row, column]);
            //Xóa quân cờ ở vị trí cũ
            p.Reset_Temp();
            int r = p.row, c = p.column;
            p.Dispose();
            cw[r, c] = new AbstractChessPiece(r, c);
            instance.Controls.Add(cw[r, c]);
            #endregion
            //Nếu quân cờ di chuyển là Vua, kiểm tra có phải thực hiện Nhập thành hay không
            if (cw[row, column].GetType() == typeof(King))
            {
                //Đo khoảng cách bước đi, nếu abs = 2 tức là Vua đã đi 2 bước ~ Nhập thành
                int n = column - p.column;
                if (n == 2)
                {
                    cw[row, 5].Dispose();
                    cw[row, 5]       = new Rook(row, 5, t);
                    cw[row, 5].moved = true;
                    instance.Controls.Add(cw[row, 5]);
                    cw[row, 7].Dispose();
                    cw[row, 7] = new AbstractChessPiece(row, 7);
                    instance.Controls.Add(cw[row, 7]);
                    movement = "O-O";
                }
                else if (n == -2)
                {
                    cw[row, 3].Dispose();
                    cw[row, 3]       = new Rook(row, 3, t);
                    cw[row, 3].moved = true;
                    instance.Controls.Add(cw[row, 3]);
                    cw[row, 0].Dispose();
                    cw[row, 0] = new AbstractChessPiece(row, 0);
                    instance.Controls.Add(cw[row, 0]);
                    movement = "O-O-O";
                }
            }
            //Nếu quân cờ di chuyển là Chốt
            else if (cw[row, column].Get_name.Substring(1, 1) == "P")
            {
                //Chốt đi tới dòng cuối cùng, Trắng đi đến dòng 7, Đen đi đến dòng 0
                if (row == ((turn + 1) % 2) * 7)
                {
                    //Hiện form lựa chọn phong cấp
                    Promotion exm = new Promotion(turn);
                    //Nếu hiện form nhưng không lựa chọn thì form liên tục mở đến khi nào chọn xong
                    while (exm.Get_typename == typeof(AbstractChessPiece).Name.ToString())
                    {
                        exm.ShowDialog();
                    }
                    //Hủy quân cờ hiện tại
                    cw[row, column].Dispose();
                    //Tái tạo quân cờ dựa trên lựa chọn
                    switch (exm.Get_typename)
                    {
                    case "Queen": cw[row, column] = new Queen(row, column, turn); break;

                    case "Rook": cw[row, column] = new Rook(row, column, turn); break;

                    case "Bishop": cw[row, column] = new Bishop(row, column, turn); break;

                    case "Knight": cw[row, column] = new Knight(row, column, turn); break;
                    }
                    //Ghi chép phong cờ là kí tự =
                    movement += "=" + cw[row, column].Get_name.Substring(1, 1);
                    instance.Controls.Add(cw[row, column]);
                }
                //Quân cờ đi là Chốt, và thuộc tính bắt chốt qua đường đang tồn tại
                else if (EP != null)
                {
                    //Kiểm tra xem có phải Chốt vừa thực hiện bắt chốt qua đường hay không
                    //Vì bản chất Chốt đi thẳng, ăn chéo nên phức tạp hơn
                    if (column == EP.y && Math.Abs(row - EP.x) == 1 && (p.row - EP.x == 0) && (Math.Abs(p.column - EP.y) == 1))
                    {
                        player[turn % 2].AddEatenPiece(cw[EP.x, EP.y].Image, cw[EP.x, EP.y].cName);
                        player[turn % 2].score += cw[EP.x, EP.y].cScore;
                        cw[EP.x, EP.y].Dispose();
                        cw[EP.x, EP.y] = new AbstractChessPiece(EP.x, EP.y);
                        instance.Controls.Add(cw[EP.x, EP.y]);
                        movement += "x";
                    }
                }
            }
            //Quân cờ thực hiện bắt chốt qua đường hay không cũng xem như là không còn khả năng bắt chốt qua đường nữa
            EP = null;
            //Nếu chốt khởi đầu đi 2 bước
            if (cw[row, column].Get_name.Substring(1, 1) == "P" && (Math.Abs(row - p.row) == 2))
            {
                EP = new Piece(row, column);
            }
            //Ghi chép vào nhật kí
            instance.lbHistory.Items.Add(movement);
            instance.lbHistory.TopIndex = instance.lbHistory.Items.Count - 1;
        }