private void picDisks_Click(object sender, EventArgs e) { try { PictureBox ClickedDisks = (PictureBox)sender; //sender lúc này 9 là picturebox ứng với đĩa được nhấn if (DisksRodA.Contains(ClickedDisks)) //Kiểm tra đĩa đang thuộc tập đĩa nào -> kiếm ->Dùng phương thức contains truyền vào đĩa được nhấn { picTower_Click(picTowerA, new EventArgs());// nếu đĩa được nhấn nằm ở cọc A -> Gọi lại phương thức xử lí sự kiện click cho cọc A } else if (DisksRodB.Contains(ClickedDisks)) { picTower_Click(picTowerB, new EventArgs()); } else { picTower_Click(picTowerC, new EventArgs()); } }catch (InvalidCastException a) { MessageBox.Show("Click chính xác vô bạn ei", "Thông báo", MessageBoxButtons.OK); } }
private void btnPlay_Click(object sender, EventArgs e) { //reset tmrCountTime.Stop(); // ->Khi bấm vào thì những trạng thái đang dùng trước đó sẽ trả về ban đầu // -> Để người dùng có thể bắt đầu chơi lại 1 game mới tmrAnimation.Enabled = false; btnAuto.Enabled = true; rtbLog.Text = "Đồ án 1 - Poon & Thanh Tuấn"; foreach (PictureBox disk in disks) { disk.Visible = false; // trả về trạng thái ban đầu -> ẩn các đĩa -> Tính đa hình } time = new TimeSpan(0); // làm mới lại thời gian bắt đầu từ 0 lblTime.Text = "Thời Gian: 00:00:00"; lblMoveCount.Text = "Số Lần Di Chuyển: 0 lần"; moveCount = 0;// reset số lần đã di chuyển về 0 -> chưa di chuyển lần nào DisksRodA.Clear();//Khi được reset thì xoá hết các đĩa của cọc DisksRodB.Clear(); DisksRodC.Clear(); picTowerA.BorderStyle = picTowerB.BorderStyle = picTowerC.BorderStyle = BorderStyle.None; //Khi chọn vào 1 cái cọc sẽ có 1 cái border single //-> Tắt hết borderStyle nếu có cọc nào đang được chọn FirstClickedDisks = SecondClickedDisks = null; //reset lần chọn đầu và lần 2 //Initialize ( Khởi tạo sau khi reset ) nubLevel.Enabled = false; //Tắt điều chỉnh số đĩa để tránh người dùng đang dùng 3 đĩa nhưng có thể sửa lại n đĩa trong lúc đang chơi level = (int)nubLevel.Value; btnGiveUp.Enabled = true; btnPlay.Enabled = false; btnPlay.Text = "PLAY AGAIN"; int x = picTowerA.Location.X + DistXFromTowerToDisk, y = FIRSTY; // Các đĩa khởi tạo sẽ bỏ vào cọc A nên toạ độ x phải giống nhau // Toạ độ cột A + khoảng chênh lệch -> Toạ độ đĩa for (int i = (int)nubLevel.Value - 1; i >= 0; --i, y -= DISKHEIGHT) //Khi người dùng chọn n đĩa thì phải hiển thị nó lên và xếp nó vào cọc A { //Để biết đĩa nằm vị trí nào ta dùng 1 vòng for i từ số lượng chuyển kiểu của giá trị số lượng đĩa người dùng chọn -1 ( lùi 1 ) //Duyệt thông qua mảng PictureBox[] disks //Ví dụ người ta chọn 3 đĩa thì ứng với đĩa 1,2,3 phần tử 0,1,2 và đĩa lớn sẽ hiển thị trước ( đĩa số 3 ) disks[i].Location = new Point(x, y); // Trước khi hiển thị đĩa phải chỉnh lại vị trí (Location -> bản thân nó là kiểu Point để lưu được toạ độ) // Dựa vào location bên frm Design // Góc toạ độ O nằm ở góc trái trên của form -> Chiều dương x từ O -> sang phải,y từ O -> xuống dưới // Các đĩa đều nằm chung vị trí nên có y = 411 ( được định nghĩa bằng 1 cái hằng số ở trên bài ) disks[i].Visible = true; // Hiển thị đĩa thứ i //Khi vòng lặp chạy lần kế cần lùi toạ độ y lại 1 đoạn = chiều cao đĩa -> đặt nó ở trên DisksRodA.Push(disks[i]); // Sau khi khởi tạo phải push nó vào Stack đĩa cọc A -> Gọi phương thức push(đĩa thứ i) } if (nubLevel.Value == 2) { lblLeast.Text = "(Tối Thiểu 3 Lần)"; } if (nubLevel.Value == 3) { lblLeast.Text = "(Tối Thiểu 7 Lần)"; } if (nubLevel.Value == 4) { lblLeast.Text = "(Tối Thiểu 15 Lần)"; } if (nubLevel.Value == 5) { lblLeast.Text = "(Tối Thiểu 31 Lần)"; } if (nubLevel.Value == 6) { lblLeast.Text = "(Tối Thiểu 63 Lần)"; } if (nubLevel.Value == 7) { lblLeast.Text = "(Tối Thiểu 127 Lần)"; } if (nubLevel.Value == 8) { lblLeast.Text = "(Tối Thiểu 255 Lần)"; } tmrCountTime.Start(); // Cho chạy timer }