1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590:
| unit moves2;
interface type Tspieler=(weiss,schwarz); Tfigur = record spieler:Tspieler; typ:(Bauer,Turm,Springer,Laeufer,Koenig,Dame,no); xpos:1..8; ypos:1..8; end; TIsFigur = record bvar:boolean; num:integer; end; tsituation=(normal,win_white,win_black,patt,notallowed); Tchess=class figurs:array[0..31] of Tfigur; situation:Tsituation; protected savefigurs:array of Tfigur; function bauernmove(figur:tfigur;xmove,ymove:integer):boolean; function Turmmove(figur:tfigur;xmove,ymove:integer):boolean; function springermove(figur:tfigur;xmove,ymove:integer):boolean; function laeufermove(figur:tfigur;xmove,ymove:integer):boolean; function delta(var1,var2:integer):integer; function takesituation:tsituation; public procedure reset; function MoveFigur(figurnr:byte;xmove,ymove:integer):Tsituation; function isMovePossible(Figur:Tfigur;xmove,ymove:integer):boolean; function isPlatzBelegt(x,y:integer):boolean; function isFigur(x:integer;y:integer):TISFigur; end;
var turn:Tspieler; implementation
procedure tchess.reset; var a,b:integer; {$region'Figurpositionen'} begin for a:=0 to 7 do begin figurs[a].typ:=Bauer; figurs[a].ypos:=2; figurs[a].spieler:=weiss; figurs[a].xpos:=a+1; end; b:=8; for a:=0 to 7 do begin figurs[a+b].spieler:=schwarz; figurs[a+b].typ:=Bauer; figurs[a+b].ypos:=7; figurs[a+b].xpos:=a+1; end; b:=b+8; Figurs[16].spieler:=weiss; Figurs[16].typ:=turm; Figurs[16].ypos:=1; Figurs[16].xpos:=1; Figurs[17].spieler:=weiss; Figurs[17].typ:=turm; Figurs[17].ypos:=1; Figurs[17].xpos:=8; Figurs[18].spieler:=schwarz; Figurs[18].typ:=turm; Figurs[18].ypos:=8; Figurs[18].xpos:=1; Figurs[19].spieler:=schwarz; Figurs[19].typ:=turm; Figurs[19].ypos:=8; Figurs[19].xpos:=8; Figurs[20].spieler:=weiss; Figurs[20].typ:=springer; Figurs[20].ypos:=1; Figurs[20].xpos:=2; Figurs[21].spieler:=weiss; Figurs[21].typ:=springer; Figurs[21].ypos:=1; Figurs[21].xpos:=7; Figurs[22].spieler:=schwarz; Figurs[22].typ:=springer; Figurs[22].ypos:=8; Figurs[22].xpos:=7; Figurs[23].spieler:=schwarz; Figurs[23].typ:=springer; Figurs[23].ypos:=8; Figurs[23].xpos:=2; Figurs[24].spieler:=weiss; Figurs[24].typ:=laeufer; Figurs[24].ypos:=1; Figurs[24].xpos:=3; Figurs[25].spieler:=weiss; Figurs[25].typ:=laeufer; Figurs[25].ypos:=1; Figurs[25].xpos:=6; Figurs[26].spieler:=schwarz; Figurs[26].typ:=laeufer; Figurs[26].ypos:=8; Figurs[26].xpos:=3; Figurs[27].spieler:=schwarz; Figurs[27].typ:=laeufer; Figurs[27].ypos:=8; Figurs[27].xpos:=6; Figurs[30].spieler:=weiss; Figurs[30].typ:=koenig; Figurs[30].ypos:=1; Figurs[30].xpos:=5; Figurs[31].spieler:=schwarz; Figurs[31].typ:=koenig; Figurs[31].ypos:=8; Figurs[31].xpos:=5; Figurs[28].spieler:=weiss; Figurs[28].typ:=dame; Figurs[28].ypos:=1; Figurs[28].xpos:=4; Figurs[29].spieler:=schwarz; Figurs[29].typ:=dame; Figurs[29].ypos:=8; Figurs[29].xpos:=4; {$endregion} turn:=weiss; end;
function tchess.MoveFigur(figurnr:byte;xmove,ymove:integer):Tsituation; var isfigurvar:tISFIGUR; begin if ismovepossible(figurs[figurnr],xmove,ymove) then begin isfigurvar:=isFigur(xmove,ymove); if isfigurvar.bvar=true then figurs[isfigurvar.num].typ:=no; savefigurs:=figurs; figurs[figurnr].xpos:=xmove; figurs[figurnr].ypos:=ymove; result:=takesituation; case turn of weiss: begin if result=win_black then begin figurs:=savefigurs; result:=notallowed; end; turn:=schwarz; end; schwarz: begin if result=win_white then begin figurs:=savefigurs; result:=notallowed; end; turn:=weiss;; end; end; end; end;
function Tchess.isMovePossible(Figur:Tfigur;xmove,ymove:integer):boolean; var isFigurvar2:TisFigur; xinverse,yinverse:integer; a:integer; lokisfigurvar:Tisfigur; begin result:=false; if figur.spieler=turn then case figur.typ of Bauer: begin if bauernmove(figur,xmove,ymove)=true then result:=true; end; Turm: begin if turmmove(figur,xmove,ymove)=true then result:=true; end; Springer: begin if Springermove(figur,xmove,ymove)=true then result:=true; end; Laeufer: begin if laeufermove(figur,xmove,ymove)=true then result:=true; end; Koenig: begin if delta(figur.xpos,xmove)<2 then if delta(figur.ypos,ymove)<2 then begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else result:=true end; end; Dame: begin if turmmove(figur,xmove,ymove)=true then result:=true else if laeufermove(figur,xmove,ymove)=true then result:=true; end; end;
end;
function tchess.bauernmove(figur:tfigur;xmove,ymove:integer):boolean; var isfigurvar2:Tisfigur; begin result:=false; if figur.spieler=weiss then {$Region 'WeisserBauerCode'} begin if xmove=figur.xpos then {$Region 'Normales Gehen'} begin if ymove-figur.ypos = 1 then begin if isPlatzBElegt(xmove,ymove)=false then result:=true end else if figur.ypos=2 then if ymove=4 then begin if isPlatzBElegt(xmove,3)=false then if isPlatzBElegt(xmove,ymove)=false then begin result:= true; end; end; end; {$Endregion} {$region 'schlagen vorwärts links'} if result=false then begin isFigurvar2:=isFigur(figur.xpos-1,figur.ypos+1); if isFigurvar2.bvar=true then if Figurs[isfigurvar2.num].spieler=schwarz then begin result:=true; end else begin isFigurvar2:=isFigur(figur.xpos-1,figur.ypos); if isFigurvar2.bvar=true then if Figurs[isfigurvar2.num].spieler=schwarz then result:=true; end; end; {$endregion} {$region 'schlagen vorwärts rechts'} if result=false then begin isFigurvar2:=isFigur(figur.xpos+1,figur.ypos+1); if isFigurvar2.bvar=true then begin if Figurs[isfigurvar2.num].spieler=schwarz then begin result:=true; end; end else begin isFigurvar2:=isfigur(figur.xpos+1,figur.ypos); if isfigurvar2.bvar=true then begin if Figurs[isfigurvar2.num].spieler=schwarz then begin result:=true; end; end; end; end; {$endregion} end {$Endregion} else {$Region 'SchwarzerBauerCode'} begin {$Region 'Normales Gehen'} if xmove=figur.xpos then begin if ymove-figur.ypos = -1 then begin if isPlatzBElegt(xmove,ymove)=false then result:=true; end else if figur.ypos=7 then if ymove=5 then begin if isPlatzBElegt(xmove,6)=false then if isPlatzBElegt(xmove,ymove)=false then begin result:= true; end; end; end; {$Endregion} {$region 'schlagen vorwärts links'} if result=false then begin isFigurvar2:=isFigur(figur.xpos-1,figur.ypos-1); if isFigurvar2.bvar=true then begin if Figurs[isfigurvar2.num].spieler=weiss then begin result:=true; end; end else begin isFigurvar2:=isFigur(figur.xpos-1,figur.ypos); if isFigurvar2.bvar = true then if figurs[isfigurvar2.num].spieler=weiss then result:=true; end; end; {$Endregion} {$region 'schlagen vorwärts rechts'} if result=false then begin isFigurvar2:=isFigur(figur.xpos+1,figur.ypos-1); if isFigurvar2.bvar=true then begin if figurs[isfigurvar2.num].spieler=weiss then result:=true; end else begin isFigurvar2:=isfigur(figur.xpos+1,figur.ypos); if isfigurvar2.bvar=true then if figurs[isfigurvar2.num].spieler=weiss then result:=true; end; end; end; {$Endregion} {$Endregion} end;
function Tchess.Turmmove(figur:tfigur;xmove,ymove:integer):boolean; var lokisfigurvar:Tisfigur; a,xinverse,yinverse:integer; {$region 'Horizontal'} begin result:=false; if figur.ypos=ymove then begin if figur.xpos>xmove then xinverse:=-1 else xinverse:=1; a:=figur.xpos+xinverse; if delta(figur.xpos,xmove)>1 then begin lokisfigurvar:=isfigur(a,ymove); if lokisfigurvar.bvar=false then begin while (isPlatzbelegt(a,ymove)=false) and (delta(a,xmove)<>0) do begin if a+xinverse=xmove then begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else begin result:=true; end; end; a:=a+xinverse; end; end; end else begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else result:=true; end; end; {$endregion} {$region 'Vertikal'} if figur.xpos=xmove then begin if figur.ypos>ymove then yinverse:=-1 else yinverse:=1; a:=figur.ypos+yinverse; if delta(figur.ypos,ymove)>1 then begin lokisfigurvar:=isfigur(xmove,a); if lokisfigurvar.bvar=false then begin while (isPlatzbelegt(xmove,a)=false) and (delta(a,ymove)<>0) do begin if a+yinverse=ymove then begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else begin result:=true; end; end; a:=a+yinverse; end; end; end else begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else result:=true; end; end; {$Endregion} end;
function tchess.springermove(figur:tfigur;xmove,ymove:integer):boolean; var lokisfigurvar:Tisfigur; begin result:=false; if Figur.xpos-xmove=(2 or -2) then if figur.ypos-ymove=(1 or -1) then begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=false then begin result:=true; end else if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end; if Figur.ypos-ymove=(2 or -2) then if figur.xpos-xmove=(1 or -1) then begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=false then begin result:=true; end else if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end; end;
function Tchess.laeufermove(figur:tfigur;xmove,ymove:integer):boolean; var xinverse,yinverse:integer; a,b:integer; lokisfigurvar:Tisfigur; begin result:=false; if delta(figur.xpos,xmove)=delta(figur.ypos,ymove) then begin if figur.xpos>xmove then xinverse:=-1 else xinverse:=1; if figur.ypos>ymove then yinverse:=-1 else yinverse:=1; a:=figur.xpos+xinverse; b:=figur.ypos+yinverse; if delta(figur.xpos,xmove)>1 then begin lokisfigurvar:=isfigur(a,b); if lokisfigurvar.bvar=false then begin while (isplatzbelegt(a,b)=false) and (delta(a,xmove)<>0) do begin if a+xinverse=xmove then begin lokisfigurvar:=isfigur(a,b); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else result:=true; end; a:=a+xinverse; b:=b+yinverse; end; end; end else begin lokisfigurvar:=isfigur(xmove,ymove); if lokisfigurvar.bvar=true then begin if figurs[lokisfigurvar.num].spieler<>figur.spieler then result:=true; end else result:=true; end; end; end;
function Tchess.isPlatzBelegt(x,y:integer):boolean; var a:integer; begin result:=false; for a:=0 to length(Figurs)-1 do if figurs[a].typ<>no then if figurs[a].xpos=x then if Figurs[a].ypos=y then result:=true; end;
function Tchess.isFigur(x:integer;y:integer):TISFigur; var a:integer; begin isfigur.num:=0; IsFigur.bvar:=false; for a:=0 to length(figurs)-1 do if figurs[a].typ<>no then if x=figurs[a].xpos then if y=figurs[a].ypos then begin IsFigur.bvar:=true; isFigur.num:=a; end; end;
function Tchess.delta(var1,var2:integer):integer; begin if var1>var2 then begin result:=var1-var2; end else if var2>var1 then begin result:=var2-var1; end else if var1=var2 then result:=0; end;
function tchess.takesituation:tsituation; var a:integer; begin result:=normal; a:=0; while (result=normal) and (a<length(figurs)) do begin if figurs[a].typ<>no then if figurs[a].spieler=weiss then begin if ismovepossible(figurs[a],figurs[31].xpos,figurs[31].ypos)=true then result:=win_white; end else if ismovepossible(figurs[a],figurs[30].xpos,figurs[30].ypos)=true then result:=win_black; inc(a) end; if result=win_white then begin a:=0; while (result=win_white) and (a<length(figurs)) do if Figurs[a].typ<>no then if Figurs[a].spieler=schwarz then if ismovepossible(figurs[a],figurs[30].xpos,figurs[30].ypos) =true then result:=patt; end else if result=win_white then begin a:=0; while (result=win_black) and (a<length(figurs)) do if Figurs[a].typ<>no then if Figurs[a].spieler=weiss then if ismovepossible(figurs[a],figurs[31].xpos,figurs[31].ypos) =true then result:=patt; end;
end;
end. |