Tin học Game Cờ Vua 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.

Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
upload_2018-5-25_11-59-35.png

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
 

Phương Nam 187

Học sinh
Thành viên
17 Tháng tám 2017
145
114
36
18
Hà Giang
THCS Thị Trán Vị Xuyên
Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
View attachment 56260

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
anh tự ra game cờ vua này à
 

The Joker

BTV World Cup 2018
HV CLB Lịch sử
HV CLB Hóa học vui
Thành viên
12 Tháng bảy 2017
4,754
7,085
804
Hà Nội
THPT Việt Đức
Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
View attachment 56260

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
Phải chiếu hết mới ăn được Vua chứ ???
 

Nguyễn Khoa

Học sinh tiến bộ
Thành viên
3 Tháng năm 2014
601
858
216
Hà Nội
THPT - Đại học
Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
View attachment 56260

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
Chiếu hết mới ăn được quân vua mà
=))))))))))
Thư viện graph là sao ạ?
 

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
Chiếu hết mới ăn được quân vua mà
=))))))))))
Thư viện graph là sao ạ?
nghĩa là khi người chơi không để ý bị ăn quân vua là thua, không cần phải chiếu hết.
Thư viện graph dùng để sử dụng chế độ đồ họa nha. Cần phải cài vào thì mới chơi được không thì nó sẽ báo lỗi thiếu thư viện
 
  • Like
Reactions: Nguyễn Khoa

The Joker

BTV World Cup 2018
HV CLB Lịch sử
HV CLB Hóa học vui
Thành viên
12 Tháng bảy 2017
4,754
7,085
804
Hà Nội
THPT Việt Đức
Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
View attachment 56260

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
Anh ơi làm thế nào để chạy cái code này ạ ??? :<
 

phidaotram

Học sinh
Thành viên
22 Tháng một 2020
4
3
21
18
Đà Nẵng
THCS Huỳnh Thúc Kháng
Anh ui, dùng tp với lại thư viện graph là sao ạ, có cần phải tải từ trên mạng k ạ
 

Ender Dragon Boy Vcl

Học sinh mới
Thành viên
3 Tháng tư 2020
4
1
6
16
Du học sinh
THCS Lys Tuwj Trongj
cho hỏi sao nó cứ hiện ra dòng lệnh lỗi :'Error in statement' z
đứng trc chữ Procedure
 

Hoàng Vũ YS

Học sinh
Thành viên
20 Tháng ba 2020
159
104
36
19
Thanh Hóa
Trường THPT Triệu Sơn 4
Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
View attachment 56260

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
Cho em hỏi sao em paste đoạn cođe này vào pascal thì lỗi ạ ?
upload_2020-4-3_17-3-3.png
 

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
Hãy đảm bảo các bạn xài turbo pascal nha. Vì mình không viết để chạy trên free pascsal đâu
 
  • Like
Reactions: mỳ gói

Axiore_Ro

Học sinh
Thành viên
18 Tháng ba 2020
103
85
36
16
Hà Nội
Roblox - Power of Imagination
Ăn được quân Vua là thắng nha :p không cần phải chiếu hết.
View attachment 56260

Code đây nhá (Phải có thư viện Graph và phải dùng TP mới được):

Mã:
 Program Co_Vua;
 uses crt,graph,dos;

 const _KT = 50;
       Q_Vua = 0;
       Q_Hau = 1;
       Q_Tuong = 2;
       Q_Ma = 3;
       Q_Xe = 4;
       Q_Tot = 5;
       Q_Khong =  6;

       T_Trong = 0;
       T_Vao = 1;
       T_ChuanBi = 2;
       T_QuanCo = 3;
       T_Chon = 4;

 type TOCo = record
                   QuanCo: integer;
                   TuThe: integer;
                   MauO,MauCo: Word;
                   X,Y: integer;
             end;

 var gd,gm: integer;
     MX,MY: integer;
     OCo: array[-2..7,-2..7] of TOCo;
     LaOCo,OChon : TOCo;
     DangChon,EndGame: Boolean;
     Luot: integer;

  function mousex:word;assembler;asm
 mov ax,3; int 33h; mov ax,cx end;

 function mousey:word;assembler;asm
 mov ax,3; int 33h; mov ax,dx end;

 function leftclick:boolean;assembler;asm
 mov ax,3; int 33h; and bx,1; mov ax,bx end;

 function MouseArea(x1,y1,x2,y2:word):boolean;
 begin
 if     (LeftClick)
        and (mousex >=x1)
        and (mousex <=x2)
        and (mousey >=y1)
        and (mousey <=y2)
 then mousearea:=true
 else mousearea:=false;
 end;

 Function InitMouse : boolean;
 var r: registers;
 Begin
 r.ax:=$00;intr($33,r);
 if r.ax<>0 then InitMouse:=true
 else InitMouse:=false;
 End;

 Procedure ShowMouse;
 Var r: registers;
 begin
 r.ax:=$01;intr($33,r);
 End;

 Procedure HideMouse;
 Var r:registers;
 Begin
 r.ax:=$002;
 intr($33,r);
 End;

 Procedure VeQuanVua(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+12,Y+16);
           Line(X+30,Y+16,X+18,Y+16);
           Line(X+12,Y+16,X+12,Y+10);
           Line(X+18,Y+16,X+18,Y+10);
           Line(X+12,Y+10,X+8,Y+10);
           Line(X+18,Y+10,X+22,Y+10);
           Line(X+8,Y+10,X+8,Y+6);
           Line(X+22,Y+10,X+22,Y+6);
           Line(X+8,Y+6,X+12,Y+6);
           Line(X+22,Y+6,X+18,Y+6);
           Line(X+12,Y+6,X+12,Y+3);
           Line(X+18,Y+6,X+18,Y+3);
           Line(X+12,Y+3,X+18,Y+3);
           CirCle(X+15,Y+22,3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanHau(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+24);
           Line(X+30,Y+48,X+23,Y+24);
           Line(X+7,Y+24,X,Y+24);
           Line(X+23,Y+24,X+30,Y+24);
           Line(X,Y+24,X,Y+21);
           Line(X+30,Y+24,X+30,Y+21);
           Line(X,Y+21,X+7,Y+21);
           Line(X+30,Y+21,X+23,Y+21);
           Line(X+7,Y+21,X,Y+16);
           Line(X+23,Y+21,X+30,Y+16);
           Line(X,Y+16,X+15,Y+10);
           Line(X+30,Y+16,X+15,Y+10);
           Line(X+15,Y+10,X+15,Y+3);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTuong(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X+15,Y+6);
           Line(X+23,Y+16,X+15,Y+6);
           FillEllipse(X+15,Y+4,2,2);
           Line(X+7,Y+21,X+17,Y+9);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanXe(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+7,Y+16);
           Line(X+23,Y+35,X+23,Y+16);
           Line(X+7,Y+16,X,Y+16);
           Line(X+23,Y+16,X+30,Y+16);
           Line(X,Y+16,X,Y+6);
           Line(X+30,Y+16,X+30,Y+6);
           Line(X,Y+6,X+6,Y+6);
           Line(X+30,Y+6,X+24,Y+6);
           Line(X+6,Y+6,X+6,Y+10);
           Line(X+24,Y+6,X+24,Y+10);
           Line(X+6,Y+10,X+12,Y+10);
           Line(X+24,Y+10,X+18,Y+10);
           Line(X+12,Y+10,X+12,Y+6);
           Line(X+18,Y+10,X+18,Y+6);
           Line(X+12,Y+6,X+18,Y+6);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanMa(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+13,Y+25);
           Line(X+13,Y+25,X+7,Y+17);
           Line(X+7,Y+17,X,Y+23);
           Line(X,Y+23,X-3,Y+20);
           Line(X-3,Y+20,X+2,Y+8);
           Line(X+2,Y+8,X+13,Y+5);
           Line(X+13,Y+5,X+23,Y+10);
           Line(X+23,Y+10,X+25,Y+30);
           Line(X+25,Y+30,X+23,Y+35);
           Circle(X+11,Y+12,2);
           FloodFill(X+15,Y+28,Mau);
 End;

 Procedure VeQuanTot(X,Y,Mau: integer);
 Begin
           Line(X,Y+48,X+30,Y+48);
           Line(X,Y+48,X+7,Y+35);
           Line(X+30,Y+48,X+23,Y+35);
           Line(X+7,Y+35,X+10,Y+20);
           Line(X+10,Y+20,X+7,Y+13);
           Line(X+23,Y+35,X+20,Y+20);
           Line(X+20,Y+20,X+23,Y+13);
           Line(X+7,Y+13,X+23,Y+13);
           FillEllipse(X+15,Y+7,6,6);
           FloodFill(X+15,Y+25,Mau);
 End;

 Procedure InQuanCo(X,Y,Quanco,Mau: integer);
 Begin
      SetColor(Mau);
      SetFillStyle(1,Mau);
      HiDeMouse;
      case QuanCo of
      Q_Vua:
           VeQuanVua(X+10,Y,Mau);
      Q_Hau:
            VeQuanHau(X+10,Y,Mau);
      Q_Tuong:
           VeQuanTuong(X+10,Y,Mau);
      Q_Xe:
           VeQuanXe(X+10,Y,Mau);
      Q_Ma:
           VeQuanMa(X+10,Y,Mau);
      Q_Tot:
           VeQuanTot(X+10,Y,Mau);
                  end;
      ShowMouse;
 End;

 Procedure ChuanBiTot(X,Y,Mau: integer);
 Begin
      if Mau = Red then
      begin
           if X < 7 then
           begin
           if OCo[X+1,Y].TuThe = T_Trong then OCo[X+1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X+1,Y-1].TuThe <> T_Trong) and (OCo[X+1,Y-1].MauCo = Black)
           then OCo[X+1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X+1,Y+1].TuThe <> T_Trong) and (OCo[X+1,Y+1].MauCo = Black)
           then OCo[X+1,Y+1].TuThe := T_ChuanBi;
           end;
           if (X = 1) and (OCo[3,Y].TuThe = T_Trong) then
           OCo[3,Y].TuThe := T_ChuanBi;
      end
      else
      begin
           if X > 0 then
           begin
           if OCo[X-1,Y].TuThe = T_Trong then OCo[X-1,Y].TuThe := T_ChuanBi;
           if Y > 0 then
           if (OCo[X-1,Y-1].TuThe <> T_Trong) and (OCo[X-1,Y-1].MauCo = Red)
           then OCo[X-1,Y-1].TuThe := T_ChuanBi;
           if (OCo[X-1,Y+1].TuThe <> T_Trong) and (OCo[X-1,Y+1].MauCo = Red)
           then OCo[X-1,Y+1].TuThe := T_ChuanBi;
           if (X = 6) and (OCo[4,Y].TuThe = T_Trong) then
           OCo[4,Y].TuThe := T_ChuanBi;
           end;
      end;
 End;

 Procedure ChuanBiXe(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := X+1 to 7 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := X-1 downto 0 do
      begin
           if OCo[i,Y].Tuthe = T_Trong then
           OCo[i,Y].TuThe := T_ChuanBi
           else if OCo[i,Y].MauCo <> Mau then
           begin
           OCo[i,Y].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y+1 to 7 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
      for i := Y-1 downto 0 do
      begin
           if OCo[X,i].Tuthe = T_Trong then
           OCo[X,i].TuThe := T_ChuanBi
           else if OCo[X,i].MauCo <> Mau then
           begin
           OCo[X,i].TuThe := T_ChuanBi;
           break;
           end
           else break;
      end;
 End;

 Procedure ChuanBiMa(X,Y,Mau: integer);
 Begin
      if (OCo[X+2,Y-1].TuThe = T_Trong) or
      ((OCo[X+2,Y-1].TuThe <> T_Trong) and (OCo[X+2,Y-1].MauCo <> Mau)) then
      OCo[X+2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y-1].TuThe = T_Trong) or
      ((OCo[X-2,Y-1].TuThe <> T_Trong) and (OCo[X-2,Y-1].MauCo <> Mau)) then
      OCo[X-2,Y-1].TuThe := T_ChuanBi;

      if (OCo[X+2,Y+1].TuThe = T_Trong) or
      ((OCo[X+2,Y+1].TuThe <> T_Trong) and (OCo[X+2,Y+1].MauCo <> Mau)) then
      OCo[X+2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X-2,Y+1].TuThe = T_Trong) or
      ((OCo[X-2,Y+1].TuThe <> T_Trong) and (OCo[X-2,Y+1].MauCo <> Mau)) then
      OCo[X-2,Y+1].TuThe := T_ChuanBi;

      if (OCo[X+1,Y-2].TuThe = T_Trong) or
      ((OCo[X+1,Y-2].TuThe <> T_Trong) and (OCo[X+1,Y-2].MauCo <> Mau)) then
      OCo[X+1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X+1,Y+2].TuThe = T_Trong) or
      ((OCo[X+1,Y+2].TuThe <> T_Trong) and (OCo[X+1,Y+2].MauCo <> Mau)) then
      OCo[X+1,Y+2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y-2].TuThe = T_Trong) or
      ((OCo[X-1,Y-2].TuThe <> T_Trong) and (OCo[X-1,Y-2].MauCo <> Mau)) then
      OCo[X-1,Y-2].TuThe := T_ChuanBi;

      if (OCo[X-1,Y+2].TuThe = T_Trong) or
      ((OCo[X-1,Y+2].TuThe <> T_Trong) and (OCo[X-1,Y+2].MauCo <> Mau)) then
      OCo[X-1,Y+2].TuThe := T_ChuanBi;
 End;

 Procedure ChuanBiTuong(X,Y,Mau: integer);
 var i: integer;
 Begin
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y - i >= 0) then
           begin
           if (OCo[X-i,Y-i].TuThe = T_Trong) then
           OCo[X-i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y-i].MauCo <> Mau) then
           begin
           OCo[X-i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y + i <= 7) then
           begin
           if (OCo[X+i,Y+i].TuThe = T_Trong) then
           OCo[X+i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y+i].MauCo <> Mau) then
           begin
           OCo[X+i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X - i >= 0) and (Y + i <= 7) then
           begin
           if (OCo[X-i,Y+i].TuThe = T_Trong) then
           OCo[X-i,Y+i].TuThe := T_ChuanBi
           else if (OCo[X-i,Y+i].MauCo <> Mau) then
           begin
           OCo[X-i,Y+i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
      for i := 1 to 7 do
      begin
           if (X + i <= 7) and (Y - i >= 0) then
           begin
           if (OCo[X+i,Y-i].TuThe = T_Trong) then
           OCo[X+i,Y-i].TuThe := T_ChuanBi
           else if (OCo[X+i,Y-i].MauCo <> Mau) then
           begin
           OCo[X+i,Y-i].TuThe := T_ChuanBi;
           break;
           end;
           end
           else break;
      end;
 End;

 Procedure ChuanBiHau(X,Y,Mau: integer);
 Begin
      ChuanBiXe(X,Y,Mau);
      ChuanBiTuong(X,Y,Mau);
 End;

 Procedure ChuanBiVua(X,Y,Mau: integer);
 var i,j : integer;
 Begin
      for i := X-1 to X+1 do
          for j := Y-1 to Y+1 do
          begin
               if (i <> X) or (j <> Y) then
               if (OCo[i,j].TuThe = T_Trong) or ((OCo[i,j].TuThe = T_QuanCo)
               and (OCo[i,j].MauCo <> Mau)) then
               OCo[i,j].TuThe := T_ChuanBi;
          end;
 End;

 Procedure ChuanBiQuanCo(X,Y,QuanCo,Mau: integer);
 Begin
      case QuanCo of
      Q_Tot: ChuanBiTot(X,Y,Mau);
      Q_Xe: ChuanBiXe(X,Y,Mau);
      Q_Ma: ChuanBiMa(X,Y,Mau);
      Q_Tuong: ChuanBiTuong(X,Y,Mau);
      Q_Hau: ChuanBiHau(X,Y,Mau);
      Q_Vua: ChuanBiVua(X,Y,Mau);
                  end;
 End;

 Procedure HuyChuanBi;
 var i,j: integer;
 Begin
      for i := 0 to 7 do
          for j := 0 to 7 do
          begin
          if OCo[i,j].TuThe = T_ChuanBi then
          begin
          if OCo[i,j].QuanCo = Q_Khong then OCo[i,j].TuThe := T_Trong
          else OCo[i,j].TuThe := T_QuanCo;
          end;
          end;
 End;

 Procedure TaoBanCo;
 var i,j,k: integer;
 Begin
      for i := 0 to 7 do
      begin
           if k = Green then k := White
           else k := Green;
           for j := 0 to 7 do
           begin
                SetFillStyle(1,k);
                Bar(i*_KT,j*_KT,(i+1)*_KT,(j+1)*_KT);
                OCo[i,j].Tuthe := T_Trong;
                OCo[i,j].MauO := k;
                OCo[i,j].X := i;
                OCo[i,j].Y := j;
                OCo[i,j].QuanCo := Q_Khong;
                if k = Green then k := White
                else k := Green;
           end;
      end;

      { In Chu }
      SetColor(Red);
      SetTextStyle(DefaultFont, HorizDir,4);
      OutTextXy(8*_KT+10,20,'GAME');
      SetColor(LightGreen);
      OutTextXY(8*_KT+70,60,'CHESS');
      InQuanCo(8*_KT+10,120,Q_Vua,White);
      InQuanCo(8*_KT+80,120,Q_Hau,White);
      InQuanCo(8*_KT+160,120,Q_Xe,White);
      InQuanCo(8*_KT+10,230,Q_Ma,White);
      InQuanCo(8*_KT+80,230,Q_Tuong,White);
      InQuanCo(8*_KT+160,230,Q_Tot,White);
      SetFillStyle(7,Brown);
      Bar(8*_KT+30,320,8*_KT+200,400);
      SetColor(Cyan);
      OutTextXy(8*_KT+60,345,'EXIT');
 End;

 Procedure KhoiTaoGame;
 var i,j: integer;
 Begin
      OCo[0,0].QuanCo := Q_Xe;
      OCo[0,1].QuanCo := Q_Ma;
      OCo[0,2].QuanCo := Q_Tuong;
      OCo[0,3].QuanCo := Q_Hau;
      OCo[0,4].QuanCo := Q_Vua;
      OCo[0,5].QuanCo := Q_Tuong;
      OCo[0,6].QuanCo := Q_Ma;
      OCo[0,7].QuanCo := Q_Xe;

      OCo[7,0].QuanCo := Q_Xe;
      OCo[7,1].QuanCo := Q_Ma;
      OCo[7,2].QuanCo := Q_Tuong;
      OCo[7,3].QuanCo := Q_Hau;
      OCo[7,4].QuanCo := Q_Vua;
      OCo[7,5].QuanCo := Q_Tuong;
      OCo[7,6].QuanCo := Q_Ma;
      OCo[7,7].QuanCo := Q_Xe;
      for i := 0 to 7 do
      begin
           Oco[1,i].QuanCo := Q_Tot;
           OCo[6,i].QuanCo := Q_Tot;
      end;
      for i := 0 to 1 do
      for j := 0 to 7 do
      begin
           OCo[i,j].MauCo := Red;
           OCo[i,j].Tuthe := T_QuanCo;
           InQuanCo(i*_KT,j*_KT,OCo[i,j].QuanCo,OCo[i,j].MauCo);

           OCo[7-i,j].MauCo := Black;
           OCo[7-i,j].TuThe := T_QuanCo;
           InQuanCo((7-i)*_KT,j*_KT,OCo[7-i,j].QuanCo,OCo[7-i,j].MauCo);
      end;
 End;

 Procedure MouseEnter;
 var X,Y: integer;
     St: string;
 Begin
      X := mousex div _KT;
      Y := mousey div _KT;
      if (X < 8) and (Y < 8) and LeftClick then
      begin
           if not DangChon and (OCo[X,Y].MauCo = Luot) and
           (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.tuThe = T_QuanCo) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OChon := OCo[X,Y];
           OCo[X,Y].TuThe := T_Chon;
           LaOCo := OCo[X,Y];
           ShowMouse;
           Dangchon := True;
           ChuanBiQuanCo(X,Y,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           end
           else
           if (OCo[X,Y].TuThe = T_Chon) then
           begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           SetFillStyle(1,Yellow);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           if LaOCo.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[X,Y];
           ShowMouse;
           DangChon := False;
           HuyChuanBi;
           end
           else
           if (LaOCo.X = X) and (LaOCo.Y = Y) and (LaOCo.TuThe = T_ChuanBi) then
           begin
           HuyChuanBi;
           HideMouse;
           if OCo[X,Y].QuanCo = Q_Vua then
           begin
                SetColor(Blue);
                SetTextStyle(DefaultFont, HorizDir, 2);
                if OCo[X,Y].MauCo = Red then
                OutTextXY(2*_KT,4*_KT,'Ben Do Thua Roi!')
                else
                OutTextXY(2*_KT,4*_KT,'Ben Den Thua Roi!');
                EndGame := True;
           end;
           OCo[X,Y].QuanCo := OChon.QuanCo;
           OCo[X,Y].MauCo := OChon.MauCo;
           SetFillStyle(1,OCo[X,Y].MauO);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           SetFillStyle(1,OChon.MauO);
           Bar(OChon.X*_KT,OChon.Y*_KT,(OChon.X+1)*_KT,(Ochon.Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OChon.QuanCo,OChon.MauCo);
           OCo[OChon.X,OChon.Y].TuThe := T_Trong;
           OCo[Ochon.X,OChon.Y].QuanCo := Q_Khong;
           OCo[X,Y].TuThe := T_QuanCo;
           LaOCo := OCo[OChon.X,Ochon.Y];
           ShowMouse;
           DangChon := False;
           if Luot = Red then Luot := Black
           else Luot := Red;
           end;
      end
      else
      if (X < 8) and (Y < 8) then
      begin
      case OCo[X,Y].TuThe of
      T_Trong:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Cyan);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_QuanCo:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Blue);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
      T_ChuanBi:
      begin
           HideMouse;
           SetFillStyle(1,LaOCo.MauO);
           if LaOCo.TuThe <> T_Chon then
           begin
           Bar(LaOCo.X*_KT,LaOCo.Y*_KT,(LaOCo.X + 1)*_KT,(LaOCo.Y + 1)*_KT);
           OCo[LaOCo.X,LaOCo.Y].Tuthe := LaOCo.TuThe;
           end;
           if LaOco.TuThe <> T_Trong then
           InQuanCo(LaOCo.X*_KT,LaOCo.Y*_KT,LaOCo.quanCo,LaOCo.MauCo);
           SetFillStyle(1,Brown);
           Bar(X*_KT,Y*_KT,(X+1)*_KT,(Y+1)*_KT);
           InQuanCo(X*_KT,Y*_KT,OCo[X,Y].QuanCo,OCo[X,Y].MauCo);
           LaOCo := OCo[X,Y];
           OCo[X,Y].TuThe := T_Vao;
           ShowMouse;
      end;
                        end;
      end;
 End;

 BEGIN
      InitGraph(gd,gm,'');
      MX := GetMaxX;
      MY := GetMaxY;
      InitMouse;
      Luot := Red;
      TaoBanCo;
      KhoiTaoGame;
      LaOCo := OCo[0,0];
      DangChon := False;
      EndGame := False;
      ShowMouse;
      repeat
      MouseEnter;
      until MouseAreA(8*_KT+30,320,8*_KT+200,400) or EndGame;
      if EndGame then readln;
      CloseGraph;
 END.
@ka1412
em copy để dán vào không đc
 
Top Bottom