| 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.
 |