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]); } }
//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; }