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); } } }
//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); }
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); } }
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; } }
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); }
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; } } }
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); }
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); }
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; } }