Ejemplo n.º 1
0
 public void KhoiTaoMangOCo()
 {
     for (int i = 0; i < _BanCo.SoDong; i++)
     {
         for (int j = 0; j < _BanCo.SoCot; j++)
         {
             _MangOCo[i, j] = new OCo(i, j, new Point(j * OCo._ChieuRong, i * OCo._chieuCao), 0);
         }
     }
 }
Ejemplo n.º 2
0
        //tiến hành đánh cờ, nhận vào vị trí trỏ chuột và cọ vẽ
        public bool DanhCo(int MouseX, int MouseY, Graphics g)
        {
            //kiểm tra các đường vạch thì k đánh đc
            if (MouseX % OCo._ChieuRong == 0 || MouseY % OCo._ChieuCao == 0)
            {
                return(false);
            }
            //tính ra ô cờ từ vị trí trỏ chuột
            int Cot  = MouseX / OCo._ChieuRong;
            int Dong = MouseY / OCo._ChieuCao;

            if (_MangOCo[Dong, Cot].SoHuu != 0)
            {
                return(false);
            }
            switch (_LuotDi)
            {
            case 1:
            {
                _MangOCo[Dong, Cot].SoHuu = 1;
                _BanCo.VeQuanCo(g, _MangOCo[Dong, Cot].ViTri, sbBlack);
                _LuotDi = 2;

                break;
            }

            case 2:
            {
                _MangOCo[Dong, Cot].SoHuu = 2;
                _BanCo.VeQuanCo(g, _MangOCo[Dong, Cot].ViTri, sbRed);
                _LuotDi = 1;

                break;
            }

            default:
                MessageBox.Show("Error!");
                break;
            }

            //tiến hành vẽ quân cờ tương ứng , gọi hàm vẽ quân cờ
            //lưu quân cờ đã đi vào stack cho undo , redo và vẽ quân cờ
            ////////////stk_CacNuocDaDi.Push(_MangOCo[Dong, Cot])////////;-->nên tạo mới vùng nhớ
            //tránh lỗi sử dụng cùng vùng nhớ khi undo và redo
            stk_CacNuocUndo = new Stack <OCo>();
            OCo oco = new OCo(_MangOCo[Dong, Cot].Dong, _MangOCo[Dong, Cot].Cot, _MangOCo[Dong, Cot].ViTri, _MangOCo[Dong, Cot].SoHuu);

            stk_CacNuocDaDi.Push(oco);



            return(true);
        }
Ejemplo n.º 3
0
 public void KhoiDongComputer(Graphics g)
 {
     //quy dinh danh giua ban co
     if (stk_CacNuocDaDi.Count == 0)
     {
         DanhCo(_BanCo.SoDong / 2 * OCo._chieuCao + 1, _BanCo.SoCot / 2 * OCo._ChieuRong + 1, g);
     }
     else
     {
         OCo oco = TimKiemNuocDi();
         DanhCo(oco.ViTri.X + 1, oco.ViTri.Y, g);
     }
 }
Ejemplo n.º 4
0
 public void Redo(Graphics g)
 {
     if (stk_Redo.Count != 0)
     {
         OCo oco = stk_Redo.Pop();
         stk_CacNuocDaDi.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu));
         _MangOCo[oco.Dong, oco.Cot].SoHuu = oco.SoHuu;
         _BanCo.VeQuanCo(g, oco.ViTri, oco.SoHuu == 1 ? pBlue : pRed);
         if (_LuotDi == 1)
         {
             _LuotDi = 2;
         }
         else
         {
             _LuotDi = 1;
         }
         _Undo = 0;
     }
 }
Ejemplo n.º 5
0
        private OCo TimKiemNuocDi()
        {
            OCo oCoResult = new OCo();
            //Bat dau
            long DiemTong = 0;

            //vet can
            for (int i = 0; i < _BanCo.SoDong; i++)
            {
                for (int j = 0; j < _BanCo.SoCot; j++)
                {
                    if (_MangOCo[i, j].SoHuu == 0)
                    {
                        long DiemTanCong  = DiemTC_DuyetDoc(i, j) + DiemTC_DuyetNgang(i, j) + DiemTC_DuyetCheoNguoc(i, j) + DiemTC_DuyetCheoXuoi(i, j);
                        long DiemPhongNgu = DiemPN_DuyetDoc() + DiemPN_DuyetNgang() + DiemPN_DuyetCheoNguoc() + DiemPN_DuyetCheoXuoi();
                    }
                }
            }
            return(oCoResult);
        }
Ejemplo n.º 6
0
        public void Redo(Graphics g)
        {
            if (stk_CacNuocUndo.Count != 0)
            {
                //lấy 1 quân cờ đã ra từ stack redo
                OCo oco = stk_CacNuocUndo.Pop();
                //tạo mới vùng nhớ lưu vào stack cacnuocdadi
                stk_CacNuocDaDi.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu));

                _BanCo.VeQuanCo(g, oco.ViTri, oco.SoHuu == 1 ? sbBlack : sbRed);
                if (_LuotDi == 1)
                {
                    _LuotDi = 2;
                }
                else
                {
                    _LuotDi = 1;
                }
            }
        }
Ejemplo n.º 7
0
 public void Undo(Graphics g)
 {
     if (stk_CacNuocDaDi.Count != 0)
     {
         //lấy quân cờ ra khỏi stack
         OCo oco = stk_CacNuocDaDi.Pop();
         //thêm quân cờ đã lấy vào redo
         stk_CacNuocUndo.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu));
         _MangOCo[oco.Dong, oco.Cot].SoHuu = 0;
         _BanCo.XoaQuanCo(g, oco.ViTri, sbXoa);
         //quay lai luot choi cua ng choi trc
         if (_LuotDi == 1)
         {
             _LuotDi = 2;
         }
         else
         {
             _LuotDi = 1;
         }
     }
     //    VeBanCo(g);
     //   VeLaiQuanCo(g);
 }
Ejemplo n.º 8
0
        public bool DanhCo(int MouseX, int MouseY, Graphics g)
        {
            if (MouseX % OCo._ChieuRong == 0 || MouseY % OCo._chieuCao == 0)
            {
                return(false);
            }
            int Cot  = MouseX / OCo._ChieuRong;
            int Dong = MouseY / OCo._chieuCao;

            if (_MangOCo[Dong, Cot].SoHuu != 0)
            {
                return(false);
            }
            switch (_LuotDi)
            {
            case 1:
                _MangOCo[Dong, Cot].SoHuu = 1;
                _BanCo.VeQuanCo(g, _MangOCo[Dong, Cot].ViTri, pBlue);
                _LuotDi = 2;
                break;

            case 2:
                _MangOCo[Dong, Cot].SoHuu = 2;
                _BanCo.VeQuanCo(g, _MangOCo[Dong, Cot].ViTri, pRed);
                _LuotDi = 1;
                break;

            default:
                MessageBox.Show("false");
                break;
            }
            stk_Redo = new Stack <OCo>();
            OCo oco = new OCo(_MangOCo[Dong, Cot].Dong, _MangOCo[Dong, Cot].Cot, _MangOCo[Dong, Cot].ViTri, _MangOCo[Dong, Cot].SoHuu);

            stk_CacNuocDaDi.Push(oco);
            return(true);
        }
Ejemplo n.º 9
0
 public void Undo(Graphics g)
 {
     if (stk_CacNuocDaDi.Count != 0)
     {
         OCo oco = stk_CacNuocDaDi.Pop();
         stk_Redo.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu));
         _MangOCo[oco.Dong, oco.Cot].SoHuu = 0;
         _BanCo.XoaQuanCo(g, oco.ViTri, sbSnow);
         if (_LuotDi == 1)
         {
             _LuotDi = 2;
         }
         else
         {
             _LuotDi = 1;
         }
         _Undo++;
     }
     if (_Undo == 3)
     {
         stk_CacNuocDaDi = new Stack <OCo>();
         _Undo           = 0;
     }
 }