堆栈错误。推入堆栈的对象数组出来了。

时间:2013-02-21 07:05:45

标签: android

如上所述,我似乎对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;
            }
        }

\

0 个答案:

没有答案