コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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
                }
            }
        }