private void MoveDisk(Point point) { FirstTopDisk = FirstClickedDisks.Pop();//Đầu tiên phải xoá đĩa đầu tiên của cọc được chọn (Phương thức pop -> xoá đĩa đầu và trả lại đĩa đó) d = point; tmrAnimation.Start(); if (FirstTopDisk.Location == d) //Cập nhật toạ độ của đĩa được lấy { tmrAnimation.Stop(); } SecondClickedDisks.Push(FirstTopDisk); //Bỏ đĩa được chọn lên đầu của tập ở lần chọn thứ 2 ++moveCount; //Mỗi lần di chuyển thành công -> tăng movecount lblMoveCount.Text = string.Format("Số Lần Di Chuyển: {0} lần ", moveCount); //Và cập nhật lại label movecount ,bỏ movecount vô FirstClickedDisks = SecondClickedDisks = null; //reset 2 tập đĩa được nhấn picTowerA.BorderStyle = picTowerB.BorderStyle = picTowerC.BorderStyle = BorderStyle.None; //Vì k biết đường biên của lần chọn là cọc nào nên tắt cả 3 cọc rtbLog.Text = rtbLog.Text + Environment.NewLine + moveCount + ". " + towerA + " --> " + towerB; //thêm vào log if (DisksRodC.Count == nubLevel.Value) //Nếu đã di chuyển hết các đĩa qua cọc C rồi { //Gọi tập đĩa của cọc C lấy ra count nếu = số lượng đã chọn ở Numeric -> xử lí //btnGiveUp.PerformClick(); tmrCountTime.Stop(); nubLevel.Enabled = true; btnGiveUp.Enabled = false; btnPlay.Enabled = true; MessageBox.Show("Chúc mừng bạn đã hoàn thành trò chơi ", "Congratulation", MessageBoxButtons.OK); frmInputInfo frm = new frmInputInfo(); frm.ShowDialog(); } }
private void ProcessMovingDisk(PictureBox ClickedTower) { //Lưu ý có 2 trường hợp if (SecondClickedDisks.Count == 0) //Nếu cọc nhận đĩa chưa có đĩa { MoveDisk(new Point(ClickedTower.Location.X + DistXFromTowerToDisk, FIRSTY)); //Chỉ định toạ độ của đĩa được chọn của cọc đầu sang cọc được chọn //Đĩa này sẽ là đĩa đầu tiên của cọc chưa có đĩa } else // Nếu cọc thứ 2 có đĩa -> xét xem đĩa được chọn có nhỏ hơn đĩa đầu cọc 2 k { PictureBox FirstTopDisk = FirstClickedDisks.Peek();//Vì chưa chắc sẽ move qua được nên chỉ lấy thông tin PictureBox SecondTopDisk = SecondClickedDisks.Peek(); if (int.Parse(FirstTopDisk.Tag.ToString()) < int.Parse(SecondTopDisk.Tag.ToString())) //Chuyển kiểu ,Trong lúc tạo đĩa thuộc tính tag đã được điền số tương ứng, { //1 chuỗi được lưu vào tt tag,thuộc tính tag giữ tham chiếu đó //So sánh nếu FirstTopDisk nhỏ hơn SecondTopDisk thì phù hợp để di chuyển MoveDisk(new Point(SecondTopDisk.Location.X, SecondTopDisk.Location.Y - DISKHEIGHT)); //Toạ độ x sẽ giống nhau,vì đĩa được chuyển qua nằm trên nên toạ độ y xích lên 1 khoảng = chiều cao } else //Nếu không nhỏ hơn { SecondClickedDisks = null;// Bỏ đánh dấu của lần chọn 2 -> Xem như chỉ mới chọn lần 1 -> được phép chọn lại tập đĩa khác thoả điều kiện di chuyển } } }