Tin học Game Cờ Vua Trí Tuệ Nhân Tạo viết bằng PASCAL

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

upload_2019-2-27_21-32-30.png
Game này mình phải bỏ cả tuần mới viết được đó nha
Code này hơi rắc rối nên mình chia ra thành các file nhỏ, các bạn lưu theo hướng dẫn nha, nếu không thì Code không chạy được đâu

Code này các bạn lưu dưới tên CHESSAI.PAS
Mã:
 Program ChessAI;
 uses crt,dos;
 const
      Size = 7;
      Level = 2;

      Nguoi = -1;
      May = 1;

      Chon = 1;
      ChuanBi = 2;
      XuatPhat = 3;
      DiDen = 4;
      KeyIn = 5;

      Trong = 0;
      Xe = 1;
      Ma = 2;
      Tuong = 3;
      Vua = 4;
      Hau = 5;
      Tot = 6;

 type TOCo = object
      Quan: integer;
      NChoi: integer;
      Status: integer;
             end;

 type TBanCo = object
      OCo: array[1..8,1..8] of TOCo;
      Procedure InBanCo;
      Procedure Reset(stt: integer);
      Function DiVua(x,y,NC: integer): integer;
      Function DiHau(x,y,NC: integer): integer;
      Function DiXe(x,y,NC: integer): integer;
      Function DiMa(x,y,NC: integer): integer;
      Function DiTuong(x,y,NC: integer): integer;
      Function DiTot(x,y,NC: integer): integer;
      Function DiChuyen(x,y: integer): integer;
      Function DiCo(x1,y1,x2,y2: integer): integer;
      Procedure VeVua(x,y: integer);
      Procedure VeHau(x,y: integer);
      Procedure VeXe(x,y: integer);
      Procedure VeMa(x,y: integer);
      Procedure VeTuong(x,y: integer);
      Procedure VeTot(x,y: integer);
      Procedure VeCo(x,y: integer);
      Procedure PhongCap(x,y: integer);
               end;
 var
    BanCo: array[0..Level] of TBanCo;
    Dachon: Boolean;
    cx,cy,kx,ky: integer;
    ls,winer: integer;

 procedure setcusor(bot,top: byte);
 var regs : registers;
 begin
 regs.ah :=1;
 regs.ch:=bot;
 regs.cl:=top;
 intr($10,regs);
 end;

 {$I VEQUAN.INC}

 Procedure TBanCo.InBanCo;
 var i,j,x,y: integer;
 Begin
      Textbackground(Black);
      Setcusor(32,0);
      for x := 1 to 8 do
          for y := 1 to 8 do
          begin
               if (x+y) mod 2 = 0 then textBackground(White)
               else textBackground(Red);
               if (OCo[x,y].Status = Chon) or (OCo[x,y].Status = XuatPhat)
               then textBackground(Cyan)
               else
               if (OCo[x,y].Status = Chuanbi) or (OCo[x,y].Status = DiDen)
               then textBackground(13)
               else
               if (OCo[x,y].Status = KeyIn) then TextBackground(Blue);
               for i := 1 to Size do
                   for j := 1 to size div 2 do
                   begin
                   gotoxy((x-1)*size+i+2,(y-1)*(size div 2) +j);
                   write(' ');
                   end;
          if OCo[x,y].NChoi = Nguoi then
          Textcolor(Green) else TextColor(Black);
          VeCo(x,y);
          end;
 End;

 Procedure TBanCo.Reset(stt: integer);
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          if OCo[i,j].Status = stt then
             OCo[i,j].Status := Trong;
 End;

 Procedure TBanCo.PhongCap(x,y: integer);
 var q: integer;
 Begin
      if OCo[x,y].Quan = Tot then
      begin
           if (OCo[x,y].NChoi = May) and (y = 8) then
           begin
                OCo[x,y].Quan := Hau;
                clrscr;
                InBanCo;
           end
           else
           if (OCo[x,y].NChoi = Nguoi) and (y = 1) then
           begin
                TextBackGround(Black);
                clrscr;
                TextColor(LightRed);
                Gotoxy(2,2);Write('1. Xe');
                Gotoxy(2,3);Write('2. Ma');
                Gotoxy(2,4);Write('3. Tuong');
                Gotoxy(2,5);Write('4. Hau');
                Gotoxy(2,6);
                repeat readln(q);until q in [1..4];
                if q = 4 then q := Hau;
                OCo[x,y].Quan := q;
                clrscr;
                InBanCo;
           end;
      end;
 End;
 {$I AICHESS.INC}
 {$I DCCHESS.INC}

 Procedure KhoiTao;
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          begin
              BanCo[0].OCo[i,j].Quan := Trong;
              BanCo[0].OCo[i,j].Status := Trong;
              BanCo[0].Oco[i,j].NChoi := Trong;
          end;
      for i := 1 to 8 do
      begin
           if i <= 5 then
           BanCo[0].Oco[i,1].Quan := i
           else BanCo[0].Oco[i,1].Quan := 9-i;
           BanCo[0].OCo[i,1].NChoi := May;
           if i <= 5 then
           BanCo[0].Oco[i,8].Quan := i
           else BanCo[0].Oco[i,8].Quan := 9-i;
           BanCo[0].OCo[i,8].NChoi := Nguoi;
           for j := 1 to 8 do
           begin
                BanCo[0].OCo[i,2].Quan := Tot;
                BanCo[0].OCo[i,2].Nchoi := May;
                BanCo[0].OCo[i,7].Quan := Tot;
                BanCo[0].OCo[i,7].NChoi := Nguoi;
           end;
      end;
 End;

 Procedure KeyEvent;
 var k: char;
     x,y,d: integer;
 Begin
      repeat
      k := #0;
      if keypressed then k := readkey;
      case k of
      #72: if ky > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #80: if ky < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #75: if kx > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #77: if kx < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
             end;
      if k <> #0 then BanCo[0].InBanCo;
      x := kx;y := ky;
      if k = #13 then
      begin
           if (BanCo[0].OCo[x,y].Quan <> Trong) and
           (LS <> Chon)
           and (BanCo[0].OCo[x,y].NChoi = Nguoi) and not DaChon then
           begin
                BanCo[0].OCo[x,y].Status := Chon;
                LS := Chon;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].ReSet(XuatPhat);
                BanCo[0].ReSet(DiDen);
                DaChon := True;
                cx := x;
                cy := y;
                BanCo[0].DiChuyen(x,y);
                BanCo[0].InBanCo;
           end
           else
           if LS = Chon then
           begin
                BanCo[0].OCo[x,y].Status := Trong;
                LS := Trong;
                DaChon := False;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].InBanCo;
           end
           else if LS = ChuanBi then
           begin
                d := BanCo[0].DiCo(cx,cy,x,y);
                BanCo[0].Reset(ChuanBi);
                BanCo[0].Reset(XuatPhat);
                BanCo[0].Reset(DiDen);
                Dachon := False;
                BanCo[0].InBanCo;
                BanCo[0].PhongCap(x,y);
                BanCo[0].OCo[kx,ky].Status := KeyIn;
                if d <> diem[vua] then
                begin
                     TextColor(Red+Blink);TextBackground(Black);
                     Gotoxy(Size*8+4,5);write('Computer Thinking...');
                     d := AI.DiChuyenAI;
                     BanCo[0].InBanCo;
                     if d = Diem[Vua] then winer := May;
                     Gotoxy(Size*8+4,5);
                     textBackground(Black);
                     clreol;
                end
                else winer := Nguoi;
           end;
      end;
      until (k = #27) or (winer <> 0);
      if k <> #27 then
      begin
           Delay(2000);clrscr;Gotoxy(20,10);TextColor(Red);
           if winer = May then write('Y O U  L O S E')
           else write('Y O U   W I N');
           readln;
      end;
 End;

 BEGIN
      TextBackground(Black);
      Dachon := False;
      clrscr;
      KhoiTao;
      kx := 1;ky := 8;
      Ls := Trong;
      winer := 0;
      BanCo[0].OCo[kx,ky].Status :=  KeyIn;
      BanCo[0].InBanCo;
      KeyEvent;
 END.
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên AICHESS.INC
Mã:
const
    Diem: array[Xe..Tot] of integer = (60,35,35,900,120,10);
    MVua: array[1..8,1..8] of real =
    ((-3,-3,-3,-3,-2,-1,2,2),(-4,-4,-4,-4,-3,-2,2,3),
     (-4,-4,-4,-4,-3,-2,0,1),(-5,-5,-5,-5,-4,-2,0,0),
     (-5,-5,-5,-5,-4,-2,0,0),(-4,-4,-4,-4,-3,-2,0,1),
     (-4,-4,-4,-4,-3,-2,2,3),(-3,-3,-3,-3,-2,-1,2,2));
    
    MHau: array[1..8,1..8] of real =
    ((-2,-1,-1,-0.5,0,-1,-1,-2),(-1,0,0,0,0,0.5,0,-1),
     (-1,0,0.5,0.5,0.5,0.5,0.5,-1),(-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),
     (-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),(-1,0,0.5,0.5,0.5,0.5,0,-1),
     (-1,0,0,0,0,0.5,0,-1),(-2,-1,-1,-0.5,0,-1,-1,-2));

    MXe: array[1..8,1..8] of real =
    ((0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,1,0,0,0,0,0,0.5),
     (0,1,0,0,0,0,0,0.5),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0));

    MTuong: array[1..8,1..8] of real =
    ((-2,-1,-1,-1,-1,-1,-1,-2),(-1,0,0,0.5,0,1,0.5,-1),
     (-1,0,0.5,0.5,1,1,0,-1),(-1,0,1,1,1,1,0,-1),
     (-1,0,1,1,1,1,0,-1),(-1,0,0.5,0.5,1,1,0,-1),
     (-1,0,0,0.5,0,1,0.5,-1),(-2,-1,-1,-1,-1,-1,-1,-2));

    MMa: array[1..8,1..8] of real =
    ((-5,-4,-3,-3,-3,-3,-4,-5),(-4,-2,0,0.5,0,0.5,-2,-4),
     (-3,0,1,1.5,1.5,1,0,-3),(-3,0,1.5,2,2,1.5,0.5,-3),
     (-3,0,1.5,2,2,1.5,0.5,-3),(-3,0,1,1.5,1.5,1,0,-3),
     (-4,-2,0,0.5,0,0.5,-2,-4),(-5,-4,-3,-3,-3,-3,-4,-5));

    MTot: array[1..8,1..8] of real =
    ((0,5,1,0.5,0,0.5,0.5,90),(0,5,1,0.5,0,0.5,0.5,90),
     (0,5,2,1,0,-1,1,90),(0,5,3,2.5,2,0,-2,90),
     (0,5,3,2.5,2,0,-2,90),(0,5,2,1,0,-1,1,90),
     (0,5,1,0.5,0,0.5,0.5,90),(0,5,1,0.5,0,0.5,0.5,90));
type TAI = object
    Function TinhDiem(x,y,quan: integer): real;
    Function DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
    Function ChuanBiAI(bc,nc: integer): real;
    Function DiChuyenAI: integer;
        end;
var dx1,dy1,dx0,dy0: longint;
    AI: TAI;
    
Function TAI.TinhDiem(x,y,quan: integer): real;
Begin
    case quan of
    Vua: Tinhdiem := MVua[x,y];
    Hau: Tinhdiem := MHau[x,y];
    Xe: Tinhdiem := MXe[x,y];
    Tuong: Tinhdiem := MTuong[x,y];
    Ma: Tinhdiem := MMa[x,y];
    Tot: Tinhdiem := MTot[x,y];
            end;
End;

Function TAI.DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
var b: TBanCo;
    i,j,k,quan: integer;
    d,max: real;
Begin
    max := -9999;
    k := 0;
    b := BanCo[bc];
    quan := b.OCo[x,y].Quan;
    for i := 1 to 8 do
        for j := 1 to 8 do
        if (BanCo[bc].OCo[i,j].Status = ChuanBi) then
        begin
            if nc = May then
            d := TinhDiem(i,j,quan)
            else d := TinhDiem(i,9-j,quan);
            d := d + BanCo[bc].DiCo(x,y,i,j);
            BanCo[bc].Reset(ChuanBi);
            if bc + 1 <= level then
            d := d - ChuanBiAI(bc+1,-nc);
            if d > max then
            begin
            max := d;
            if (bc = 1) and (max > mx) then
            begin
                dx1 := i;dy1 := j;
            end;
            end;
            BanCo[bc] := b;
            inc(k); if k >= soco then begin i:=8;j:=8;end;
        end;
    DiCoAI := max;
End;

Function TAI.ChuanBiAI(bc,nc: integer): real;
var i,j,cb: integer;
    d,max: real;
Begin
    BanCo[bc] := BanCo[bc-1];
    BanCo[bc].Reset(ChuanBi);
    max := -9999;
    for i := 1 to 8 do
        for j := 1 to 8 do
        begin
            if BanCo[bc].OCo[i,j].NChoi = nc then
            begin
            cb := BanCo[bc].DiChuyen(i,j);
            if cb > 0 then
                        begin
            d := DiCoAI(i,j,bc,cb,nc,max);
            if d > max then
            begin
                max := d;
                if bc = 1 then
                begin
                    dx0 := i;dy0 := j;
                end;
            end;
            end;
            BanCo[bc].Reset(ChuanBi);
                        end;
        end;
    ChuanBiAI := max;
End;

Function TAI.DiChuyenAI: integer;
var dc: integer;
Begin
    ChuanBiAI(1,May);
    dc := BanCo[0].DiCo(dx0,dy0,dx1,dy1);
    BanCo[0].PhongCap(dx1,dy1);
    DiChuyenAI := dc;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên DCCHESS.INC
Mã:
 Function TBanCo.DiVua(x,y,NC: integer): integer;
 var dem: integer;
 Begin
     dem := 0;
      if ((x > 1) and (y > 1)) and (OCo[x-1,y-1].NChoi <> NC)
      then begin OCo[x-1,y-1].Status := ChuanBi;inc(dem);end;
      if ((y > 1)) and (OCo[x,y-1].NChoi <> NC)
      then begin OCo[x,y-1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y > 1)) and (OCo[x+1,y-1].NChoi <> NC)
      then begin OCo[x+1,y-1].Status := ChuanBi;inc(dem);end;
      if ((x > 1) and (y < 8)) and (OCo[x-1,y+1].NChoi <> NC)
      then begin OCo[x-1,y+1].Status := ChuanBi;inc(dem);end;
      if ((y < 8)) and (OCo[x,y+1].NChoi <> NC)
      then begin OCo[x,y+1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y < 8)) and (OCo[x+1,y+1].NChoi <> NC)
      then begin OCo[x+1,y+1].Status := ChuanBi;inc(dem);end;
      if ((x > 1)) and (OCo[x-1,y].NChoi <> NC)
      then begin OCo[x-1,y].Status := ChuanBi;inc(dem);end;
      if ((x < 8)) and (OCo[x+1,y].NChoi <> NC)
      then begin OCo[x+1,y].Status := ChuanBi;inc(dem);end;
    DiVua := Dem;
 End;

 Function TBanCo.DiHau(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem:=0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;

      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiHau := Dem;
 End;

 Function TBanCo.DiXe(x,y,NC: integer): integer;
 var i,dem: integer;
 Begin
    dem := 0;
      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiXe := Dem;
 End;

 Function TBanCo.DiMa(x,y,NC: integer): integer;
 var dem: integer;
 Begin
      dem := 0;
      if (x > 2) and (y > 1) then
      if (OCo[x-2,y-1].NChoi <> NC) then
    begin OCo[x-2,y-1].Status := ChuanBi;inc(dem);end;
      if (x > 2) and (y < 8) then
      if (OCo[x-2,y+1].NChoi <> NC) then
    begin OCo[x-2,y+1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y > 1) then
      if (OCo[x+2,y-1].NChoi <> NC) then
    begin OCo[x+2,y-1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y < 8) then
      if (OCo[x+2,y+1].NChoi <> NC) then
    begin OCo[x+2,y+1].Status := ChuanBi;inc(dem);end;

      if (x > 1) and (y > 2) then
      if (OCo[x-1,y-2].NChoi <> NC) then
    begin OCo[x-1,y-2].Status := ChuanBi;inc(dem);end;
      if (x > 1) and (y < 7) then
      if (OCo[x-1,y+2].NChoi <> NC) then
    begin OCo[x-1,y+2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y > 2) then
      if (OCo[x+1,y-2].NChoi <> NC) then
    begin OCo[x+1,y-2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y < 7) then
      if (OCo[x+1,y+2].NChoi <> NC) then
    begin OCo[x+1,y+2].Status := ChuanBi;inc(dem);end;
    DiMa := Dem;
 End;

 Function TBanCo.DiTuong(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem := 0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
    DiTuong := Dem;
 End;

 Function TBanCo.DiTot(x,y,NC: integer): integer;
 var dem: integer;
 Begin
    dem := 0;
      if OCo[x,y+NC].NChoi = Trong then
      begin
           OCo[x,y+NC].Status := ChuanBi;inc(dem);
           if ((y = 2) or (y = 7)) and (OCo[x,y+NC*2].NChoi = Trong) then
           begin OCo[x,y+NC*2].Status := ChuanBi;inc(dem);end;
      end;
      if (OCo[x-1,y+NC].NChoi <> NC) and
      (OCo[x-1,y+NC].NChoi <> Trong) then
    begin OCo[x-1,y+NC].Status := ChuanBi;inc(dem);end;
      if (OCo[x+1,y+NC].NChoi <> NC) and
      (OCo[x+1,y+NC].NChoi <> Trong) then
    begin OCo[x+1,y+NC].Status := ChuanBi;inc(dem);end;
    DiTot := Dem;
 End;

 Function TBanCo.DiChuyen(x,y: integer): integer;
 var NC: integer;
 Begin
      NC := OCo[x,y].NChoi;
      case OCo[x,y].quan of
      Vua: DiChuyen := DiVua(x,y,NC);
      Hau: DiChuyen := DiHau(x,y,NC);
      Xe: DiChuyen := DiXe(x,y,NC);
      Ma: DiChuyen := DiMa(x,y,NC);
      Tuong: DiChuyen := DiTuong(x,y,NC);
      Tot: DiChuyen := DiTot(x,y,NC);
                end;
 End;

Function TBanCo.DiCo(x1,y1,x2,y2: integer): integer;
var d: integer;
Begin
    d := 0;
    if OCo[x2,y2].Quan <> Trong then d := Diem[OCo[x2,y2].Quan];
    OCo[x2,y2].Quan := OCo[x1,y1].Quan;
    OCo[x2,y2].NChoi := OCo[x1,y1].Nchoi;
    OCo[x2,y2].Status := DiDen;
    OCo[x1,y1].Quan := Trong;
    OCo[x1,y1].NChoi := Trong;
    OCo[x1,y1].Status := XuatPhat;
    DiCo := d;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên VEQUAN.INC
Mã:
Procedure TBanCo.VeVua(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#95#22#254#22#95);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#92#30#30#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeHau(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#92#30#179#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeXe(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#219#32#219#32#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeMa(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#222#223#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#222#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTuong(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32#32#234);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#254#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTot(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32+#32+#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeCo(x,y: integer);
var quan: integer;
Begin
    quan := OCo[x,y].Quan;
    case Quan of
    Vua: VeVua(x,y);
    Hau: VeHau(x,y);
    Xe: VeXe(x,y);
    tuong: VeTuong(x,y);
    Ma: VeMa(x,y);
    Tot: VeTot(x,y);
            end;
End;

Các bạn có thể thay đổi level để tăng độ thông minh cho máy, nhưng level càng cáo nó chạy càng lâu nha.
Máy mình chạy level 2 là ok, còn hơn thì chạy không nổi.
upload_2019-2-27_21-41-5.png
 
Last edited:

ngochuyen_74

Học sinh chăm học
Thành viên
7 Tháng mười hai 2017
343
454
114
Hà Nội
THPT Ứng Hòa A
View attachment 103442
Game này mình phải bỏ cả tuần mới viết được đó nha
Code này hơi rắc rối nên mình chia ra thành các file nhỏ, các bạn lưu theo hướng dẫn nha, nếu không thì Code không chạy được đâu

Code này các bạn lưu dưới tên CHESSAI.PAS
Mã:
 Program ChessAI;
 uses crt,dos;
 const
      Size = 7;
      Level = 2;

      Nguoi = -1;
      May = 1;

      Chon = 1;
      ChuanBi = 2;
      XuatPhat = 3;
      DiDen = 4;
      KeyIn = 5;

      Trong = 0;
      Xe = 1;
      Ma = 2;
      Tuong = 3;
      Vua = 4;
      Hau = 5;
      Tot = 6;

 type TOCo = object
      Quan: integer;
      NChoi: integer;
      Status: integer;
             end;

 type TBanCo = object
      OCo: array[1..8,1..8] of TOCo;
      Procedure InBanCo;
      Procedure Reset(stt: integer);
      Function DiVua(x,y,NC: integer): integer;
      Function DiHau(x,y,NC: integer): integer;
      Function DiXe(x,y,NC: integer): integer;
      Function DiMa(x,y,NC: integer): integer;
      Function DiTuong(x,y,NC: integer): integer;
      Function DiTot(x,y,NC: integer): integer;
      Function DiChuyen(x,y: integer): integer;
      Function DiCo(x1,y1,x2,y2: integer): integer;
      Procedure VeVua(x,y: integer);
      Procedure VeHau(x,y: integer);
      Procedure VeXe(x,y: integer);
      Procedure VeMa(x,y: integer);
      Procedure VeTuong(x,y: integer);
      Procedure VeTot(x,y: integer);
      Procedure VeCo(x,y: integer);
      Procedure PhongCap(x,y: integer);
               end;
 var
    BanCo: array[0..Level] of TBanCo;
    Dachon: Boolean;
    cx,cy,kx,ky: integer;
    ls,winer: integer;

 procedure setcusor(bot,top: byte);
 var regs : registers;
 begin
 regs.ah :=1;
 regs.ch:=bot;
 regs.cl:=top;
 intr($10,regs);
 end;

 {$I VEQUAN.INC}

 Procedure TBanCo.InBanCo;
 var i,j,x,y: integer;
 Begin
      Textbackground(Black);
      Setcusor(32,0);
      for x := 1 to 8 do
          for y := 1 to 8 do
          begin
               if (x+y) mod 2 = 0 then textBackground(White)
               else textBackground(Red);
               if (OCo[x,y].Status = Chon) or (OCo[x,y].Status = XuatPhat)
               then textBackground(Cyan)
               else
               if (OCo[x,y].Status = Chuanbi) or (OCo[x,y].Status = DiDen)
               then textBackground(13)
               else
               if (OCo[x,y].Status = KeyIn) then TextBackground(Blue);
               for i := 1 to Size do
                   for j := 1 to size div 2 do
                   begin
                   gotoxy((x-1)*size+i+2,(y-1)*(size div 2) +j);
                   write(' ');
                   end;
          if OCo[x,y].NChoi = Nguoi then
          Textcolor(Green) else TextColor(Black);
          VeCo(x,y);
          end;
 End;

 Procedure TBanCo.Reset(stt: integer);
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          if OCo[i,j].Status = stt then
             OCo[i,j].Status := Trong;
 End;

 Procedure TBanCo.PhongCap(x,y: integer);
 var q: integer;
 Begin
      if OCo[x,y].Quan = Tot then
      begin
           if (OCo[x,y].NChoi = May) and (y = 8) then
           begin
                OCo[x,y].Quan := Hau;
                clrscr;
                InBanCo;
           end
           else
           if (OCo[x,y].NChoi = Nguoi) and (y = 1) then
           begin
                TextBackGround(Black);
                clrscr;
                TextColor(LightRed);
                Gotoxy(2,2);Write('1. Xe');
                Gotoxy(2,3);Write('2. Ma');
                Gotoxy(2,4);Write('3. Tuong');
                Gotoxy(2,5);Write('4. Hau');
                Gotoxy(2,6);
                repeat readln(q);until q in [1..4];
                if q = 4 then q := Hau;
                OCo[x,y].Quan := q;
                clrscr;
                InBanCo;
           end;
      end;
 End;
 {$I AICHESS.INC}
 {$I DCCHESS.INC}

 Procedure KhoiTao;
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          begin
              BanCo[0].OCo[i,j].Quan := Trong;
              BanCo[0].OCo[i,j].Status := Trong;
              BanCo[0].Oco[i,j].NChoi := Trong;
          end;
      for i := 1 to 8 do
      begin
           if i <= 5 then
           BanCo[0].Oco[i,1].Quan := i
           else BanCo[0].Oco[i,1].Quan := 9-i;
           BanCo[0].OCo[i,1].NChoi := May;
           if i <= 5 then
           BanCo[0].Oco[i,8].Quan := i
           else BanCo[0].Oco[i,8].Quan := 9-i;
           BanCo[0].OCo[i,8].NChoi := Nguoi;
           for j := 1 to 8 do
           begin
                BanCo[0].OCo[i,2].Quan := Tot;
                BanCo[0].OCo[i,2].Nchoi := May;
                BanCo[0].OCo[i,7].Quan := Tot;
                BanCo[0].OCo[i,7].NChoi := Nguoi;
           end;
      end;
 End;

 Procedure KeyEvent;
 var k: char;
     x,y,d: integer;
 Begin
      repeat
      k := #0;
      if keypressed then k := readkey;
      case k of
      #72: if ky > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #80: if ky < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #75: if kx > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #77: if kx < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
             end;
      if k <> #0 then BanCo[0].InBanCo;
      x := kx;y := ky;
      if k = #13 then
      begin
           if (BanCo[0].OCo[x,y].Quan <> Trong) and
           (LS <> Chon)
           and (BanCo[0].OCo[x,y].NChoi = Nguoi) and not DaChon then
           begin
                BanCo[0].OCo[x,y].Status := Chon;
                LS := Chon;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].ReSet(XuatPhat);
                BanCo[0].ReSet(DiDen);
                DaChon := True;
                cx := x;
                cy := y;
                BanCo[0].DiChuyen(x,y);
                BanCo[0].InBanCo;
           end
           else
           if LS = Chon then
           begin
                BanCo[0].OCo[x,y].Status := Trong;
                LS := Trong;
                DaChon := False;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].InBanCo;
           end
           else if LS = ChuanBi then
           begin
                d := BanCo[0].DiCo(cx,cy,x,y);
                BanCo[0].Reset(ChuanBi);
                BanCo[0].Reset(XuatPhat);
                BanCo[0].Reset(DiDen);
                Dachon := False;
                BanCo[0].InBanCo;
                BanCo[0].PhongCap(x,y);
                BanCo[0].OCo[kx,ky].Status := KeyIn;
                if d <> diem[vua] then
                begin
                     TextColor(Red+Blink);TextBackground(Black);
                     Gotoxy(Size*8+4,5);write('Computer Thinking...');
                     d := AI.DiChuyenAI;
                     BanCo[0].InBanCo;
                     if d = Diem[Vua] then winer := May;
                     Gotoxy(Size*8+4,5);
                     textBackground(Black);
                     clreol;
                end
                else winer := Nguoi;
           end;
      end;
      until (k = #27) or (winer <> 0);
      if k <> #27 then
      begin
           Delay(2000);clrscr;Gotoxy(20,10);TextColor(Red);
           if winer = May then write('Y O U  L O S E')
           else write('Y O U   W I N');
           readln;
      end;
 End;

 BEGIN
      TextBackground(Black);
      Dachon := False;
      clrscr;
      KhoiTao;
      kx := 1;ky := 8;
      Ls := Trong;
      winer := 0;
      BanCo[0].OCo[kx,ky].Status :=  KeyIn;
      BanCo[0].InBanCo;
      KeyEvent;
 END.
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên AICHESS.INC
Mã:
const
    Diem: array[Xe..Tot] of integer = (60,35,35,900,120,10);
    MVua: array[1..8,1..8] of real =
    ((-3,-3,-3,-3,-2,-1,2,2),(-4,-4,-4,-4,-3,-2,2,3),
     (-4,-4,-4,-4,-3,-2,0,1),(-5,-5,-5,-5,-4,-2,0,0),
     (-5,-5,-5,-5,-4,-2,0,0),(-4,-4,-4,-4,-3,-2,0,1),
     (-4,-4,-4,-4,-3,-2,2,3),(-3,-3,-3,-3,-2,-1,2,2));
   
    MHau: array[1..8,1..8] of real =
    ((-2,-1,-1,-0.5,0,-1,-1,-2),(-1,0,0,0,0,0.5,0,-1),
     (-1,0,0.5,0.5,0.5,0.5,0.5,-1),(-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),
     (-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),(-1,0,0.5,0.5,0.5,0.5,0,-1),
     (-1,0,0,0,0,0.5,0,-1),(-2,-1,-1,-0.5,0,-1,-1,-2));

    MXe: array[1..8,1..8] of real =
    ((0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,1,0,0,0,0,0,0.5),
     (0,1,0,0,0,0,0,0.5),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0));

    MTuong: array[1..8,1..8] of real =
    ((-2,-1,-1,-1,-1,-1,-1,-2),(-1,0,0,0.5,0,1,0.5,-1),
     (-1,0,0.5,0.5,1,1,0,-1),(-1,0,1,1,1,1,0,-1),
     (-1,0,1,1,1,1,0,-1),(-1,0,0.5,0.5,1,1,0,-1),
     (-1,0,0,0.5,0,1,0.5,-1),(-2,-1,-1,-1,-1,-1,-1,-2));

    MMa: array[1..8,1..8] of real =
    ((-5,-4,-3,-3,-3,-3,-4,-5),(-4,-2,0,0.5,0,0.5,-2,-4),
     (-3,0,1,1.5,1.5,1,0,-3),(-3,0,1.5,2,2,1.5,0.5,-3),
     (-3,0,1.5,2,2,1.5,0.5,-3),(-3,0,1,1.5,1.5,1,0,-3),
     (-4,-2,0,0.5,0,0.5,-2,-4),(-5,-4,-3,-3,-3,-3,-4,-5));

    MTot: array[1..8,1..8] of real =
    ((0,5,1,0.5,0,0.5,0.5,0),(0,5,1,0.5,0,0.5,0.5,0),
     (0,5,2,1,0,-1,1,0),(0,5,3,2.5,2,0,-2,0),
     (0,5,3,2.5,2,0,-2,0),(0,5,2,1,0,-1,1,0),
     (0,5,1,0.5,0,0.5,0.5,0),(0,5,1,0.5,0,0.5,0.5,0));
type TAI = object
    Function TinhDiem(x,y,quan: integer): real;
    Function DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
    Function ChuanBiAI(bc,nc: integer): real;
    Function DiChuyenAI: integer;
        end;
var x1,y1,x2,y2: integer;
    AI: TAI;
   
Function TAI.TinhDiem(x,y,quan: integer): real;
Begin
    case quan of
    Vua: Tinhdiem := MVua[x,y];
    Hau: Tinhdiem := MHau[x,y];
    Xe: Tinhdiem := MXe[x,y];
    Tuong: Tinhdiem := MTuong[x,y];
    Ma: Tinhdiem := MMa[x,y];
    Tot: Tinhdiem := MTot[x,y];
            end;
End;

Function TAI.DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
var b: TBanCo;
    i,j,k,quan: integer;
    d,max: real;
Begin
    max := -9999;
    k := 0;
    b := BanCo[bc];
    quan := b.OCo[x,y].Quan;
    for i := 1 to 8 do
        for j := 1 to 8 do
        if (BanCo[bc].OCo[i,j].Status = ChuanBi) then
        begin
            d := TinhDiem(i,j,quan) + BanCo[bc].DiCo(x,y,i,j);
            BanCo[bc].Reset(ChuanBi);
            if bc + 1 <= level then
            d := d - ChuanBiAI(bc+1,-nc);
            if d > max then
            begin
            max := d;
            if (bc = 1) and (max > mx) then
            begin
                x2 := i;y2 := j;
            end;
            end;
            BanCo[bc] := b;
        end;
    DiCoAI := max;
End;

Function TAI.ChuanBiAI(bc,nc: integer): real;
var i,j,cb: integer;
    d,max: real;
Begin
    BanCo[bc] := BanCo[bc-1];
    BanCo[bc].Reset(ChuanBi);
    max := -9999;
    for i := 1 to 8 do
        for j := 1 to 8 do
        begin
            if BanCo[bc].OCo[i,j].NChoi = nc then
            begin
            cb := BanCo[bc].DiChuyen(i,j);
            if cb > 0 then
                        begin
            d := DiCoAI(i,j,bc,cb,nc,max);
            if d > max then
            begin
                max := d;
                if bc = 1 then
                begin
                    x1 := i;y1 := j;
                end;
            end;
            end;
            BanCo[bc].Reset(ChuanBi);
                        end;
        end;
    if bc = 1 then
    max := BanCo[0].DiCo(x1,y1,x2,y2);
    ChuanBiAI := max;
End;
Function TAI.DiChuyenAI: integer;
var dc: integer;
Begin
    dc := 0;
    dc := trunc(ChuanBiAI(1,May));
    DiChuyenAI := dc;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên DCCHESS.INC
Mã:
 Function TBanCo.DiVua(x,y,NC: integer): integer;
 var dem: integer;
 Begin
     dem := 0;
      if ((x > 1) and (y > 1)) and (OCo[x-1,y-1].NChoi <> NC)
      then begin OCo[x-1,y-1].Status := ChuanBi;inc(dem);end;
      if ((y > 1)) and (OCo[x,y-1].NChoi <> NC)
      then begin OCo[x,y-1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y > 1)) and (OCo[x+1,y-1].NChoi <> NC)
      then begin OCo[x+1,y-1].Status := ChuanBi;inc(dem);end;
      if ((x > 1) and (y < 8)) and (OCo[x-1,y+1].NChoi <> NC)
      then begin OCo[x-1,y+1].Status := ChuanBi;inc(dem);end;
      if ((y < 8)) and (OCo[x,y+1].NChoi <> NC)
      then begin OCo[x,y+1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y < 8)) and (OCo[x+1,y+1].NChoi <> NC)
      then begin OCo[x+1,y+1].Status := ChuanBi;inc(dem);end;
      if ((x > 1)) and (OCo[x-1,y].NChoi <> NC)
      then begin OCo[x-1,y].Status := ChuanBi;inc(dem);end;
      if ((x < 8)) and (OCo[x+1,y].NChoi <> NC)
      then begin OCo[x+1,y].Status := ChuanBi;inc(dem);end;
    DiVua := Dem;
 End;

 Function TBanCo.DiHau(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem:=0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;

      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiHau := Dem;
 End;

 Function TBanCo.DiXe(x,y,NC: integer): integer;
 var i,dem: integer;
 Begin
    dem := 0;
      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiXe := Dem;
 End;

 Function TBanCo.DiMa(x,y,NC: integer): integer;
 var dem: integer;
 Begin
      dem := 0;
      if (x > 2) and (y > 1) then
      if (OCo[x-2,y-1].NChoi <> NC) then
    begin OCo[x-2,y-1].Status := ChuanBi;inc(dem);end;
      if (x > 2) and (y < 8) then
      if (OCo[x-2,y+1].NChoi <> NC) then
    begin OCo[x-2,y+1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y > 1) then
      if (OCo[x+2,y-1].NChoi <> NC) then
    begin OCo[x+2,y-1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y < 8) then
      if (OCo[x+2,y+1].NChoi <> NC) then
    begin OCo[x+2,y+1].Status := ChuanBi;inc(dem);end;

      if (x > 1) and (y > 2) then
      if (OCo[x-1,y-2].NChoi <> NC) then
    begin OCo[x-1,y-2].Status := ChuanBi;inc(dem);end;
      if (x > 1) and (y < 7) then
      if (OCo[x-1,y+2].NChoi <> NC) then
    begin OCo[x-1,y+2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y > 2) then
      if (OCo[x+1,y-2].NChoi <> NC) then
    begin OCo[x+1,y-2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y < 7) then
      if (OCo[x+1,y+2].NChoi <> NC) then
    begin OCo[x+1,y+2].Status := ChuanBi;inc(dem);end;
    DiMa := Dem;
 End;

 Function TBanCo.DiTuong(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem := 0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
    DiTuong := Dem;
 End;

 Function TBanCo.DiTot(x,y,NC: integer): integer;
 var dem: integer;
 Begin
    dem := 0;
      if OCo[x,y+NC].NChoi = Trong then
      begin
           OCo[x,y+NC].Status := ChuanBi;inc(dem);
           if ((y = 2) or (y = 7)) and (OCo[x,y+NC*2].NChoi = Trong) then
           begin OCo[x,y+NC*2].Status := ChuanBi;inc(dem);end;
      end;
      if (OCo[x-1,y+NC].NChoi <> NC) and
      (OCo[x-1,y+NC].NChoi <> Trong) then
    begin OCo[x-1,y+NC].Status := ChuanBi;inc(dem);end;
      if (OCo[x+1,y+NC].NChoi <> NC) and
      (OCo[x+1,y+NC].NChoi <> Trong) then
    begin OCo[x+1,y+NC].Status := ChuanBi;inc(dem);end;
    DiTot := Dem;
 End;

 Function TBanCo.DiChuyen(x,y: integer): integer;
 var NC: integer;
 Begin
      NC := OCo[x,y].NChoi;
      case OCo[x,y].quan of
      Vua: DiChuyen := DiVua(x,y,NC);
      Hau: DiChuyen := DiHau(x,y,NC);
      Xe: DiChuyen := DiXe(x,y,NC);
      Ma: DiChuyen := DiMa(x,y,NC);
      Tuong: DiChuyen := DiTuong(x,y,NC);
      Tot: DiChuyen := DiTot(x,y,NC);
                end;
 End;

Function TBanCo.DiCo(x1,y1,x2,y2: integer): integer;
var d: integer;
Begin
    d := 0;
    if OCo[x2,y2].Quan <> Trong then d := Diem[OCo[x2,y2].Quan];
    OCo[x2,y2].Quan := OCo[x1,y1].Quan;
    OCo[x2,y2].NChoi := OCo[x1,y1].Nchoi;
    OCo[x2,y2].Status := DiDen;
    OCo[x1,y1].Quan := Trong;
    OCo[x1,y1].NChoi := Trong;
    OCo[x1,y1].Status := XuatPhat;
    DiCo := d;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên VEQUAN.INC
Mã:
Procedure TBanCo.VeVua(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#95#22#254#22#95);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#92#30#30#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeHau(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#92#30#179#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeXe(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#219#32#219#32#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeMa(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#222#223#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#222#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTuong(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32#32#234);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#254#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTot(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32+#32+#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeCo(x,y: integer);
var quan: integer;
Begin
    quan := OCo[x,y].Quan;
    case Quan of
    Vua: VeVua(x,y);
    Hau: VeHau(x,y);
    Xe: VeXe(x,y);
    tuong: VeTuong(x,y);
    Ma: VeMa(x,y);
    Tot: VeTot(x,y);
            end;
End;

Các bạn có thể thay đổi level để tăng độ thông minh cho máy, nhưng level càng cáo nó chạy càng lâu nha.
Máy mình chạy level 2 là ok, còn hơn thì chạy không nổi.
View attachment 103444
Eo ôiiii :v
Thực sự là đỉnh, quá đỉnh luôn :V
Đỉnh lắm lắm luôn ấy :V
Chẳng bù cho mình, học lớp 11 mà k biết viết cái chương trình Pascal cơ bản :V
 

Nâu nêm

Học sinh mới
Thành viên
19 Tháng hai 2019
16
6
6
19
Hà Nội
THCS Đại Đồng
View attachment 103442
Game này mình phải bỏ cả tuần mới viết được đó nha
Code này hơi rắc rối nên mình chia ra thành các file nhỏ, các bạn lưu theo hướng dẫn nha, nếu không thì Code không chạy được đâu

Code này các bạn lưu dưới tên CHESSAI.PAS
Mã:
 Program ChessAI;
 uses crt,dos;
 const
      Size = 7;
      Level = 2;

      Nguoi = -1;
      May = 1;

      Chon = 1;
      ChuanBi = 2;
      XuatPhat = 3;
      DiDen = 4;
      KeyIn = 5;

      Trong = 0;
      Xe = 1;
      Ma = 2;
      Tuong = 3;
      Vua = 4;
      Hau = 5;
      Tot = 6;

 type TOCo = object
      Quan: integer;
      NChoi: integer;
      Status: integer;
             end;

 type TBanCo = object
      OCo: array[1..8,1..8] of TOCo;
      Procedure InBanCo;
      Procedure Reset(stt: integer);
      Function DiVua(x,y,NC: integer): integer;
      Function DiHau(x,y,NC: integer): integer;
      Function DiXe(x,y,NC: integer): integer;
      Function DiMa(x,y,NC: integer): integer;
      Function DiTuong(x,y,NC: integer): integer;
      Function DiTot(x,y,NC: integer): integer;
      Function DiChuyen(x,y: integer): integer;
      Function DiCo(x1,y1,x2,y2: integer): integer;
      Procedure VeVua(x,y: integer);
      Procedure VeHau(x,y: integer);
      Procedure VeXe(x,y: integer);
      Procedure VeMa(x,y: integer);
      Procedure VeTuong(x,y: integer);
      Procedure VeTot(x,y: integer);
      Procedure VeCo(x,y: integer);
      Procedure PhongCap(x,y: integer);
               end;
 var
    BanCo: array[0..Level] of TBanCo;
    Dachon: Boolean;
    cx,cy,kx,ky: integer;
    ls,winer: integer;

 procedure setcusor(bot,top: byte);
 var regs : registers;
 begin
 regs.ah :=1;
 regs.ch:=bot;
 regs.cl:=top;
 intr($10,regs);
 end;

 {$I VEQUAN.INC}

 Procedure TBanCo.InBanCo;
 var i,j,x,y: integer;
 Begin
      Textbackground(Black);
      Setcusor(32,0);
      for x := 1 to 8 do
          for y := 1 to 8 do
          begin
               if (x+y) mod 2 = 0 then textBackground(White)
               else textBackground(Red);
               if (OCo[x,y].Status = Chon) or (OCo[x,y].Status = XuatPhat)
               then textBackground(Cyan)
               else
               if (OCo[x,y].Status = Chuanbi) or (OCo[x,y].Status = DiDen)
               then textBackground(13)
               else
               if (OCo[x,y].Status = KeyIn) then TextBackground(Blue);
               for i := 1 to Size do
                   for j := 1 to size div 2 do
                   begin
                   gotoxy((x-1)*size+i+2,(y-1)*(size div 2) +j);
                   write(' ');
                   end;
          if OCo[x,y].NChoi = Nguoi then
          Textcolor(Green) else TextColor(Black);
          VeCo(x,y);
          end;
 End;

 Procedure TBanCo.Reset(stt: integer);
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          if OCo[i,j].Status = stt then
             OCo[i,j].Status := Trong;
 End;

 Procedure TBanCo.PhongCap(x,y: integer);
 var q: integer;
 Begin
      if OCo[x,y].Quan = Tot then
      begin
           if (OCo[x,y].NChoi = May) and (y = 8) then
           begin
                OCo[x,y].Quan := Hau;
                clrscr;
                InBanCo;
           end
           else
           if (OCo[x,y].NChoi = Nguoi) and (y = 1) then
           begin
                TextBackGround(Black);
                clrscr;
                TextColor(LightRed);
                Gotoxy(2,2);Write('1. Xe');
                Gotoxy(2,3);Write('2. Ma');
                Gotoxy(2,4);Write('3. Tuong');
                Gotoxy(2,5);Write('4. Hau');
                Gotoxy(2,6);
                repeat readln(q);until q in [1..4];
                if q = 4 then q := Hau;
                OCo[x,y].Quan := q;
                clrscr;
                InBanCo;
           end;
      end;
 End;
 {$I AICHESS.INC}
 {$I DCCHESS.INC}

 Procedure KhoiTao;
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          begin
              BanCo[0].OCo[i,j].Quan := Trong;
              BanCo[0].OCo[i,j].Status := Trong;
              BanCo[0].Oco[i,j].NChoi := Trong;
          end;
      for i := 1 to 8 do
      begin
           if i <= 5 then
           BanCo[0].Oco[i,1].Quan := i
           else BanCo[0].Oco[i,1].Quan := 9-i;
           BanCo[0].OCo[i,1].NChoi := May;
           if i <= 5 then
           BanCo[0].Oco[i,8].Quan := i
           else BanCo[0].Oco[i,8].Quan := 9-i;
           BanCo[0].OCo[i,8].NChoi := Nguoi;
           for j := 1 to 8 do
           begin
                BanCo[0].OCo[i,2].Quan := Tot;
                BanCo[0].OCo[i,2].Nchoi := May;
                BanCo[0].OCo[i,7].Quan := Tot;
                BanCo[0].OCo[i,7].NChoi := Nguoi;
           end;
      end;
 End;

 Procedure KeyEvent;
 var k: char;
     x,y,d: integer;
 Begin
      repeat
      k := #0;
      if keypressed then k := readkey;
      case k of
      #72: if ky > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #80: if ky < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #75: if kx > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #77: if kx < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
             end;
      if k <> #0 then BanCo[0].InBanCo;
      x := kx;y := ky;
      if k = #13 then
      begin
           if (BanCo[0].OCo[x,y].Quan <> Trong) and
           (LS <> Chon)
           and (BanCo[0].OCo[x,y].NChoi = Nguoi) and not DaChon then
           begin
                BanCo[0].OCo[x,y].Status := Chon;
                LS := Chon;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].ReSet(XuatPhat);
                BanCo[0].ReSet(DiDen);
                DaChon := True;
                cx := x;
                cy := y;
                BanCo[0].DiChuyen(x,y);
                BanCo[0].InBanCo;
           end
           else
           if LS = Chon then
           begin
                BanCo[0].OCo[x,y].Status := Trong;
                LS := Trong;
                DaChon := False;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].InBanCo;
           end
           else if LS = ChuanBi then
           begin
                d := BanCo[0].DiCo(cx,cy,x,y);
                BanCo[0].Reset(ChuanBi);
                BanCo[0].Reset(XuatPhat);
                BanCo[0].Reset(DiDen);
                Dachon := False;
                BanCo[0].InBanCo;
                BanCo[0].PhongCap(x,y);
                BanCo[0].OCo[kx,ky].Status := KeyIn;
                if d <> diem[vua] then
                begin
                     TextColor(Red+Blink);TextBackground(Black);
                     Gotoxy(Size*8+4,5);write('Computer Thinking...');
                     d := AI.DiChuyenAI;
                     BanCo[0].InBanCo;
                     if d = Diem[Vua] then winer := May;
                     Gotoxy(Size*8+4,5);
                     textBackground(Black);
                     clreol;
                end
                else winer := Nguoi;
           end;
      end;
      until (k = #27) or (winer <> 0);
      if k <> #27 then
      begin
           Delay(2000);clrscr;Gotoxy(20,10);TextColor(Red);
           if winer = May then write('Y O U  L O S E')
           else write('Y O U   W I N');
           readln;
      end;
 End;

 BEGIN
      TextBackground(Black);
      Dachon := False;
      clrscr;
      KhoiTao;
      kx := 1;ky := 8;
      Ls := Trong;
      winer := 0;
      BanCo[0].OCo[kx,ky].Status :=  KeyIn;
      BanCo[0].InBanCo;
      KeyEvent;
 END.
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên AICHESS.INC
Mã:
const
    Diem: array[Xe..Tot] of integer = (60,35,35,900,120,10);
    MVua: array[1..8,1..8] of real =
    ((-3,-3,-3,-3,-2,-1,2,2),(-4,-4,-4,-4,-3,-2,2,3),
     (-4,-4,-4,-4,-3,-2,0,1),(-5,-5,-5,-5,-4,-2,0,0),
     (-5,-5,-5,-5,-4,-2,0,0),(-4,-4,-4,-4,-3,-2,0,1),
     (-4,-4,-4,-4,-3,-2,2,3),(-3,-3,-3,-3,-2,-1,2,2));
   
    MHau: array[1..8,1..8] of real =
    ((-2,-1,-1,-0.5,0,-1,-1,-2),(-1,0,0,0,0,0.5,0,-1),
     (-1,0,0.5,0.5,0.5,0.5,0.5,-1),(-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),
     (-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),(-1,0,0.5,0.5,0.5,0.5,0,-1),
     (-1,0,0,0,0,0.5,0,-1),(-2,-1,-1,-0.5,0,-1,-1,-2));

    MXe: array[1..8,1..8] of real =
    ((0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,1,0,0,0,0,0,0.5),
     (0,1,0,0,0,0,0,0.5),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0));

    MTuong: array[1..8,1..8] of real =
    ((-2,-1,-1,-1,-1,-1,-1,-2),(-1,0,0,0.5,0,1,0.5,-1),
     (-1,0,0.5,0.5,1,1,0,-1),(-1,0,1,1,1,1,0,-1),
     (-1,0,1,1,1,1,0,-1),(-1,0,0.5,0.5,1,1,0,-1),
     (-1,0,0,0.5,0,1,0.5,-1),(-2,-1,-1,-1,-1,-1,-1,-2));

    MMa: array[1..8,1..8] of real =
    ((-5,-4,-3,-3,-3,-3,-4,-5),(-4,-2,0,0.5,0,0.5,-2,-4),
     (-3,0,1,1.5,1.5,1,0,-3),(-3,0,1.5,2,2,1.5,0.5,-3),
     (-3,0,1.5,2,2,1.5,0.5,-3),(-3,0,1,1.5,1.5,1,0,-3),
     (-4,-2,0,0.5,0,0.5,-2,-4),(-5,-4,-3,-3,-3,-3,-4,-5));

    MTot: array[1..8,1..8] of real =
    ((0,5,1,0.5,0,0.5,0.5,0),(0,5,1,0.5,0,0.5,0.5,0),
     (0,5,2,1,0,-1,1,0),(0,5,3,2.5,2,0,-2,0),
     (0,5,3,2.5,2,0,-2,0),(0,5,2,1,0,-1,1,0),
     (0,5,1,0.5,0,0.5,0.5,0),(0,5,1,0.5,0,0.5,0.5,0));
type TAI = object
    Function TinhDiem(x,y,quan: integer): real;
    Function DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
    Function ChuanBiAI(bc,nc: integer): real;
    Function DiChuyenAI: integer;
        end;
var x1,y1,x2,y2: integer;
    AI: TAI;
   
Function TAI.TinhDiem(x,y,quan: integer): real;
Begin
    case quan of
    Vua: Tinhdiem := MVua[x,y];
    Hau: Tinhdiem := MHau[x,y];
    Xe: Tinhdiem := MXe[x,y];
    Tuong: Tinhdiem := MTuong[x,y];
    Ma: Tinhdiem := MMa[x,y];
    Tot: Tinhdiem := MTot[x,y];
            end;
End;

Function TAI.DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
var b: TBanCo;
    i,j,k,quan: integer;
    d,max: real;
Begin
    max := -9999;
    k := 0;
    b := BanCo[bc];
    quan := b.OCo[x,y].Quan;
    for i := 1 to 8 do
        for j := 1 to 8 do
        if (BanCo[bc].OCo[i,j].Status = ChuanBi) then
        begin
            d := TinhDiem(i,j,quan) + BanCo[bc].DiCo(x,y,i,j);
            BanCo[bc].Reset(ChuanBi);
            if bc + 1 <= level then
            d := d - ChuanBiAI(bc+1,-nc);
            if d > max then
            begin
            max := d;
            if (bc = 1) and (max > mx) then
            begin
                x2 := i;y2 := j;
            end;
            end;
            BanCo[bc] := b;
        end;
    DiCoAI := max;
End;

Function TAI.ChuanBiAI(bc,nc: integer): real;
var i,j,cb: integer;
    d,max: real;
Begin
    BanCo[bc] := BanCo[bc-1];
    BanCo[bc].Reset(ChuanBi);
    max := -9999;
    for i := 1 to 8 do
        for j := 1 to 8 do
        begin
            if BanCo[bc].OCo[i,j].NChoi = nc then
            begin
            cb := BanCo[bc].DiChuyen(i,j);
            if cb > 0 then
                        begin
            d := DiCoAI(i,j,bc,cb,nc,max);
            if d > max then
            begin
                max := d;
                if bc = 1 then
                begin
                    x1 := i;y1 := j;
                end;
            end;
            end;
            BanCo[bc].Reset(ChuanBi);
                        end;
        end;
    if bc = 1 then
    max := BanCo[0].DiCo(x1,y1,x2,y2);
    ChuanBiAI := max;
End;
Function TAI.DiChuyenAI: integer;
var dc: integer;
Begin
    dc := 0;
    dc := trunc(ChuanBiAI(1,May));
    DiChuyenAI := dc;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên DCCHESS.INC
Mã:
 Function TBanCo.DiVua(x,y,NC: integer): integer;
 var dem: integer;
 Begin
     dem := 0;
      if ((x > 1) and (y > 1)) and (OCo[x-1,y-1].NChoi <> NC)
      then begin OCo[x-1,y-1].Status := ChuanBi;inc(dem);end;
      if ((y > 1)) and (OCo[x,y-1].NChoi <> NC)
      then begin OCo[x,y-1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y > 1)) and (OCo[x+1,y-1].NChoi <> NC)
      then begin OCo[x+1,y-1].Status := ChuanBi;inc(dem);end;
      if ((x > 1) and (y < 8)) and (OCo[x-1,y+1].NChoi <> NC)
      then begin OCo[x-1,y+1].Status := ChuanBi;inc(dem);end;
      if ((y < 8)) and (OCo[x,y+1].NChoi <> NC)
      then begin OCo[x,y+1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y < 8)) and (OCo[x+1,y+1].NChoi <> NC)
      then begin OCo[x+1,y+1].Status := ChuanBi;inc(dem);end;
      if ((x > 1)) and (OCo[x-1,y].NChoi <> NC)
      then begin OCo[x-1,y].Status := ChuanBi;inc(dem);end;
      if ((x < 8)) and (OCo[x+1,y].NChoi <> NC)
      then begin OCo[x+1,y].Status := ChuanBi;inc(dem);end;
    DiVua := Dem;
 End;

 Function TBanCo.DiHau(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem:=0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;

      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiHau := Dem;
 End;

 Function TBanCo.DiXe(x,y,NC: integer): integer;
 var i,dem: integer;
 Begin
    dem := 0;
      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiXe := Dem;
 End;

 Function TBanCo.DiMa(x,y,NC: integer): integer;
 var dem: integer;
 Begin
      dem := 0;
      if (x > 2) and (y > 1) then
      if (OCo[x-2,y-1].NChoi <> NC) then
    begin OCo[x-2,y-1].Status := ChuanBi;inc(dem);end;
      if (x > 2) and (y < 8) then
      if (OCo[x-2,y+1].NChoi <> NC) then
    begin OCo[x-2,y+1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y > 1) then
      if (OCo[x+2,y-1].NChoi <> NC) then
    begin OCo[x+2,y-1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y < 8) then
      if (OCo[x+2,y+1].NChoi <> NC) then
    begin OCo[x+2,y+1].Status := ChuanBi;inc(dem);end;

      if (x > 1) and (y > 2) then
      if (OCo[x-1,y-2].NChoi <> NC) then
    begin OCo[x-1,y-2].Status := ChuanBi;inc(dem);end;
      if (x > 1) and (y < 7) then
      if (OCo[x-1,y+2].NChoi <> NC) then
    begin OCo[x-1,y+2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y > 2) then
      if (OCo[x+1,y-2].NChoi <> NC) then
    begin OCo[x+1,y-2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y < 7) then
      if (OCo[x+1,y+2].NChoi <> NC) then
    begin OCo[x+1,y+2].Status := ChuanBi;inc(dem);end;
    DiMa := Dem;
 End;

 Function TBanCo.DiTuong(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem := 0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
    DiTuong := Dem;
 End;

 Function TBanCo.DiTot(x,y,NC: integer): integer;
 var dem: integer;
 Begin
    dem := 0;
      if OCo[x,y+NC].NChoi = Trong then
      begin
           OCo[x,y+NC].Status := ChuanBi;inc(dem);
           if ((y = 2) or (y = 7)) and (OCo[x,y+NC*2].NChoi = Trong) then
           begin OCo[x,y+NC*2].Status := ChuanBi;inc(dem);end;
      end;
      if (OCo[x-1,y+NC].NChoi <> NC) and
      (OCo[x-1,y+NC].NChoi <> Trong) then
    begin OCo[x-1,y+NC].Status := ChuanBi;inc(dem);end;
      if (OCo[x+1,y+NC].NChoi <> NC) and
      (OCo[x+1,y+NC].NChoi <> Trong) then
    begin OCo[x+1,y+NC].Status := ChuanBi;inc(dem);end;
    DiTot := Dem;
 End;

 Function TBanCo.DiChuyen(x,y: integer): integer;
 var NC: integer;
 Begin
      NC := OCo[x,y].NChoi;
      case OCo[x,y].quan of
      Vua: DiChuyen := DiVua(x,y,NC);
      Hau: DiChuyen := DiHau(x,y,NC);
      Xe: DiChuyen := DiXe(x,y,NC);
      Ma: DiChuyen := DiMa(x,y,NC);
      Tuong: DiChuyen := DiTuong(x,y,NC);
      Tot: DiChuyen := DiTot(x,y,NC);
                end;
 End;

Function TBanCo.DiCo(x1,y1,x2,y2: integer): integer;
var d: integer;
Begin
    d := 0;
    if OCo[x2,y2].Quan <> Trong then d := Diem[OCo[x2,y2].Quan];
    OCo[x2,y2].Quan := OCo[x1,y1].Quan;
    OCo[x2,y2].NChoi := OCo[x1,y1].Nchoi;
    OCo[x2,y2].Status := DiDen;
    OCo[x1,y1].Quan := Trong;
    OCo[x1,y1].NChoi := Trong;
    OCo[x1,y1].Status := XuatPhat;
    DiCo := d;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên VEQUAN.INC
Mã:
Procedure TBanCo.VeVua(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#95#22#254#22#95);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#92#30#30#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeHau(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#92#30#179#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeXe(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#219#32#219#32#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeMa(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#222#223#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#222#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTuong(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32#32#234);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#254#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTot(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32+#32+#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeCo(x,y: integer);
var quan: integer;
Begin
    quan := OCo[x,y].Quan;
    case Quan of
    Vua: VeVua(x,y);
    Hau: VeHau(x,y);
    Xe: VeXe(x,y);
    tuong: VeTuong(x,y);
    Ma: VeMa(x,y);
    Tot: VeTot(x,y);
            end;
End;

Các bạn có thể thay đổi level để tăng độ thông minh cho máy, nhưng level càng cáo nó chạy càng lâu nha.
Máy mình chạy level 2 là ok, còn hơn thì chạy không nổi.
View attachment 103444
Có ai dùng đc chưa vậy????
 

Lục Vân Tiên

Học sinh chăm học
Thành viên
4 Tháng tư 2017
340
231
131
Thanh Hóa
Minecraft Gamer

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
  • Like
Reactions: phamkimcu0ng

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
Có bạn nào chạy thử Code với level 3 chưa nhỉ, nó chơi khá hay nhưng mà chạy chậm quá
 
  • Like
Reactions: Deathheart

Qυαиɢ нưиɢ

Banned
Banned
Thành viên
27 Tháng hai 2019
72
38
11
18
Hà Nội
THCS Hoàng Liệt
code để làm gì vậy bạn
View attachment 103442
Game này mình phải bỏ cả tuần mới viết được đó nha
Code này hơi rắc rối nên mình chia ra thành các file nhỏ, các bạn lưu theo hướng dẫn nha, nếu không thì Code không chạy được đâu

Code này các bạn lưu dưới tên CHESSAI.PAS
Mã:
 Program ChessAI;
 uses crt,dos;
 const
      Size = 7;
      Level = 2;

      Nguoi = -1;
      May = 1;

      Chon = 1;
      ChuanBi = 2;
      XuatPhat = 3;
      DiDen = 4;
      KeyIn = 5;

      Trong = 0;
      Xe = 1;
      Ma = 2;
      Tuong = 3;
      Vua = 4;
      Hau = 5;
      Tot = 6;

 type TOCo = object
      Quan: integer;
      NChoi: integer;
      Status: integer;
             end;

 type TBanCo = object
      OCo: array[1..8,1..8] of TOCo;
      Procedure InBanCo;
      Procedure Reset(stt: integer);
      Function DiVua(x,y,NC: integer): integer;
      Function DiHau(x,y,NC: integer): integer;
      Function DiXe(x,y,NC: integer): integer;
      Function DiMa(x,y,NC: integer): integer;
      Function DiTuong(x,y,NC: integer): integer;
      Function DiTot(x,y,NC: integer): integer;
      Function DiChuyen(x,y: integer): integer;
      Function DiCo(x1,y1,x2,y2: integer): integer;
      Procedure VeVua(x,y: integer);
      Procedure VeHau(x,y: integer);
      Procedure VeXe(x,y: integer);
      Procedure VeMa(x,y: integer);
      Procedure VeTuong(x,y: integer);
      Procedure VeTot(x,y: integer);
      Procedure VeCo(x,y: integer);
      Procedure PhongCap(x,y: integer);
               end;
 var
    BanCo: array[0..Level] of TBanCo;
    Dachon: Boolean;
    cx,cy,kx,ky: integer;
    ls,winer: integer;

 procedure setcusor(bot,top: byte);
 var regs : registers;
 begin
 regs.ah :=1;
 regs.ch:=bot;
 regs.cl:=top;
 intr($10,regs);
 end;

 {$I VEQUAN.INC}

 Procedure TBanCo.InBanCo;
 var i,j,x,y: integer;
 Begin
      Textbackground(Black);
      Setcusor(32,0);
      for x := 1 to 8 do
          for y := 1 to 8 do
          begin
               if (x+y) mod 2 = 0 then textBackground(White)
               else textBackground(Red);
               if (OCo[x,y].Status = Chon) or (OCo[x,y].Status = XuatPhat)
               then textBackground(Cyan)
               else
               if (OCo[x,y].Status = Chuanbi) or (OCo[x,y].Status = DiDen)
               then textBackground(13)
               else
               if (OCo[x,y].Status = KeyIn) then TextBackground(Blue);
               for i := 1 to Size do
                   for j := 1 to size div 2 do
                   begin
                   gotoxy((x-1)*size+i+2,(y-1)*(size div 2) +j);
                   write(' ');
                   end;
          if OCo[x,y].NChoi = Nguoi then
          Textcolor(Green) else TextColor(Black);
          VeCo(x,y);
          end;
 End;

 Procedure TBanCo.Reset(stt: integer);
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          if OCo[i,j].Status = stt then
             OCo[i,j].Status := Trong;
 End;

 Procedure TBanCo.PhongCap(x,y: integer);
 var q: integer;
 Begin
      if OCo[x,y].Quan = Tot then
      begin
           if (OCo[x,y].NChoi = May) and (y = 8) then
           begin
                OCo[x,y].Quan := Hau;
                clrscr;
                InBanCo;
           end
           else
           if (OCo[x,y].NChoi = Nguoi) and (y = 1) then
           begin
                TextBackGround(Black);
                clrscr;
                TextColor(LightRed);
                Gotoxy(2,2);Write('1. Xe');
                Gotoxy(2,3);Write('2. Ma');
                Gotoxy(2,4);Write('3. Tuong');
                Gotoxy(2,5);Write('4. Hau');
                Gotoxy(2,6);
                repeat readln(q);until q in [1..4];
                if q = 4 then q := Hau;
                OCo[x,y].Quan := q;
                clrscr;
                InBanCo;
           end;
      end;
 End;
 {$I AICHESS.INC}
 {$I DCCHESS.INC}

 Procedure KhoiTao;
 var i,j: integer;
 Begin
      for i := 1 to 8 do
          for j := 1 to 8 do
          begin
              BanCo[0].OCo[i,j].Quan := Trong;
              BanCo[0].OCo[i,j].Status := Trong;
              BanCo[0].Oco[i,j].NChoi := Trong;
          end;
      for i := 1 to 8 do
      begin
           if i <= 5 then
           BanCo[0].Oco[i,1].Quan := i
           else BanCo[0].Oco[i,1].Quan := 9-i;
           BanCo[0].OCo[i,1].NChoi := May;
           if i <= 5 then
           BanCo[0].Oco[i,8].Quan := i
           else BanCo[0].Oco[i,8].Quan := 9-i;
           BanCo[0].OCo[i,8].NChoi := Nguoi;
           for j := 1 to 8 do
           begin
                BanCo[0].OCo[i,2].Quan := Tot;
                BanCo[0].OCo[i,2].Nchoi := May;
                BanCo[0].OCo[i,7].Quan := Tot;
                BanCo[0].OCo[i,7].NChoi := Nguoi;
           end;
      end;
 End;

 Procedure KeyEvent;
 var k: char;
     x,y,d: integer;
 Begin
      repeat
      k := #0;
      if keypressed then k := readkey;
      case k of
      #72: if ky > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #80: if ky < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(ky);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #75: if kx > 1 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Dec(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
      #77: if kx < 8 then
      begin
      BanCo[0].OCo[kx,ky].Status := Ls;Inc(kx);
      Ls := BanCo[0].OCo[kx,ky].Status;
      BanCo[0].OCo[kx,ky].Status := KeyIn;
      end;
             end;
      if k <> #0 then BanCo[0].InBanCo;
      x := kx;y := ky;
      if k = #13 then
      begin
           if (BanCo[0].OCo[x,y].Quan <> Trong) and
           (LS <> Chon)
           and (BanCo[0].OCo[x,y].NChoi = Nguoi) and not DaChon then
           begin
                BanCo[0].OCo[x,y].Status := Chon;
                LS := Chon;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].ReSet(XuatPhat);
                BanCo[0].ReSet(DiDen);
                DaChon := True;
                cx := x;
                cy := y;
                BanCo[0].DiChuyen(x,y);
                BanCo[0].InBanCo;
           end
           else
           if LS = Chon then
           begin
                BanCo[0].OCo[x,y].Status := Trong;
                LS := Trong;
                DaChon := False;
                BanCo[0].ReSet(ChuanBi);
                BanCo[0].InBanCo;
           end
           else if LS = ChuanBi then
           begin
                d := BanCo[0].DiCo(cx,cy,x,y);
                BanCo[0].Reset(ChuanBi);
                BanCo[0].Reset(XuatPhat);
                BanCo[0].Reset(DiDen);
                Dachon := False;
                BanCo[0].InBanCo;
                BanCo[0].PhongCap(x,y);
                BanCo[0].OCo[kx,ky].Status := KeyIn;
                if d <> diem[vua] then
                begin
                     TextColor(Red+Blink);TextBackground(Black);
                     Gotoxy(Size*8+4,5);write('Computer Thinking...');
                     d := AI.DiChuyenAI;
                     BanCo[0].InBanCo;
                     if d = Diem[Vua] then winer := May;
                     Gotoxy(Size*8+4,5);
                     textBackground(Black);
                     clreol;
                end
                else winer := Nguoi;
           end;
      end;
      until (k = #27) or (winer <> 0);
      if k <> #27 then
      begin
           Delay(2000);clrscr;Gotoxy(20,10);TextColor(Red);
           if winer = May then write('Y O U  L O S E')
           else write('Y O U   W I N');
           readln;
      end;
 End;

 BEGIN
      TextBackground(Black);
      Dachon := False;
      clrscr;
      KhoiTao;
      kx := 1;ky := 8;
      Ls := Trong;
      winer := 0;
      BanCo[0].OCo[kx,ky].Status :=  KeyIn;
      BanCo[0].InBanCo;
      KeyEvent;
 END.
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên AICHESS.INC
Mã:
const
    Diem: array[Xe..Tot] of integer = (60,35,35,900,120,10);
    MVua: array[1..8,1..8] of real =
    ((-3,-3,-3,-3,-2,-1,2,2),(-4,-4,-4,-4,-3,-2,2,3),
     (-4,-4,-4,-4,-3,-2,0,1),(-5,-5,-5,-5,-4,-2,0,0),
     (-5,-5,-5,-5,-4,-2,0,0),(-4,-4,-4,-4,-3,-2,0,1),
     (-4,-4,-4,-4,-3,-2,2,3),(-3,-3,-3,-3,-2,-1,2,2));
   
    MHau: array[1..8,1..8] of real =
    ((-2,-1,-1,-0.5,0,-1,-1,-2),(-1,0,0,0,0,0.5,0,-1),
     (-1,0,0.5,0.5,0.5,0.5,0.5,-1),(-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),
     (-0.5,0,0.5,0.5,0.5,0.5,0,-0.5),(-1,0,0.5,0.5,0.5,0.5,0,-1),
     (-1,0,0,0,0,0.5,0,-1),(-2,-1,-1,-0.5,0,-1,-1,-2));

    MXe: array[1..8,1..8] of real =
    ((0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,1,0,0,0,0,0,0.5),
     (0,1,0,0,0,0,0,0.5),(0,1,0,0,0,0,0,0),
     (0,1,0,0,0,0,0,0),(0,0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0));

    MTuong: array[1..8,1..8] of real =
    ((-2,-1,-1,-1,-1,-1,-1,-2),(-1,0,0,0.5,0,1,0.5,-1),
     (-1,0,0.5,0.5,1,1,0,-1),(-1,0,1,1,1,1,0,-1),
     (-1,0,1,1,1,1,0,-1),(-1,0,0.5,0.5,1,1,0,-1),
     (-1,0,0,0.5,0,1,0.5,-1),(-2,-1,-1,-1,-1,-1,-1,-2));

    MMa: array[1..8,1..8] of real =
    ((-5,-4,-3,-3,-3,-3,-4,-5),(-4,-2,0,0.5,0,0.5,-2,-4),
     (-3,0,1,1.5,1.5,1,0,-3),(-3,0,1.5,2,2,1.5,0.5,-3),
     (-3,0,1.5,2,2,1.5,0.5,-3),(-3,0,1,1.5,1.5,1,0,-3),
     (-4,-2,0,0.5,0,0.5,-2,-4),(-5,-4,-3,-3,-3,-3,-4,-5));

    MTot: array[1..8,1..8] of real =
    ((0,5,1,0.5,0,0.5,0.5,90),(0,5,1,0.5,0,0.5,0.5,90),
     (0,5,2,1,0,-1,1,90),(0,5,3,2.5,2,0,-2,90),
     (0,5,3,2.5,2,0,-2,90),(0,5,2,1,0,-1,1,90),
     (0,5,1,0.5,0,0.5,0.5,90),(0,5,1,0.5,0,0.5,0.5,90));
type TAI = object
    Function TinhDiem(x,y,quan: integer): real;
    Function DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
    Function ChuanBiAI(bc,nc: integer): real;
    Function DiChuyenAI: integer;
        end;
var dx1,dy1,dx0,dy0: longint;
    AI: TAI;
   
Function TAI.TinhDiem(x,y,quan: integer): real;
Begin
    case quan of
    Vua: Tinhdiem := MVua[x,y];
    Hau: Tinhdiem := MHau[x,y];
    Xe: Tinhdiem := MXe[x,y];
    Tuong: Tinhdiem := MTuong[x,y];
    Ma: Tinhdiem := MMa[x,y];
    Tot: Tinhdiem := MTot[x,y];
            end;
End;

Function TAI.DiCoAI(x,y,bc,soco,nc: integer;mx: real): real;
var b: TBanCo;
    i,j,k,quan: integer;
    d,max: real;
Begin
    max := -9999;
    k := 0;
    b := BanCo[bc];
    quan := b.OCo[x,y].Quan;
    for i := 1 to 8 do
        for j := 1 to 8 do
        if (BanCo[bc].OCo[i,j].Status = ChuanBi) then
        begin
            if nc = May then
            d := TinhDiem(i,j,quan)
            else d := TinhDiem(i,9-j,quan);
            d := d + BanCo[bc].DiCo(x,y,i,j);
            BanCo[bc].Reset(ChuanBi);
            if bc + 1 <= level then
            d := d - ChuanBiAI(bc+1,-nc);
            if d > max then
            begin
            max := d;
            if (bc = 1) and (max > mx) then
            begin
                dx1 := i;dy1 := j;
            end;
            end;
            BanCo[bc] := b;
            inc(k); if k >= soco then begin i:=8;j:=8;end;
        end;
    DiCoAI := max;
End;

Function TAI.ChuanBiAI(bc,nc: integer): real;
var i,j,cb: integer;
    d,max: real;
Begin
    BanCo[bc] := BanCo[bc-1];
    BanCo[bc].Reset(ChuanBi);
    max := -9999;
    for i := 1 to 8 do
        for j := 1 to 8 do
        begin
            if BanCo[bc].OCo[i,j].NChoi = nc then
            begin
            cb := BanCo[bc].DiChuyen(i,j);
            if cb > 0 then
                        begin
            d := DiCoAI(i,j,bc,cb,nc,max);
            if d > max then
            begin
                max := d;
                if bc = 1 then
                begin
                    dx0 := i;dy0 := j;
                end;
            end;
            end;
            BanCo[bc].Reset(ChuanBi);
                        end;
        end;
    ChuanBiAI := max;
End;

Function TAI.DiChuyenAI: integer;
var dc: integer;
Begin
    ChuanBiAI(1,May);
    dc := BanCo[0].DiCo(dx0,dy0,dx1,dy1);
    BanCo[0].PhongCap(dx1,dy1);
    DiChuyenAI := dc;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên DCCHESS.INC
Mã:
 Function TBanCo.DiVua(x,y,NC: integer): integer;
 var dem: integer;
 Begin
     dem := 0;
      if ((x > 1) and (y > 1)) and (OCo[x-1,y-1].NChoi <> NC)
      then begin OCo[x-1,y-1].Status := ChuanBi;inc(dem);end;
      if ((y > 1)) and (OCo[x,y-1].NChoi <> NC)
      then begin OCo[x,y-1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y > 1)) and (OCo[x+1,y-1].NChoi <> NC)
      then begin OCo[x+1,y-1].Status := ChuanBi;inc(dem);end;
      if ((x > 1) and (y < 8)) and (OCo[x-1,y+1].NChoi <> NC)
      then begin OCo[x-1,y+1].Status := ChuanBi;inc(dem);end;
      if ((y < 8)) and (OCo[x,y+1].NChoi <> NC)
      then begin OCo[x,y+1].Status := ChuanBi;inc(dem);end;
      if ((x < 8) and (y < 8)) and (OCo[x+1,y+1].NChoi <> NC)
      then begin OCo[x+1,y+1].Status := ChuanBi;inc(dem);end;
      if ((x > 1)) and (OCo[x-1,y].NChoi <> NC)
      then begin OCo[x-1,y].Status := ChuanBi;inc(dem);end;
      if ((x < 8)) and (OCo[x+1,y].NChoi <> NC)
      then begin OCo[x+1,y].Status := ChuanBi;inc(dem);end;
    DiVua := Dem;
 End;

 Function TBanCo.DiHau(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem:=0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;

      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiHau := Dem;
 End;

 Function TBanCo.DiXe(x,y,NC: integer): integer;
 var i,dem: integer;
 Begin
    dem := 0;
      for i := x-1 downto 1 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := x+1 to 8 do
          if OCo[i,y].Quan = Trong then
        begin OCo[i,y].Status := ChuanBi;inc(dem);end
          else if OCo[i,y].NChoi <> NC then
               begin
                    OCo[i,y].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[i,y].NChoi = NC then break;
      for i := y-1 downto 1 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
      for i := y+1 to 8 do
          if OCo[x,i].Quan = Trong then
        begin OCo[x,i].Status := ChuanBi;inc(dem);end
          else if OCo[x,i].NChoi <> NC then
               begin
                    OCo[x,i].Status := ChuanBi;
            inc(dem);
                    break;
                    end
               else if OCo[x,i].NChoi = NC then break;
    DiXe := Dem;
 End;

 Function TBanCo.DiMa(x,y,NC: integer): integer;
 var dem: integer;
 Begin
      dem := 0;
      if (x > 2) and (y > 1) then
      if (OCo[x-2,y-1].NChoi <> NC) then
    begin OCo[x-2,y-1].Status := ChuanBi;inc(dem);end;
      if (x > 2) and (y < 8) then
      if (OCo[x-2,y+1].NChoi <> NC) then
    begin OCo[x-2,y+1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y > 1) then
      if (OCo[x+2,y-1].NChoi <> NC) then
    begin OCo[x+2,y-1].Status := ChuanBi;inc(dem);end;
      if (x < 7) and (y < 8) then
      if (OCo[x+2,y+1].NChoi <> NC) then
    begin OCo[x+2,y+1].Status := ChuanBi;inc(dem);end;

      if (x > 1) and (y > 2) then
      if (OCo[x-1,y-2].NChoi <> NC) then
    begin OCo[x-1,y-2].Status := ChuanBi;inc(dem);end;
      if (x > 1) and (y < 7) then
      if (OCo[x-1,y+2].NChoi <> NC) then
    begin OCo[x-1,y+2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y > 2) then
      if (OCo[x+1,y-2].NChoi <> NC) then
    begin OCo[x+1,y-2].Status := ChuanBi;inc(dem);end;
      if (x < 8) and (y < 7) then
      if (OCo[x+1,y+2].NChoi <> NC) then
    begin OCo[x+1,y+2].Status := ChuanBi;inc(dem);end;
    DiMa := Dem;
 End;

 Function TBanCo.DiTuong(x,y,NC: integer): integer;
 var i,j,dem: integer;
 Begin
    dem := 0;
      i:=x;j:=y;
      while (i > 1) and (j > 1) do
      begin
           Dec(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j > 1) do
      begin
           Inc(i);Dec(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
      i:=x;j:=y;
      while (i > 1) and (j < 8) do
      begin
           Dec(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;
            inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 1;
           end;
      end;
      i:=x;j:=y;
      while (i < 8) and (j < 8) do
      begin
           Inc(i);Inc(j);
           if OCo[i,j].NChoi = Trong then
        begin
                   OCo[i,j].Status := ChuanBi;inc(dem);
        end
           else
           begin
                if OCo[i,j].NChoi <> NC then OCo[i,j].Status := ChuanBi;
        inc(dem);
                i := 8;
           end;
      end;
    DiTuong := Dem;
 End;

 Function TBanCo.DiTot(x,y,NC: integer): integer;
 var dem: integer;
 Begin
    dem := 0;
      if OCo[x,y+NC].NChoi = Trong then
      begin
           OCo[x,y+NC].Status := ChuanBi;inc(dem);
           if ((y = 2) or (y = 7)) and (OCo[x,y+NC*2].NChoi = Trong) then
           begin OCo[x,y+NC*2].Status := ChuanBi;inc(dem);end;
      end;
      if (OCo[x-1,y+NC].NChoi <> NC) and
      (OCo[x-1,y+NC].NChoi <> Trong) then
    begin OCo[x-1,y+NC].Status := ChuanBi;inc(dem);end;
      if (OCo[x+1,y+NC].NChoi <> NC) and
      (OCo[x+1,y+NC].NChoi <> Trong) then
    begin OCo[x+1,y+NC].Status := ChuanBi;inc(dem);end;
    DiTot := Dem;
 End;

 Function TBanCo.DiChuyen(x,y: integer): integer;
 var NC: integer;
 Begin
      NC := OCo[x,y].NChoi;
      case OCo[x,y].quan of
      Vua: DiChuyen := DiVua(x,y,NC);
      Hau: DiChuyen := DiHau(x,y,NC);
      Xe: DiChuyen := DiXe(x,y,NC);
      Ma: DiChuyen := DiMa(x,y,NC);
      Tuong: DiChuyen := DiTuong(x,y,NC);
      Tot: DiChuyen := DiTot(x,y,NC);
                end;
 End;

Function TBanCo.DiCo(x1,y1,x2,y2: integer): integer;
var d: integer;
Begin
    d := 0;
    if OCo[x2,y2].Quan <> Trong then d := Diem[OCo[x2,y2].Quan];
    OCo[x2,y2].Quan := OCo[x1,y1].Quan;
    OCo[x2,y2].NChoi := OCo[x1,y1].Nchoi;
    OCo[x2,y2].Status := DiDen;
    OCo[x1,y1].Quan := Trong;
    OCo[x1,y1].NChoi := Trong;
    OCo[x1,y1].Status := XuatPhat;
    DiCo := d;
End;
-----------------------------------------------------------------------
Code này các bạn lưu dưới tên VEQUAN.INC
Mã:
Procedure TBanCo.VeVua(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#95#22#254#22#95);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#92#30#30#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeHau(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#92#30#179#30#47);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeXe(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#219#32#219#32#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeMa(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#222#223#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#222#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTuong(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32#32#234);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#254#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeTot(x,y: integer);
Begin
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+1);
    write(#32+#32+#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+2);
    write(#32#219#219#219);
    gotoxy((x-1)*Size+4,(y-1)*(Size div 2)+3);
    write(#223#223#223#223#223);
End;

Procedure TBanCo.VeCo(x,y: integer);
var quan: integer;
Begin
    quan := OCo[x,y].Quan;
    case Quan of
    Vua: VeVua(x,y);
    Hau: VeHau(x,y);
    Xe: VeXe(x,y);
    tuong: VeTuong(x,y);
    Ma: VeMa(x,y);
    Tot: VeTot(x,y);
            end;
End;

Các bạn có thể thay đổi level để tăng độ thông minh cho máy, nhưng level càng cáo nó chạy càng lâu nha.
Máy mình chạy level 2 là ok, còn hơn thì chạy không nổi.
View attachment 103444
 
Top Bottom