예제 #1
0
 public override bool Save(BanCo mBanCo, FileStream fout)
 {
     if (!fout.CanWrite)
     {
         return(false);
     }
     for (int i = 0; i < 8; i++)
     {
         for (int j = 0; j < 8; j++)
         {
             QuanCo hienTai = mBanCo.banCo[i, j];
             string content;
             if (hienTai != null)
             {
                 content = hienTai.LayMau() + "" + hienTai.LayTen() + "\n";
             }
             else
             {
                 content = 0 + "" + 0 + "\n";
             }
             fout.Write(Encoding.ASCII.GetBytes(content), 0, content.Length);
         }
     }
     fout.Close();
     return(true);
 }
예제 #2
0
        public override bool Load(FileStream fin, BanCo mBanCo)
        {
            var file = new StreamReader(fin);

            try
            {
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        string content = file.ReadLine();
                        var    coId    = content;
                        mBanCo.banCo[i, j] = QuanCoFactory.taoQuanCo(coId[1].ToString(), coId[0].ToString());
                    }
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
            finally
            {
                file.Close();
                fin.Close();
            }
        }
예제 #3
0
 private void CoTuongOffline_Load(object sender, EventArgs e)
 {
     BanCo.SetToDefault(lblPheDuocDanh, lblSoLuotDi, btnNewGame, btnUndo);
     BanCo.TaoDiemBanCo(ptbBanCo, DiemBanCo_Click);
     BanCo.TaoQuanCo(QuanCo_Click, ptbBanCo);
     BanCo.RefreshBanCo();
 }
예제 #4
0
        public bool SaveGame(BanCo mBanco)
        {
            // Mở file
            FileStream fout   = new FileStream(path, FileMode.Create, FileAccess.Write);
            bool       result = loadSaveEngine.Save(mBanco, fout);

            return(result);
        }
예제 #5
0
 public Form1()
 {
     InitializeComponent();
     main           = new Main();
     form2          = new Form2();
     grs            = BanCo.CreateGraphics();
     ArrayEndPos    = new List <Point>();
     DanhSachVatCan = new List <Point>();
 }
예제 #6
0
        private int NumberStop = 0;                  // số lượng vật thể không thể đến đích
        private void VatDiChuyen(object ViTriVatThe) // hàm vẽ và xoá vị trí tiếp theo và hiện tại, tạo hiệu ứng chuyển động
        {
            Point    point = (Point)ViTriVatThe;
            Graphics gra   = BanCo.CreateGraphics();

            while (true)
            {
                int Row    = point.Y / Cao;
                int Column = point.X / Rong;
                if (MouseDowning && (SetObject_Clicked || DelOne)) // nếu người dùng đang đặt vật cản thì tạm dừng vật di chuyển...
                {
                    Thread.Sleep(500);                             // ...trong nửa giây
                    continue;
                }
                else
                {
                    if (main.ToaDo[Row, Column] == StartPos)
                    {
                        Number++;
                        main.OCo[Row, Column].MauOCo = MauBanCo;
                        // tổng số lượng vật thể đã đến đích và không thể đến đích sẽ bằng số lượng vật thể người dùng đặt
                        if (Number + NumberStop == (form2.Automatic ? form2.Soluong : ArrayEndPos.Count))
                        {
                            Invoke(new Action(() => LamMoi.Enabled = GreedyFS.Enabled = AStart.Enabled = true)); // gọi hàm dẫn control
                            MessageBox.Show("Có " + Number.ToString() + " vật đã đến đích!!", "Đến đích", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Number = NumberStop = 0;                                                             // reset lại giá trị
                            return;
                        }
                        return;
                    }

                    if (main.OCo[main.OCo[Row, Column].Goc.Y / Cao, main.OCo[Row, Column].Goc.X / Rong].MauOCo != Color.DarkOrange)
                    {
                        if (main.OCo[Row, Column].Goc != new Point(-1, -1))
                        {
                            // xoá ô hiện tại
                            main.VeOCo(gra, main.ToaDo[Row, Column].X, main.ToaDo[Row, Column].Y, MauBanCo, true);
                            main.OCo[Row, Column].MauOCo = MauBanCo;
                            // vẽ ô tiếp theo dựa vào gốc của ô cờ
                            main.VeOCo(gra, main.OCo[Row, Column].Goc.X, main.OCo[Row, Column].Goc.Y, Color.DarkOrange, true);
                            point = main.OCo[Row, Column].Goc;
                            main.OCo[point.Y / Cao, point.X / Rong].MauOCo = Color.DarkOrange;
                            Thread.Sleep(100);
                        }
                        else // trường hợp vật không tìm thấy đường đi đến đích thì thoát ra...
                        {
                            NumberStop++; // ... và tăng biến NumberStop lến 1 đơn vị
                            return;
                        }
                    }
                    else if (main.OCo[main.OCo[Row, Column].Goc.Y / Cao, main.OCo[Row, Column].Goc.X / Rong].MauOCo == Color.DarkOrange)
                    {
                        Thread.Sleep(200);
                    }
                }
            }
        }
예제 #7
0
        ConsoleView boardView; // View console thể hiện giao diện
        //Hàm thực hiện di chuyển quân cờ

        public ChessController()
        {
            QuanCoFactory.khoiTaoCacLoaiQuanCo();
            luot         = 'W';
            isChieuTuong = false;
            mBanCo       = BanCo.getBanCo();
            boardView    = new ConsoleView(mBanCo);
            saveLoad     = new SaveLoad("save.txt");
        }
예제 #8
0
 private void ptbBanCo_Click(object sender, EventArgs e)
 {
     if (BanCo.QuanCoDuocChon != null)
     {
         BanCo.Dehighlight();
         BanCo.AnDiemDich();
         BanCo.RefreshBanCo(); //*Offline*
         BanCo.QuanCoDuocChon = null;
     }
 }
예제 #9
0
 /* Khi click vào 1 RoundPictureBox quân cờ thì nó sẽ được chọn... */
 private void QuanCo_Click(object sender, EventArgs e)
 {
     BanCo.QuanCoDuocChon = sender as ProgramConfig.RoundPictureBox;
     BanCo.Highlight(ptbBanCo);
     BanCo.HienThiDiemDich();
     foreach (ProgramConfig.RoundPictureBox element in BanCo.Alive_RoundPictureBox) // Khi 1 quân cờ được chọn thì không thể click chọn 1 quân cờ khác ngay lập tức mà phải bỏ chọn nó trước
     {
         element.Enabled = false;
     }
 }
예제 #10
0
 public bool LoadGame(BanCo mBanco)
 {
     try
     {
         FileStream fin    = new FileStream(path, FileMode.Open, FileAccess.Read);
         bool       result = loadSaveEngine.Load(fin, mBanco);
         return(result);
     }
     catch (Exception)
     { return(false); }
 }
예제 #11
0
 private void LamMoi_Click(object sender, EventArgs e)
 {
     form2              = new Form2();
     StartandEnd        = 0;
     StartPoint.Enabled = EndPoint.Enabled = Moving.Enabled = true;
     StartPos           = new Point(0, 0);
     ArrayEndPos.Clear();
     ObjectMoving = DeleteAll.Enabled = MovePosObject = false;
     StartandEnd  = 0;
     main.KhoiTaoToaDo(MauBanCo);
     BanCo.Refresh();
 }
예제 #12
0
 private void DeleteAll_Click(object sender, EventArgs e)
 {
     StartandEnd = 2;
     main        = new Main();
     main.KhoiTaoToaDo(MauBanCo);
     BanCo.Refresh();
     // vẽ lại vị trí của các điểm
     main.VeOCo(grs, main.ToaDo[StartPos.Y / Cao, StartPos.X / Rong].X, main.ToaDo[StartPos.Y / Cao, StartPos.X / Rong].Y, Color.Red, true);
     main.OCo[StartPos.Y / Cao, StartPos.X / Rong].MauOCo = Color.Red;
     main.VeOCo(grs, main.ToaDo[ArrayEndPos[0].Y / Cao, ArrayEndPos[0].X / Rong].X, main.ToaDo[ArrayEndPos[0].Y / Cao, ArrayEndPos[0].X / Rong].Y,
                Color.DarkOrange, true);
     main.OCo[ArrayEndPos[0].Y / Cao, ArrayEndPos[0].X / Rong].MauOCo = Color.DarkOrange;
 }
예제 #13
0
        private void btnNewGame_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Bạn muốn bỏ ván đấu này và bắt đầu một ván mới?", "Ván mới", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                //Hàm xóa bàn cờ tách thành SetToDefault + XoaBanCo
                BanCo.SetToDefault(lblPheDuocDanh, lblSoLuotDi, btnNewGame, btnUndo);
                BanCo.XoaBanCo(ptbBanCo);
                BanCo.TaoDiemBanCo(ptbBanCo, DiemBanCo_Click);
                BanCo.TaoQuanCo(QuanCo_Click, ptbBanCo);
                BanCo.RefreshBanCo(); //*Offline*
            }
        }
예제 #14
0
        private void btnUndo_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Bạn muốn hoàn tác nước đi vừa rồi?", "Hoàn tác nước đi", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                btnUndo.Enabled = false;
                BanCo.Dehighlight();
                BanCo.AnDiemDich();
                BanCo.HoanTac(ptbBanCo);
                BanCo.DoiPhe(lblPheDuocDanh, lblSoLuotDi, btnNewGame);
                BanCo.HienThiNuocDiTruoc(ptbBanCo);
            }
        }
예제 #15
0
        /* Những gì xảy ra khi click vào một RoundButton điểm bàn cờ để đi đến */
        private void DiemBanCo_Click(object sender, EventArgs e) // BẢN OFFLINE
        {
            if (BanCo.QuanCoDuocChon == null)
            {
                return;          // Dòng code chống lỗi lặp lại event ngoài ý muốn (chưa rõ nguyên nhân của lỗi này). Không được xóa!
            }
            BanCo.Dehighlight(); // chọn nước đi...
            BanCo.AnDiemDich();  // ...thì đồng thời sẽ bỏ chọn quân cờ luôn

            Point departure   = new Point(BanCo.QuanCoDuocChon.Quan_Co.ToaDo.X, BanCo.QuanCoDuocChon.Quan_Co.ToaDo.Y);
            Point destination = ProgramConfig.ThongSo.ToaDoDonViCuaDiem(((ProgramConfig.RoundButton)sender).Location); // Lấy tọa độ của RoundButton điểm bàn cờ (điểm đích)

            BanCo.LoaiBoQuanCo(destination, ptbBanCo);                                                                 // Loại bỏ quân cờ ở điểm đích
            BanCo.QuanCoDuocChon.DiChuyen(destination);                                                                // Di chuyển quân cờ đến điểm đích

            if (BanCo.HaiTuongDoiMatNhau())                                                                            // nước đi không hợp lệ nếu sau nước đi 2 tướng đối mặt nhau => hoàn tác nước đi
            {
                MessageBox.Show("Tướng phe bạn sẽ đối mặt với tướng đối phương sau nước đi này. Hãy chọn một nước đi khác.", "Nước đi không hợp lệ");
                BanCo.QuanCoDuocChon.DiChuyen(departure);
                BanCo.QuanCoDuocChon = null;
                BanCo.TraLaiQuanCo(ptbBanCo, BanCo.QuanCoBiLoai);
                BanCo.RefreshBanCo();
                return;
            }
            if (BanCo.CoChieuTuong(BanCo.PheDoiPhuong())) // nước đi không hợp lệ nếu sau nước đi tướng phe di chuyển bị đối phương chiếu => hoàn tác nước đi
            {
                MessageBox.Show("Tướng phe bạn sẽ gặp nguy sau nước đi này. Hãy chọn một nước đi khác.", "Nước đi không hợp lệ");
                BanCo.QuanCoDuocChon.DiChuyen(departure);
                BanCo.QuanCoDuocChon = null;
                BanCo.TraLaiQuanCo(ptbBanCo, BanCo.QuanCoBiLoai);
                BanCo.RefreshBanCo();
                return;
            }
            if (BanCo.CoChieuTuong(BanCo.PheDuocDanh)) // nếu sau nước đi phe di chuyển chiếu tướng phe đối phương => thông báo cho người chơi
            {
                if (BanCo.PheDoiPhuong() == 1)
                {
                    MessageBox.Show("Phe Xanh hãy đối phó với nước đi này từ phe Đỏ.", "Chiếu tướng!");
                }
                else
                {
                    MessageBox.Show("Phe Đỏ hãy đối phó với nước đi này từ phe Xanh.", "Chiếu tướng!");
                }
            }
            BanCo.HienThiNuocDi(departure, destination, ptbBanCo);
            BanCo.LuuNuocDi(departure, destination);
            BanCo.DoiPhe(lblPheDuocDanh, lblSoLuotDi, btnNewGame, btnUndo); //*Offline*
        }
예제 #16
0
 public abstract bool Load(FileStream fin, BanCo mBanCo);
예제 #17
0
 public abstract bool Save(BanCo mBanCo, FileStream fout);
예제 #18
0
 /// <summary>
 /// Khởi tạo thể hiện mới cho class BanCoViewModel
 /// </summary>
 public BanCoViewModel()
 {
     CurrentBanCo = new BanCo();
 }
예제 #19
0
 public ConsoleView(BanCo banCo)
 {
     mBanCo = banCo;
 }