Ai biết làm mã code cờ vua bằng turbo pascal ko

1 câu trả lời

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.

Câu hỏi trong lớp Xem thêm