home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Pascal / BPASCAL.700 / D11 / CHESSDLL.ZIP / XCHESS.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1992-10-01  |  6.0 KB  |  263 lines

  1.  
  2.  
  3. uses
  4. {$IFDEF DLL}
  5.   ChessDll,
  6. {$ELSE}
  7.   ChessInf,
  8. {$ENDIF}
  9.   Crt, Strings;
  10.  
  11. const
  12.   PieceName: array[TPiece] of Char =
  13.     ('+', 'K', 'Q', 'R', 'B', 'N', 'P');
  14.  
  15. procedure WriteBoard(var Board: TBoard; Player: TColor);
  16. var
  17.   I, J: Integer;
  18. begin
  19.   Writeln('  A B C D E F G H');
  20.   for I := High(Board) downto Low(Board) do
  21.   begin
  22.     NormVideo;
  23.     Write(I, ' ');
  24.     for J := Low(Board[I]) to High(Board[I]) do
  25.     begin
  26.       with Board[J, I] do
  27.       begin
  28.         if Piece = pEmpty then
  29.         begin
  30.           if (I + J) and 1 = 0 then LowVideo
  31.           else HighVideo;
  32.         end
  33.         else
  34.         begin
  35.           if Color = cWhite then HighVideo
  36.           else LowVideo;
  37.         end;
  38.         Write(PieceName[Piece], ' ');
  39.       end;
  40.     end;
  41.     Writeln;
  42.   end;
  43. end;
  44.  
  45. procedure WriteMove(var Move: TMove);
  46. var
  47.   Str: array[0..30] of Char;
  48. begin
  49.   MoveToStr(Move, Str);
  50.   Write(Str);
  51. end;
  52. procedure DisplayBoard(CH: HChess);
  53. var
  54.   Board: TBoard;
  55.   Player: TColor;
  56.   Move: TMove;
  57. begin
  58.   GetLastMove(CH, Move);
  59.   Write(' Last move = ');
  60.   WriteMove(Move);
  61.   Writeln;
  62.   GetBoard(CH, Board);
  63.   WriteBoard(Board, GetPlayer(CH));
  64. end;
  65.  
  66. procedure WriteMoves(var Moves: array of TMove);
  67. var
  68.   I: Integer;
  69. begin
  70.   for I := Low(Moves) to High(Moves) do
  71.   begin
  72.     if Moves[I].Change.Piece <> pEmpty then
  73.     begin
  74.       WriteMove(Moves[I]);
  75.       Write(' ');
  76.     end
  77.     else
  78.       Break;
  79.   end;
  80. end;
  81.  
  82. procedure CalcLocation(X, Y: Char; var Location: TLocation);
  83. begin
  84.    if (X in ['A'..'H']) and (Y in ['1'..'8']) then
  85.    begin
  86.      Location.X := ord(X) - ord('A') + 1;
  87.      Location.Y := ord(Y) - ord('1') + 1;
  88.    end
  89.    else
  90.    begin
  91.      Location.X := 0;
  92.      Location.Y := 0;
  93.    end;
  94. end;
  95.  
  96. procedure WriteMainLine(var Moves: array of TMove);
  97. begin
  98.   Write(#13);
  99.   ClrEol;
  100.   Write('Main line = ');
  101.   WriteMoves(Moves);
  102. end;
  103.  
  104. var
  105.   CH: HChess;
  106.   Str: array[0..30] of Char;
  107.   Change: TChange;
  108.   Move: TMove;
  109.  
  110.   Status: TSearchStatus;
  111.   Result: TChessError;
  112.   Player: TColor;
  113.   Single: Boolean;
  114.   Auto: Boolean;
  115.  
  116.   MainValue: Integer;
  117.   MainLine: array[0..10] of TMove;
  118.   ValidMoves: array[0..100] of TMove;
  119.  
  120.   I: TPiece;
  121.  
  122.   Count: Integer;
  123.  
  124.   OpponentColor: TColor;
  125.  
  126. begin
  127.   TextAttr := $07;
  128.   ClrScr;
  129.  
  130.   NewGame(CH);
  131.  
  132.   Single := False;
  133.   Auto := False;
  134.   OpponentColor := cWhite;
  135.  
  136.   repeat
  137.     Player := GetPlayer(CH);
  138.     NormVideo;
  139.     if Player = cWhite then Write('White')
  140.     else Write('Black');
  141.     Writeln(' to play');
  142.  
  143.     DisplayBoard(CH);
  144.  
  145.     if not Auto and (Single or (Player = OpponentColor)) then
  146.       repeat
  147.         Write('Enter move: ');
  148.         {ThinkAhead(CH);
  149.         repeat
  150.           Think(CH, 2, Status);
  151.         until KeyPressed;}
  152.         Readln(Str);
  153.         case UpCase(Str[0]) of
  154.           'P':
  155.             if Str[1] = #0 then
  156.             begin
  157.               if OpponentColor = cWhite then
  158.                 OpponentColor := cBlack
  159.               else
  160.                 OpponentColor := cWhite;
  161.               Continue;
  162.             end;
  163.           'A':
  164.             if Str[1] = #0 then
  165.             begin
  166.               Auto := True;
  167.               Continue;
  168.             end;
  169.           'Q':
  170.             if Str[1] = #0 then
  171.             begin
  172.               DisposeGame(CH);
  173.               Exit;
  174.             end;
  175.           'R':
  176.             if Str[1] = #0 then
  177.             begin
  178.               RetractMove(CH, Move);
  179.               RetractMove(CH, Move);
  180.               Continue;
  181.             end;
  182.           'S':
  183.             begin
  184.               Single := not Single;
  185.               Continue;
  186.             end;
  187.           'B':
  188.             if Str[1] = #0 then
  189.             begin
  190.               asm int 3 end;
  191.               Continue;
  192.             end;
  193.           '?':
  194.             begin
  195.               FillChar(Change, SizeOf(Change), 0);
  196.               case StrLen(Str) of
  197.                 2:
  198.                   for I := Low(TPiece) to High(TPiece) do
  199.                     if PieceName[I] = UpCase(Str[1]) then
  200.                       Change.Piece := I;
  201.                 3:
  202.                   CalcLocation(UpCase(Str[1]), Str[2], Change.Source);
  203.                 4:
  204.                   if Str[1] = '?' then
  205.                     CalcLocation(UpCase(Str[2]), Str[3], Change.Dest);
  206.               end;
  207.  
  208.               GetValidMoves(CH, Change, ValidMoves);
  209.               WriteMoves(ValidMoves);
  210.               Writeln;
  211.               Continue;
  212.             end;
  213.         end;
  214.  
  215.         Result := ParseMove(Str, Change);
  216.         if Result = ceOK then
  217.           Result := SubmitMove(CH, Change);
  218.         case Result of
  219.           ceOK: begin end;
  220.           ceInvalidSyntax: Writeln('Syntax error');
  221.           ceAmbiguousMove: Writeln('Ambiguous move');
  222.           ceInvalidMove:   Writeln('Not a legal move');
  223.           ceIllegalMove:   Writeln('Check prevents that move');
  224.         else
  225.           Writeln('Error');
  226.         end;
  227.       until Result = ceOK
  228.     else
  229.     begin
  230.       ComputerMove(CH, 91);
  231.       repeat
  232.         Think(CH, 4, Status);
  233.         GetMainLine(CH, MainValue, MainLine);
  234.         WriteMainLine(MainLine);
  235.       until (Status = ssComplete) or (Status = ssGameOver);
  236.       if Status = ssGameOver then break;
  237.       Writeln;
  238.       Writeln(' Nodes = ', GetNodes(CH));
  239.       case GetChessStatus(CH, Count) of
  240.         csCheck:          Writeln('*** Check! ***');
  241.         csCheckmate:      Writeln('*** Checkmate! ***');
  242.         csStalemate,
  243.         csFiftyMoveRule,
  244.         csRepetitionRule: Writeln('*** Stalemate ***');
  245.         csResigns:
  246.           if GetPlayer(CH) = cWhite then
  247.             Writeln('Black resigns')
  248.           else
  249.             Writeln('White resigns');
  250.         csMateFound:
  251.           begin
  252.             Write('*** Checkmate in ', Count, ' move');
  253.             if Count <> 1 then Write('s');
  254.             Writeln(' ***');
  255.           end;
  256.       end;
  257.       Writeln;
  258.       OpponentColor := GetPlayer(CH);
  259.     end;
  260.   until False;
  261.  
  262.   DisposeGame(CH);
  263. end.