如上所述,我似乎对Stack有问题。我正在使用它来实现一个撤销功能,当它被点击时,它会从堆栈中检索并删除对象数组,并在类中重新填充一个数组但不知何故它出现了不同。 函数TaoNuocDiGia(ViTri batDau,ViTri ketThuc,boolean quanBenNao)是我将对象数组推入堆栈的地方,下面是一个for循环,它向控制台生成一个打印出来的样子。
在函数HuyNuocDiGia()是我弹出堆栈的地方,我试图检索存储在堆栈中的对象数组并重新填充数组,但就像我说的那样,它与我在推送它时不同
package com.example.giaithuat;
import java.util.ArrayList;
import java.util.Stack;
import android.util.Log;
import com.example.quanco.Chot;
import com.example.quanco.Hau;
import com.example.quanco.Ngua;
import com.example.quanco.Tuong;
import com.example.quanco.ViTri;
import com.example.quanco.Vua;
import com.example.quanco.Xe;
public class GiaiThuat {
//Dữ liệu chứa mảng quân cờ
private char[][] mangQuanCo;
byte doKho;
public static boolean QUAN_NGUOI_CHOI;
String NUOC_DI_CUA_MAY="";
public static boolean XE_TRAI_DI_CHUYEN = false, XE_PHAI_DI_CHUYEN = false, VUA_DI_CHUYEN = false;
public static boolean XE_TRAI_DI_CHUYEN_MAY = false, XE_PHAI_DI_CHUYEN_MAY = false, VUA_DI_CHUYEN_MAY = false;
public static boolean BAT_CHOT_QUA_DUONG = false;
public static boolean BAT_CHOT_QUA_DUONG_MAY = false;
public static boolean LUOT_NGUOI_CHOI;
public static byte trangThaiGame=0;
//Khai báo biến lưu trữ tạm phục vụ cho hàm tạo nước đi giả và hủy phục hồi nước đi
Stack<char[][]> Stack_mangQuan = new Stack<char[][]>();
Stack<Boolean> xeTraiDiChuyen = new Stack<Boolean>();
Stack<Boolean> xePhaiDiChuyen = new Stack<Boolean>();
Stack<Boolean> xeTraiDiChuyen_May = new Stack<Boolean>();
Stack<Boolean> xePhaiDiChuyen_May = new Stack<Boolean>();
Stack<Boolean> batChotQuaDuong = new Stack<Boolean>();
Stack<Boolean> batChotQuaDuong_May = new Stack<Boolean>();
Stack<Boolean> vuaDiChuyen = new Stack<Boolean>();
Stack<Boolean> vuaDiChuyen_May = new Stack<Boolean>();
//Điểm của các quân cho hàm tính giá trị
public static final short CHOT = 100, NGUA = 320, TUONG = 330, XE = 500, HAU = 900, VUA = 10000;
public char[][] getMangQuanCo()
{
return mangQuanCo;
}
public void setMangQuanCo(char[][] mangQuanCo)
{
this.mangQuanCo = mangQuanCo;
}
public GiaiThuat(char[][] mangQuanCo, boolean quanNguoiChoi, byte do_Kho)
{
this.mangQuanCo = mangQuanCo;
GiaiThuat.QUAN_NGUOI_CHOI = quanNguoiChoi;
this.doKho = do_Kho;
GiaiThuat.LUOT_NGUOI_CHOI = QUAN_NGUOI_CHOI;
}
private void GanDieuKienNhapThanh(char quanCo)
{
if((quanCo=='X'&&mangQuanCo[0][0]=='0')||(quanCo=='x'&&mangQuanCo[0][0]=='0'))
XE_TRAI_DI_CHUYEN = true;
if((quanCo=='X'&&mangQuanCo[0][7]=='0')||(quanCo=='x'&&mangQuanCo[0][7]=='0'))
XE_PHAI_DI_CHUYEN = true;
if((quanCo=='V'&&mangQuanCo[0][4]=='0')||(quanCo=='v'&&mangQuanCo[0][3]=='0'))
VUA_DI_CHUYEN=true;
}
//Gán điều kiện bắt chốt qua đường
private void GanDieuKienBatChot(char quanCo, byte hang_KetThuc, byte cot_KetThuc, byte hang_BatDau)
{
if(quanCo=='c'||quanCo=='C')
{
if(cot_KetThuc>0 && Character.isUpperCase(mangQuanCo[hang_KetThuc][cot_KetThuc-1])!=QUAN_NGUOI_CHOI && hang_BatDau==1 && hang_KetThuc==3)
{
char tam = mangQuanCo[hang_KetThuc][cot_KetThuc-1];
if(tam=='c'||tam=='C')
BAT_CHOT_QUA_DUONG_MAY = true;
}
if(cot_KetThuc<7 && Character.isUpperCase(mangQuanCo[hang_KetThuc][cot_KetThuc+1])!=QUAN_NGUOI_CHOI&& hang_BatDau==1 && hang_KetThuc==3)
{
char tam = mangQuanCo[hang_KetThuc][cot_KetThuc+1];
if(tam=='c'||tam=='C')
BAT_CHOT_QUA_DUONG_MAY = true;
}
}
if(BAT_CHOT_QUA_DUONG)
BAT_CHOT_QUA_DUONG = false;
}
//Hàm kiểm tra quân người chơi còn nước đi hợp lệ
private boolean KiemTraConNuocDiHopLe_NguoiChoi(char[][] mangQuan)
{
ArrayList<DuongDi> dsNuocDi = new ArrayList<DuongDi>();
for(byte i = 0; i<8;i++)
{
for(byte j=0; j<8;j++)
{
if(mangQuan[i][j]!='0' && (Character.isUpperCase(mangQuan[i][j])== QUAN_NGUOI_CHOI))
{
dsNuocDi = TimNuocDiHopLeCuaQuan_NguoiChoi(mangQuan, i, j);
char[][] mangQuanTam = new char[8][8];
for(byte k=0; k<dsNuocDi.size();k++)
{
for(byte l=0; l<8;l++)
{
for(byte m=0; m<8; m++)
{
char tam = mangQuan[l][m];
mangQuanTam[l][m] = tam;
}
}
DuongDi duongDi = dsNuocDi.get(k);
ViTri batDau = duongDi.batDau;
ViTri ketThuc = duongDi.ketThuc;
char quanCo = mangQuanTam[batDau.getX()][batDau.getY()];
mangQuanTam[batDau.getX()][batDau.getY()]='0';
mangQuanTam[ketThuc.getX()][ketThuc.getY()]= quanCo;
if(!Vua.IsBiChieu(mangQuanTam, QUAN_NGUOI_CHOI))
{
return true;
}
}
}
}
}
return false;
}
//Hàm lấy danh sách nước đi hợp lệ của quân người chơi
private ArrayList<DuongDi> TimNuocDiHopLe_NguoiChoi(char[][] mangQuan)
{
ArrayList<DuongDi> dsNuocDi = new ArrayList<DuongDi>();
for(byte i = 0; i<8;i++)
{
for(byte j=0; j<8;j++)
{
if(mangQuan[i][j]!='0' && (Character.isUpperCase(mangQuan[i][j])== QUAN_NGUOI_CHOI))
{
dsNuocDi.addAll(TimNuocDiHopLeCuaQuan_NguoiChoi(mangQuan, i, j));
}
}
}
char[][] mangQuanTam = new char[8][8];
for(byte k=0; k<dsNuocDi.size();k++)
{
//Sao chép mảng
for(byte l=0; l<8;l++)
{
for(byte m=0; m<8; m++)
{
char tam = mangQuan[l][m];
mangQuanTam[l][m] = tam;
}
}
DuongDi duongDi = dsNuocDi.get(k);
ViTri batDau = duongDi.batDau;
ViTri ketThuc = duongDi.ketThuc;
mangQuanTam[ketThuc.getX()][ketThuc.getY()]=mangQuanTam[batDau.getX()][batDau.getY()];
mangQuanTam[batDau.getX()][batDau.getY()]='0';
if(Vua.IsBiChieu(mangQuanTam, QUAN_NGUOI_CHOI))
{
dsNuocDi.remove(k);
}
}
return dsNuocDi;
}
private ArrayList<DuongDi> TimNuocDiHopLeCuaQuan_NguoiChoi(char[][] mangQuan, byte hang, byte cot)
{
ViTri batDau = new ViTri(hang, cot);
ArrayList<ViTri> dsVTKetThuc = new ArrayList<ViTri>();
char quanCo = mangQuan[hang][cot];
if(QUAN_NGUOI_CHOI)
{
if(quanCo=='V')
{
dsVTKetThuc = Vua.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot);
//Thêm vị trí nhập thành xa
if(!XE_TRAI_DI_CHUYEN && !VUA_DI_CHUYEN && !Vua.IsQuanGiuaVuaXeTrangTrai(mangQuan) && Vua.IsKhongBiChieuTrangTrai(mangQuan))
{
dsVTKetThuc.add(new ViTri((byte)(0), (byte)(2)));
}
//Thêm vị trí nhập thành gần
if(!XE_PHAI_DI_CHUYEN && !VUA_DI_CHUYEN && !Vua.IsQuanGiuaVuaXeTrangPhai(mangQuan) && Vua.IsKhongBiChieuTrangPhai(mangQuan))
{
dsVTKetThuc.add(new ViTri((byte)(0), (byte)(6)));
}
}
else if(quanCo=='H')
{
dsVTKetThuc = Xe.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot);
dsVTKetThuc.addAll(Tuong.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot));
}
else if(quanCo=='X')
dsVTKetThuc = Xe.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot);
else if(quanCo=='T')
dsVTKetThuc = Tuong.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot);
else if(quanCo=='N')
dsVTKetThuc = Ngua.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot);
else if(quanCo=='C')
dsVTKetThuc = Chot.DanhSachNuocDiHopLeTrang(mangQuan, hang, cot, false);
}
else
{
if(quanCo=='v')
{
dsVTKetThuc = Vua.DanhSachNuocDiHopLeDen(mangQuan, hang, cot);
//Thêm vị trí nhập thành gần
if(!XE_TRAI_DI_CHUYEN && !VUA_DI_CHUYEN && !Vua.IsQuanGiuaVuaXeDenTrai(mangQuan) && Vua.IsKhongBiChieuDenTrai(mangQuan))
{
dsVTKetThuc.add(new ViTri((byte)(0), (byte)(1)));
}
//Thêm vị trí nhập thành xa
if(!XE_PHAI_DI_CHUYEN && !VUA_DI_CHUYEN && !Vua.IsQuanGiuaVuaXeDenPhai(mangQuan) && Vua.IsKhongBiChieuDenPhai(mangQuan))
{
dsVTKetThuc.add(new ViTri((byte)(0), (byte)(5)));
}
}
else if(quanCo=='h')
{
dsVTKetThuc = Xe.DanhSachNuocDiHopLeDen(mangQuan, hang, cot);
dsVTKetThuc.addAll(Tuong.DanhSachNuocDiHopLeDen(mangQuan, hang, cot));
}
else if(quanCo=='x')
dsVTKetThuc = Xe.DanhSachNuocDiHopLeDen(mangQuan, hang, cot);
else if(quanCo=='t')
dsVTKetThuc = Tuong.DanhSachNuocDiHopLeDen(mangQuan, hang, cot);
else if(quanCo=='n')
dsVTKetThuc = Ngua.DanhSachNuocDiHopLeDen(mangQuan, hang, cot);
else if(quanCo=='c')
dsVTKetThuc = Chot.DanhSachNuocDiHopLeDen(mangQuan, hang, cot, false);
}
ArrayList<DuongDi> dsDuongDi = new ArrayList<DuongDi>();
for(byte k=0; k < dsVTKetThuc.size();k++)
{
DuongDi duongDi = new DuongDi(batDau, dsVTKetThuc.get(k));
dsDuongDi.add(duongDi);
}
return dsDuongDi;
}
//===============================================================================================================================//
//===============================================================================================================================//
// Lập trình cho máy //
public void MayDiChuyen()
{
if(TimNuocDiHopLe_May(mangQuanCo).size()==0)
{
trangThaiGame = 3;
return;
}
else if(IsHoaCo(mangQuanCo, !QUAN_NGUOI_CHOI))
{
trangThaiGame = 2;
return;
}
int alpha = -50000;
int beta = 50000;
Stack_mangQuan.removeAllElements();
AlphaBeta(-beta, -alpha, doKho, !QUAN_NGUOI_CHOI);
TaoNuocDi(NUOC_DI_CUA_MAY);
NUOC_DI_CUA_MAY = "";
LUOT_NGUOI_CHOI = true;
if(KiemTraConNuocDiHopLe_NguoiChoi(mangQuanCo)==false)
{
trangThaiGame = 1;
}
else if(IsHoaCo(mangQuanCo, QUAN_NGUOI_CHOI))
{
trangThaiGame = 2;
}
}
//Hàm thực thi nước đi tốt nhất từ hàm Alphabeta
private void TaoNuocDi(String nuocDiCuaMay)
{
String batDau = nuocDiCuaMay.substring(0, 2);
String ketThuc = nuocDiCuaMay.substring(3);
byte[] vt_KetThuc = ViTri.LayToaDoMang(ketThuc, QUAN_NGUOI_CHOI);
byte[] vt_BatDau = ViTri.LayToaDoMang(batDau, QUAN_NGUOI_CHOI);
char quanCo = mangQuanCo[vt_BatDau[0]][vt_BatDau[1]];
mangQuanCo[vt_KetThuc[0]][vt_KetThuc[1]] = mangQuanCo[vt_BatDau[0]][vt_BatDau[1]];
mangQuanCo[vt_BatDau[0]][vt_BatDau[1]] = '0';
//Trường hợp bắt chốt qua đường
if(vt_BatDau[1]>0 && Character.isUpperCase(mangQuanCo[vt_BatDau[0]][vt_BatDau[1]-1])==QUAN_NGUOI_CHOI)
{
if((BAT_CHOT_QUA_DUONG_MAY))
{
char tam = mangQuanCo[vt_BatDau[0]][vt_BatDau[1]-1];
if(Chot.IsQuanChot(tam))
mangQuanCo[vt_BatDau[0]][vt_BatDau[1]-1] = '0';
}
}
if(vt_BatDau[1] <7 && Character.isUpperCase(mangQuanCo[vt_BatDau[0]][vt_BatDau[1]+1])==QUAN_NGUOI_CHOI)
{
if(BAT_CHOT_QUA_DUONG_MAY)
{
char tam = mangQuanCo[vt_BatDau[0]][vt_BatDau[1]+1];
if(Chot.IsQuanChot(tam))
mangQuanCo[vt_BatDau[0]][vt_BatDau[1]+1] = '0';
}
}
//Trường hợp phong cấp chốt, mặc định là phong hậu
if(vt_KetThuc[0]==0 && Chot.IsQuanChot(quanCo))
{
mangQuanCo[vt_KetThuc[0]][vt_KetThuc[1]] = !QUAN_NGUOI_CHOI ?'H':'h';
}
//Nhập thành xa quân trắng
if(vt_BatDau[0]==7&& vt_BatDau[1]==3 && vt_KetThuc[0] == 7 && vt_KetThuc[1]==5)
{
mangQuanCo[7][7]='0';
mangQuanCo[7][4]='X';
return;
}
//Nhập thành gần quân trắng
if(vt_BatDau[0]==7&& vt_BatDau[1]==3 && vt_KetThuc[0] == 7 && vt_KetThuc[1]==1)
{
mangQuanCo[7][0]='0';
mangQuanCo[7][2]='X';
return;
}
//Nhập thành xa quân đen
if(vt_BatDau[0]==7&& vt_BatDau[1]==4 && vt_KetThuc[0] == 7 && vt_KetThuc[1]==2)
{
mangQuanCo[7][0]='0';
mangQuanCo[7][3]='x';
return;
}
//Nhập thành gần quân đen
if(vt_BatDau[0]== 7 && vt_BatDau[1]==4 && vt_KetThuc[0]== 7 && vt_KetThuc[1]==6)
{
mangQuanCo[7][7]='0';
mangQuanCo[7][5]='x';
return;
}
GanDieuKienBatChot_May(mangQuanCo[vt_BatDau[0]][vt_BatDau[1]], vt_KetThuc[0], vt_KetThuc[1], vt_BatDau[0]);
GanDieuKienNhapThanh_May(mangQuanCo[vt_BatDau[0]][vt_BatDau[1]]);
}
//Gán điều kiện nhập thành
private void GanDieuKienNhapThanh_May(char quanCo) {
if((quanCo=='X'&&mangQuanCo[7][7]=='0')||(quanCo=='x'&&mangQuanCo[7][7]=='0'))
XE_TRAI_DI_CHUYEN_MAY = true;
if((quanCo=='X'&&mangQuanCo[7][0]=='0')||(quanCo=='x'&&mangQuanCo[7][0]=='0'))
XE_PHAI_DI_CHUYEN_MAY = true;
if((quanCo=='V'&&mangQuanCo[0][3]=='0')||(quanCo=='v'&&mangQuanCo[0][4]=='0'))
VUA_DI_CHUYEN_MAY=true;
}
//Gán điều kiện bắt chốt của máy
private void GanDieuKienBatChot_May(char quanCo, byte hang_KetThuc, byte cot_KetThuc, byte hang_batDau) {
if(Chot.IsQuanChot(quanCo))
{
if(cot_KetThuc>0 && Character.isUpperCase(mangQuanCo[hang_KetThuc][cot_KetThuc-1])==QUAN_NGUOI_CHOI &&hang_batDau==6 && hang_KetThuc==4)
{
char tam = mangQuanCo[hang_KetThuc][cot_KetThuc-1];
if(Chot.IsQuanChot(tam))
BAT_CHOT_QUA_DUONG = true;
}
if(cot_KetThuc<7 && Character.isUpperCase(mangQuanCo[hang_KetThuc][cot_KetThuc+1])==QUAN_NGUOI_CHOI &&hang_batDau==6 && hang_KetThuc==4)
{
char tam = mangQuanCo[hang_KetThuc][cot_KetThuc+1];
if(Chot.IsQuanChot(tam))
BAT_CHOT_QUA_DUONG = true;
}
}
if(BAT_CHOT_QUA_DUONG_MAY)
BAT_CHOT_QUA_DUONG_MAY = false;
}
//Hàm tìm tất cả nước đi hợp lệ của máy
public ArrayList<DuongDi> TimNuocDiHopLe_May(char[][] mangQuan)
{
ArrayList<DuongDi> dsNuocDi = new ArrayList<DuongDi>();
for(byte i = 0; i<8;i++)
{
for(byte j=0; j<8;j++)
{
if(mangQuan[i][j]!='0' && (Character.isUpperCase(mangQuan[i][j])!=QUAN_NGUOI_CHOI))
{
dsNuocDi.addAll(TimNuocDiHopLeCuaQuan_May(mangQuan, i, j));
}
}
}
//Loại bỏ những nước đi làm cho quân vua của máy bị chiếu
for(short k=0; k<dsNuocDi.size();k++)
{
DuongDi duongDi = dsNuocDi.get(k);
ViTri batDau = duongDi.getBatDau();
ViTri ketThuc = duongDi.getKetThuc();
char[][] mangQuanTam = new char[8][8];
//Sao chép các giá trị của mảng quân vào mảng quân tạm
for(byte l=0; l<8; l++)
{
for(byte m=0; m<8; m++)
{
char tam = mangQuan[l][m];
mangQuanTam[l][m]=tam;
}
}
mangQuanTam[ketThuc.getX()][ketThuc.getY()] = mangQuanTam[batDau.getX()][batDau.getY()];
mangQuanTam[batDau.getX()][batDau.getY()]='0';
if(Vua.IsBiChieu_May(mangQuanTam, !QUAN_NGUOI_CHOI))
dsNuocDi.remove(k);
}
return dsNuocDi;
}
private static ArrayList<DuongDi> TimNuocDiHopLeCuaQuan_May(char[][] mangQuan, byte i, byte j)
{
ViTri batDau = new ViTri(i, j);
ArrayList<ViTri> dsVTKetThuc = new ArrayList<ViTri>();
char quanCo = mangQuan[i][j];
if(QUAN_NGUOI_CHOI==false)
{
if(quanCo=='V')
{
dsVTKetThuc = Vua.TimDuongAnQuanVuaTrang_May(mangQuan, i, j);
if(Vua.ThemViTriNhapThanhGanTrang_May(mangQuan)=="O-O")
dsVTKetThuc.add(new ViTri((byte)(7), (byte)(1)));
if(Vua.ThemViTriNhapThanhXaTrang_May(mangQuan)=="O-O-O")
dsVTKetThuc.add(new ViTri((byte)(7), (byte)(5)));
}
else if(quanCo=='H')
{
dsVTKetThuc = Xe.TimDuongAnQuanXeTrang_May(mangQuan, i, j);
dsVTKetThuc.addAll(Tuong.TimDuongAnQuanTuongTrang_May(mangQuan, i, j));
}
else if(quanCo=='X')
dsVTKetThuc = Xe.TimDuongAnQuanXeTrang_May(mangQuan, i, j);
else if(quanCo=='T')
dsVTKetThuc = Tuong.TimDuongAnQuanTuongTrang_May(mangQuan, i, j);
else if(quanCo=='C')
dsVTKetThuc = Chot.TimDuongAnQuanChotTrang_May(mangQuan, i, j, false);
else if(quanCo=='N')
dsVTKetThuc = Ngua.TimDuongAnQuanNguaTrang_May(mangQuan, i, j);
}
else
{
if(quanCo=='v')
{
dsVTKetThuc = Vua.TimDuongAnQuanVuaDen_May(mangQuan, i, j);
if(Vua.ThemViTriNhapThanhGanDen_May(mangQuan)=="O-O")
dsVTKetThuc.add(new ViTri((byte)(7), (byte)(6)));
if(Vua.ThemViTriNhapThanhXaDen_May(mangQuan)=="O-O-O")
dsVTKetThuc.add(new ViTri((byte)(7), (byte)(2)));
}
else if(quanCo=='h')
{
dsVTKetThuc = Xe.TimDuongAnQuanXeDen_May(mangQuan, i, j);
dsVTKetThuc.addAll(Tuong.TimDuongAnQuanTuongDen_May(mangQuan, i, j));
}
else if(quanCo=='x')
dsVTKetThuc = Xe.TimDuongAnQuanXeDen_May(mangQuan, i, j);
else if(quanCo=='t')
dsVTKetThuc = Tuong.TimDuongAnQuanTuongDen_May(mangQuan, i, j);
else if(quanCo=='n')
{
dsVTKetThuc = Ngua.TimDuongAnQuanNguaDen_May(mangQuan, i, j);
}
else if(quanCo=='c')
{
dsVTKetThuc = Chot.TimDuongAnQuanChotDen_May(mangQuan, i, j, false);
}
}
ArrayList<DuongDi> dsDuongDi = new ArrayList<DuongDi>();
for(byte k=0; k < dsVTKetThuc.size();k++)
{
DuongDi duongDi = new DuongDi(batDau, dsVTKetThuc.get(k));
dsDuongDi.add(duongDi);
}
return dsDuongDi;
}
private int AlphaBeta(int alpha, int beta, byte dosau, boolean quanBenNao)
{
if(dosau==0)
return LuongGia(mangQuanCo);
else
{
int best = -100000, value;
DuongDi bestMove = null;
//Sinh danh sách nước đi tùy quân bên nào
ArrayList<DuongDi> arrDuongDi;
if(quanBenNao==QUAN_NGUOI_CHOI)
{
arrDuongDi = TimNuocDiHopLe_NguoiChoi(mangQuanCo);
}
else
{
arrDuongDi = TimNuocDiHopLe_May(mangQuanCo);
}
String s="";
for(byte l=0; l<arrDuongDi.size();l++)
{
s += arrDuongDi.get(l).batDau.getX()+""+arrDuongDi.get(l).batDau.getY()+"-"+arrDuongDi.get(l).ketThuc.getX()+""+arrDuongDi.get(l).ketThuc.getY()+" ; ";
}
Log.e("ERROR", s);
if (arrDuongDi.size() == 0)
{
//Quân Vua mình bị chiếu và người hết cờ là mình => trừ điểm mình
if (quanBenNao != QUAN_NGUOI_CHOI && Vua.IsBiChieu_May(mangQuanCo, !QUAN_NGUOI_CHOI))
{
return -10000 - dosau;
}
//Quân Vua đối phương bị chiếu và người hết cờ là đối phương => trừ điểm đối phương
if (quanBenNao == QUAN_NGUOI_CHOI && Vua.IsBiChieu(mangQuanCo, QUAN_NGUOI_CHOI))
{
return -10000 - dosau;
}
return 0;
}
int i=0;
while(i < arrDuongDi.size() && best < beta)
{
if(best > alpha)
alpha = best;
DuongDi duongDi = arrDuongDi.get(i);
TaoNuocDiGia(duongDi.batDau, duongDi.ketThuc, quanBenNao);
value = -AlphaBeta(-beta,-alpha , (byte)(dosau - 1), !quanBenNao);
HuyNuocDiGia();
if(value > best)
{
best = value;
bestMove = duongDi;
}
i++;
}
if(dosau == doKho)
{
NUOC_DI_CUA_MAY = bestMove.batDau.toString()+"-"+bestMove.ketThuc.toString();
}
return best;
}
}
//Hủy nước đi giả phục vụ cho AlphaBeta
private void HuyNuocDiGia()
{
mangQuanCo = Stack_mangQuan.pop();
Log.e("ERROR", "pop");
for(byte l=0; l<8; l++)
{
String s= "";
for(byte m=0; m<8; m++)
{
s+= mangQuanCo[l][m]+" ";
}
Log.e("ERROR", s+"-");
}
Log.e("ERROR", "-----------------------------");
//Trường hợp bắt chốt qua đường
BAT_CHOT_QUA_DUONG = batChotQuaDuong.pop();
BAT_CHOT_QUA_DUONG_MAY = batChotQuaDuong_May.pop();
XE_TRAI_DI_CHUYEN = xeTraiDiChuyen.pop();
XE_PHAI_DI_CHUYEN = xePhaiDiChuyen.pop();
VUA_DI_CHUYEN = vuaDiChuyen.pop();
XE_TRAI_DI_CHUYEN_MAY = xeTraiDiChuyen_May.pop();
XE_PHAI_DI_CHUYEN_MAY = xePhaiDiChuyen_May.pop();
VUA_DI_CHUYEN_MAY = vuaDiChuyen_May.pop();
}
//Hàm tạo nước đi giả phục vụ cho việc lượng giá
private void TaoNuocDiGia(ViTri batDau, ViTri ketThuc, boolean quanBenNao) {
Stack_mangQuan.push(mangQuanCo);
Log.e("ERROR", "push");
char[][] mangXam = Stack_mangQuan.peek();
for(byte l=0; l<8; l++)
{
String s= "";
for(byte m=0; m<8; m++)
{
s+= mangXam[l][m]+" ";
}
Log.e("ERROR", s+"+");
}
batChotQuaDuong.push(BAT_CHOT_QUA_DUONG);
batChotQuaDuong_May.push(BAT_CHOT_QUA_DUONG_MAY);
xeTraiDiChuyen.push(XE_TRAI_DI_CHUYEN);
xePhaiDiChuyen.push(XE_PHAI_DI_CHUYEN);
xeTraiDiChuyen_May.push(XE_TRAI_DI_CHUYEN_MAY);
xePhaiDiChuyen_May.push(XE_PHAI_DI_CHUYEN_MAY);
vuaDiChuyen.push(VUA_DI_CHUYEN);
vuaDiChuyen_May.push(VUA_DI_CHUYEN_MAY);
char quanCo = mangQuanCo[batDau.getX()][batDau.getY()];
Log.e("ERROR",""+ batDau.getX()+batDau.getY()+ketThuc.getX()+ketThuc.getY());
mangQuanCo[batDau.getX()][batDau.getY()]='0';
mangQuanCo[ketThuc.getX()][ketThuc.getY()] = quanCo;
//Kiểm tra điều kiện bắt chốt
if((Chot.IsQuanChot(quanCo))&& (quanBenNao==QUAN_NGUOI_CHOI))
{
if(ketThuc.getY()>0 && Character.isUpperCase(mangQuanCo[ketThuc.getX()][ketThuc.getY()-1])!=QUAN_NGUOI_CHOI && batDau.getX()==1 && ketThuc.getX()==3)
{
char tam = mangQuanCo[ketThuc.getX()][ketThuc.getY()-1];
if(Chot.IsQuanChot(tam))
BAT_CHOT_QUA_DUONG_MAY = true;
if(BAT_CHOT_QUA_DUONG)
BAT_CHOT_QUA_DUONG = false;
return;
}
if(ketThuc.getY()<7 && Character.isUpperCase(mangQuanCo[ketThuc.getX()][ketThuc.getY()+1])!=QUAN_NGUOI_CHOI&& batDau.getX()==1 && ketThuc.getX()==3)
{
char tam = mangQuanCo[ketThuc.getX()][ketThuc.getY()+1];
if(Chot.IsQuanChot(tam))
BAT_CHOT_QUA_DUONG_MAY = true;
if(BAT_CHOT_QUA_DUONG)
BAT_CHOT_QUA_DUONG = false;
return;
}
}
//Kiểm tra điều kiện bắt chốt
if((Chot.IsQuanChot(quanCo))&& (quanBenNao==!QUAN_NGUOI_CHOI))
{
if(ketThuc.getY()>0 && Character.isUpperCase(mangQuanCo[ketThuc.getX()][ketThuc.getY()-1])==QUAN_NGUOI_CHOI && batDau.getX()==6 && ketThuc.getX()==4)
{
char tam = mangQuanCo[ketThuc.getX()][ketThuc.getY()-1];
if(Chot.IsQuanChot(tam))
BAT_CHOT_QUA_DUONG = true;
if(BAT_CHOT_QUA_DUONG_MAY)
BAT_CHOT_QUA_DUONG_MAY = false;
return;
}
if(ketThuc.getY()<7 && Character.isUpperCase(mangQuanCo[ketThuc.getX()][ketThuc.getY()+1])==QUAN_NGUOI_CHOI&& batDau.getX()==6 && ketThuc.getX()==4)
{
char tam = mangQuanCo[ketThuc.getX()][ketThuc.getY()+1];
if(Chot.IsQuanChot(tam))
BAT_CHOT_QUA_DUONG = true;
if(BAT_CHOT_QUA_DUONG_MAY)
BAT_CHOT_QUA_DUONG_MAY = false;
return;
}
}
//Trường hợp bắt chốt qua đường
if(batDau.getY()>0 && Character.isUpperCase(mangQuanCo[batDau.getX()][batDau.getY()-1])!=quanBenNao)
{
if((quanBenNao==QUAN_NGUOI_CHOI && BAT_CHOT_QUA_DUONG) ||(quanBenNao!=QUAN_NGUOI_CHOI && BAT_CHOT_QUA_DUONG_MAY))
{
char tam = mangQuanCo[batDau.getX()][batDau.getY()-1];
if(Chot.IsQuanChot(tam))
mangQuanCo[batDau.getX()][batDau.getY()-1] = '0';
}
}
if(batDau.getY()<7 && Character.isUpperCase(mangQuanCo[batDau.getX()][batDau.getY()+1])!=quanBenNao)
{
if((quanBenNao==QUAN_NGUOI_CHOI && BAT_CHOT_QUA_DUONG) ||(quanBenNao!=QUAN_NGUOI_CHOI && BAT_CHOT_QUA_DUONG_MAY))
{
char tam = mangQuanCo[batDau.getX()][batDau.getY()+1];
if(Chot.IsQuanChot(tam))
mangQuanCo[batDau.getX()][batDau.getY()+1] = '0';
}
}
//Trường hợp phong cấp chốt, mặc định là phong hậu
if((ketThuc.getX()==0 || ketThuc.getX()==7)&&Chot.IsQuanChot(quanCo))
{
mangQuanCo[ketThuc.getX()][ketThuc.getY()] = quanBenNao ?'H':'h';
}
//Cập nhật bắt chốt qua đường giả
if(quanBenNao==QUAN_NGUOI_CHOI)
{
BAT_CHOT_QUA_DUONG = false;
//Nhập thành xa quân trắng
if(batDau.getX()==0&& batDau.getY()==4 && ketThuc.getX() == 0 && ketThuc.getY()==2)
{
mangQuanCo[0][0]='0';
mangQuanCo[0][3]='X';
}
//Nhập thành gần quân trắng
else if(batDau.getX()==0&& batDau.getY()==4 && ketThuc.getX() == 0 && ketThuc.getY()==6)
{
mangQuanCo[0][7]='0';
mangQuanCo[0][5]='X';
}
//Nhập thành xa quân đen
else if(batDau.getX()==0&& batDau.getY()==3 && ketThuc.getX() == 0 && ketThuc.getY()==5)
{
mangQuanCo[0][7]='0';
mangQuanCo[0][4]='x';
}
//Nhập thành gần quân đen
else if(batDau.getX()==0&& batDau.getY()==3 && ketThuc.getX() == 0 && ketThuc.getY()==1)
{
mangQuanCo[0][0]='0';
mangQuanCo[0][2]='x';
}
}
else
{
BAT_CHOT_QUA_DUONG_MAY = false;
//Nhập thành xa quân trắng
if(batDau.getX()==7&& batDau.getY()==3 && ketThuc.getX() == 7 && ketThuc.getY()==5)
{
mangQuanCo[7][7]='0';
mangQuanCo[7][4]='X';
}
//Nhập thành gần quân trắng
else if(batDau.getX()==7&& batDau.getY()==3 && ketThuc.getX() == 7 && ketThuc.getY()==1)
{
mangQuanCo[7][0]='0';
mangQuanCo[7][2]='X';
}
//Nhập thành xa quân đen
else if(batDau.getX()==7&& batDau.getY()==4 && ketThuc.getX() == 7 && ketThuc.getY()==2)
{
mangQuanCo[7][0]='0';
mangQuanCo[7][3]='x';
}
//Nhập thành gần quân đen
else if(batDau.getX()==7&& batDau.getY()==4 && ketThuc.getX() == 7 && ketThuc.getY()==6)
{
mangQuanCo[7][7]='0';
mangQuanCo[7][5]='x';
}
}
//Cập nhật nhập thành giả
if(quanBenNao == QUAN_NGUOI_CHOI)
{
if((quanCo=='X'&&mangQuanCo[0][0]=='0')||(quanCo=='x'&&mangQuanCo[0][0]=='0'))
{
XE_TRAI_DI_CHUYEN = true;
}
if((quanCo=='X'&&mangQuanCo[0][7]=='0')||(quanCo=='x'&&mangQuanCo[0][7]=='0'))
{
XE_PHAI_DI_CHUYEN = true;
}
if((quanCo=='V'&&mangQuanCo[0][4]=='0')||(quanCo=='v'&&mangQuanCo[0][3]=='0'))
{
VUA_DI_CHUYEN=true;
}
}
\