// Hàm đánh cờ public bool DanhCo(Graphics g, int MouseX, int MouseY) { if (MouseX % OCo._DoDai == 0 || MouseY % OCo._DoDai == 0) { return(false); } int Cot = MouseX / OCo._DoDai; int Dong = MouseY / OCo._DoDai; if (_MangOCo[Dong, Cot].SoHuu != 0) { return(false); } switch (_LuotDi) { case 1: _MangOCo[Dong, Cot].SoHuu = 1; _BanCo.VeQuanCo(g, image_O, _MangOCo[Dong, Cot].ViTri); _LuotDi = 2; break; case 2: _MangOCo[Dong, Cot].SoHuu = 2; _BanCo.VeQuanCo(g, image_X, _MangOCo[Dong, Cot].ViTri); _LuotDi = 1; break; } stk_Undo = new Stack <OCo>(); OCo oco = new OCo(_MangOCo[Dong, Cot].Dong, _MangOCo[Dong, Cot].Cot, _MangOCo[Dong, Cot].ViTri, _MangOCo[Dong, Cot].SoHuu); stk_NuocDaDi.Push(oco); return(true); }
// Hàm tìm nước đi tối ưu của máy private OCo TimNuocDi() { OCo oCoResult = new OCo(); long DiemLonNhat = 0; 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_DuyetCheoXuoi(i, j) + DiemTC_DuyetCheoNguoc(i, j); long DiemPhongNgu = DiemPN_DuyetDoc(i, j) + DiemPN_DuyetNgang(i, j) + DiemPN_DuyetCheoXuoi(i, j) + DiemPN_DuyetCheoNguoc(i, j); long Temp = DiemTanCong > DiemPhongNgu ? DiemTanCong : DiemPhongNgu; if (Temp > DiemLonNhat) { DiemLonNhat = Temp; oCoResult = new OCo(_MangOCo[i, j].Dong, _MangOCo[i, j].Cot, _MangOCo[i, j].ViTri, _MangOCo[i, j].SoHuu); } } } } return(oCoResult); }
// Hàm tạo ra các ô cờ trên bàn cờ public void TaoMangOCo() { 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._DoDai, i * OCo._DoDai), 0); } } }
// Hàm đánh cờ của máy public void KhoiDongMay(Graphics g) { if (stk_NuocDaDi.Count == 0) { DanhCo(g, _BanCo.SoCot / 2 * OCo._DoDai + 1, _BanCo.SoDong / 2 * OCo._DoDai + 1); } else { OCo oco = TimNuocDi(); DanhCo(g, oco.ViTri.X + 1, oco.ViTri.Y + 1); } }
public void Redo(Graphics g) { // Khi chơi với người if (_CheDoChoi == 1) { if (stk_Undo.Count != 0) { OCo oco = stk_Undo.Pop(); stk_NuocDaDi.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu)); _MangOCo[oco.Dong, oco.Cot].SoHuu = oco.SoHuu; _BanCo.VeQuanCo(g, oco.SoHuu == 1 ? image_O : image_X, oco.ViTri); } } // Không đc Redo khi chơi với máy }
public void Undo(Graphics g) { if (!_SanSang) { return; } // Khi chơi với người if (_CheDoChoi == 1) { if (stk_NuocDaDi.Count != 0) { OCo oco = stk_NuocDaDi.Pop(); stk_Undo.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu)); _MangOCo[oco.Dong, oco.Cot].SoHuu = 0; _BanCo.XoaQuanCo(g, oco.ViTri, sbback); if (_LuotDi == 1) { _LuotDi = 2; } else { _LuotDi = 1; } } } // Khi chơi với máy else { if (stk_NuocDaDi.Count > 1) { // Xóa nước đi của máy OCo oco = stk_NuocDaDi.Pop(); _BanCo.XoaQuanCo(g, oco.ViTri, sbback); _MangOCo[oco.Dong, oco.Cot].SoHuu = 0; // Xóa nước đi của người chơi oco = stk_NuocDaDi.Pop(); stk_Undo.Push(new OCo(oco.Dong, oco.Cot, oco.ViTri, oco.SoHuu)); _MangOCo[oco.Dong, oco.Cot].SoHuu = 0; _BanCo.XoaQuanCo(g, oco.ViTri, sbback); } } _SanSang = true; }