home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / games / tbridge.zip / INPUT.BR < prev    next >
Text File  |  1986-06-01  |  14KB  |  502 lines

  1.  {  ╔══════════════════════════════════════════════════════╗
  2.     ║          INPUT.BR  Module of BRIDGE.PAS              ║                                                      ║
  3.     ║                                                      ║
  4.     ║                Last modified 10/29/85                ║
  5.     ║                                                      ║
  6.     ║    Handles user I/O in bidding and playing.          ║
  7.     ║                                                      ║
  8.     ╚══════════════════════════════════════════════════════╝
  9.  }
  10. const
  11.   ShortDelay = 250;
  12.   LongDelay  = 1200;
  13.  
  14. procedure GetCh(var ch : char);
  15. begin
  16.   Read(KBD, ch);
  17.   ch := UpCase(ch);
  18. end; { GetKey }
  19.  
  20. procedure AbortCheck(ch : char);
  21. begin
  22.   case ch of
  23.     ^C : StopGames;
  24.     ^[ : FlushBuffer;
  25.   end; { case }
  26. end; { AbortCheck }
  27.  
  28. type
  29.   CharSet = set of char;
  30.  
  31. procedure CheckKBD;
  32. { Scan keyboard, ignore input unless aborting }
  33. var
  34.   ch : char;
  35. begin
  36.  if KeyPressed then
  37.  begin
  38.    GetCh(ch);
  39.    AbortCheck(ch);
  40.  end;
  41. end; { CheckKBD }
  42.  
  43. procedure GetOption(var ch : char; LegalChars : CharSet);
  44. { Reads keyboard until character is in Legal set }
  45. begin
  46.   repeat
  47.     GetCh(ch);
  48.     AbortCheck(ch);
  49.   until ch in LegalChars;
  50. end; { GetOption }
  51.  
  52. procedure DummyMessage;
  53. { Asks if the user wants to play the Dummy's Hand }
  54. var
  55.   ch : char;
  56. begin
  57.   DummyPartner := -1;
  58.   if (not Computer[Dummy]) and
  59.      (Computer[Partner(Dummy)]) then { Dummy = human, Partner = Computer }
  60.   begin
  61.     ClearMenu;
  62.     GotoPos(MenuPos,0,2);
  63.     Write('Do you wish to play the');
  64.     GotoPos(MenuPos,0,3);
  65.     Write('   cards for your side? ');
  66.     GetOption(ch, ['Y', 'N', ^C]);
  67.     case ch of
  68.       ^C  : StopGames;
  69.       'Y' : begin
  70.               Write('Yes');
  71.               DummyPartner := Partner(Dummy);
  72.             end;
  73.        else Write('No');
  74.     end; { case }
  75.     Delay(ShortDelay);
  76.     ClearMenu;
  77.   end; { if }
  78. end; { DummyMessage }
  79.  
  80. const
  81.   CommandLength = 4;
  82. type
  83.   CommandString = string[CommandLength];
  84. var
  85.   Command : CommandString;
  86.  
  87. procedure PrintRankSuit(Rank,Suit : char);
  88. { outputs the Card }
  89. begin
  90.   case Suit of
  91.    'C' : begin
  92.            SetColor(TrumpColor[Club]);
  93.            Write(Rank + ' ' + TrumpStr[Club]);
  94.          end;
  95.    'D' : begin
  96.            SetColor(TrumpColor[Diamond]);
  97.            Write(Rank + ' ' + TrumpStr[Diamond]);
  98.          end;
  99.    'H' : begin
  100.            SetColor(TrumpColor[Heart]);
  101.            Write(Rank + ' ' + TrumpStr[Heart]);
  102.          end;
  103.    'S' : begin
  104.            SetColor(TrumpColor[Spade]);
  105.            Write(Rank + ' ' + TrumpStr[Spade]);
  106.          end;
  107.    'N' : begin
  108.            SetColor(TrumpColor[NT]);
  109.            Write(Rank + ' ' + TrumpStr[NT]);
  110.          end;
  111.   end;
  112.   TextColor(MenuPos.Color);
  113.   TextBackground(MenuPos.background);
  114. end; { PrintRankSuit }
  115.  
  116. procedure BackSpace;
  117. begin
  118.   Delete(Command, Length(Command) , 1);
  119.   GotoXY(WhereX-1, WhereY);
  120.   Write(' ');
  121.   GotoXY(WhereX-1, WhereY);
  122. end; { BackSpace }
  123.  
  124. procedure NewDefaults;
  125. { Asks if user wants to change the defaults, if yes calls GetDefaults }
  126. var
  127.   ch : char;
  128. begin
  129.   ClearMenu;
  130.   GotoPos(MenuPos,0,3);
  131.   Write('Reset the defaults? ');
  132.   GetOption(ch, ['Y', 'N', ^C ]);
  133.   case ch of
  134.     ^C    : StopGames;
  135.     'Y'   : begin
  136.                Write('Yes');
  137.                GetDefaults;
  138.                NewScreen;
  139.              end;
  140.      else Write('No');
  141.   end; { case }
  142.   Delay(400);
  143.   ch := ' ';
  144. end; { NewDefaults }
  145.  
  146. procedure PrintPrompt(Hand : HandType);
  147. { The user prompt is the hand to play }
  148. begin
  149.   GotoPos(CommandPos,0,0);
  150.   ClearEol;
  151.   Write(HandName[Hand],': ');
  152. end; { PrintPrompt }
  153.  
  154. procedure ShowScore(Bidding : boolean; Hand : HandType);
  155. { Checks if the user wants to look at the score }
  156. begin
  157.   DisplayScore(0);
  158.   if Bidding then
  159.     BidMenu
  160.   else
  161.     PlayMenu;
  162.   PrintPrompt(Hand);
  163. end; { ShowScore }
  164.  
  165. procedure ReadPrepare(Hand : HandType;
  166.                       var Command : CommandString);
  167. { Sets up for reading an option }
  168. begin
  169.   PrintPrompt(Hand);
  170.   Write(' ');
  171.   GotoXY(WhereX-1, WhereY);
  172.   Command := '';
  173.   FlushBuffer;
  174. end; { ReadPrepare }
  175.  
  176. procedure GetBid(Hand : HandType;
  177.                  var Command : CommandString;
  178.                  var Restart : boolean);
  179. { Reads, parses and prints the the user Bid option }
  180. var
  181.   OptionRead : boolean; { True when we are Done reading the option }
  182.  
  183. procedure PrintOption(var Command : CommandString);
  184. begin
  185.   if Length(Command) = 1 then
  186.   begin
  187.     case Command[1] of
  188.       'D'  : Command := 'DBL';
  189.       'R'  : Command := 'RDBL';
  190.       'P'  : Command := 'PASS';
  191.       else;
  192.     end;
  193.     Write(Command);
  194.   end
  195.   else
  196.   begin
  197.     GotoXY(WhereX-1, WhereY);
  198.     Write(' ');
  199.     GotoXY(WhereX-1, WhereY);
  200.     PrintRankSuit(Command[1],Command[2]);
  201.   end;
  202.   Delay(ShortDelay);
  203. end; { PrintOption }
  204.  
  205. procedure ReadBid(var Command : CommandString);
  206. { Reads options of Length 1 and 2 passing in the approprate sets of
  207.   Legal characters }
  208. const
  209.   Legal1stChars : CharSet = ['1'..'7','R','D','P','C','N','S','X'];
  210.   Legal2ndChars : CharSet = ['C','D','H','S','N',#8];
  211. var
  212.   ch : char;
  213. begin
  214.   if Length(Command) = 0 then
  215.   begin
  216.     GetOption(ch, Legal1stChars);
  217.     ClearError;
  218.   end
  219.   else
  220.     if Length(Command) = 1 then
  221.       GetOption(ch, Legal2ndChars);
  222.   Command := Command + ch;
  223. end; { ReadBid }
  224.  
  225. procedure ParseBid(var Command : CommandString;
  226.                    Hand : HandType;
  227.                    var OptionRead, Restart : boolean);
  228. { Command holds the user's bid this routine checks its legality }
  229.  
  230. procedure ParseFirst(var Command : CommandString; Hand : HandType;
  231.                      var OptionRead, Restart : boolean);
  232. begin
  233.   Restart := false;
  234.   case Command[1] of
  235.     'X'      : begin
  236.                  Write('EXIT');
  237.                  StopGames;               { Exits program }
  238.                end;
  239.     '1'..'7' : begin
  240.                  Write(Command);
  241.                  OptionRead := false;      { Bid Number }
  242.                  BidSuitHelp;
  243.                end;
  244.     'R',                                   { Redouble   }
  245.     'D',                                   { Double     }
  246.     'P'      : OptionRead := true;         { Pass       }
  247.     'C'      : begin                       { Clear Bids }
  248.                  Write(Command);
  249.                  Command := '';
  250.                  Delay(ShortDelay);
  251.                  ClearBids;
  252.                  Restart := true;
  253.                  OptionRead := true;
  254.                end;
  255.     'N'      : begin                       { New Deal }
  256.                  Write(Command);
  257.                  Delay(ShortDelay);
  258.                  Command := '';
  259.                  NewDefaults;
  260.                  NewDeal;
  261.                  Restart := true;
  262.                  OptionRead := true;
  263.  
  264.                end;
  265.     'S'      : begin                      { Show Score }
  266.                  ShowScore(true,Hand);    { First paramater indicates
  267.                                              that we are Bidding }
  268.                  Command := '';
  269.                  OptionRead := false;
  270.                end;
  271.   end; { case }
  272. end; { ParseFirst }
  273.  
  274. procedure ParseSecond(var Command : CommandString;
  275.                       var OptionRead : boolean);
  276. begin
  277.   case Command[2] of
  278.     #8          : begin
  279.                     BackSpace;
  280.                     BidMenu;    { Redraw the first menu }
  281.                     Command := '';
  282.                     OptionRead := false;
  283.                   end;
  284.     'C','S',
  285.     'H','D','N' : OptionRead := true;
  286.   end;
  287. end; { ParseSecond }
  288.  
  289. begin { ParseBid }
  290.  if Length(Command) = 1 then
  291.    ParseFirst(Command, Hand, OptionRead, Restart)
  292.  else
  293.    if (Length(Command) = 2) then
  294.      ParseSecond(Command, OptionRead);
  295. end; { ParseBid }
  296.  
  297. procedure GetBidOption(Hand : HandType;
  298.                        var Command : CommandString;
  299.                        var OptionRead, Restart : boolean);
  300. { Reads the users Bid Command and parses it for meaning }
  301. begin
  302.   ReadBid(Command);
  303.   ParseBid(Command, Hand, OptionRead, Restart);
  304. end; { GetBidOption }
  305.  
  306. begin { GetBid }
  307.   Restart := false;
  308.   OptionRead := false;
  309.   ReadPrepare(Hand, Command);
  310.   repeat
  311.     GetBidOption(Hand, Command, OptionRead, Restart);
  312.   until OptionRead;
  313.   if Length(Command) > 0 then
  314.     PrintOption(Command);
  315. end; { GetBid }
  316.  
  317. procedure GetPlay(Hand : HandType;
  318.                   var Command : CommandString;
  319.                   var Restart : boolean);
  320. { Gets the users Command to play a Card }
  321.  
  322. procedure PrintOption(var Command : CommandString);
  323. begin
  324.   if Length(Command) > 1 then
  325.   begin
  326.     GotoXY(WhereX-1, WhereY);
  327.     Write(' ');
  328.     GotoXY(WhereX-1, WhereY);
  329.     PrintRankSuit(Command[1],Command[2]);
  330.     Delay(ShortDelay);
  331.   end;
  332. end; { PrintOption }
  333.  
  334. procedure ReadPlay(var Command : CommandString);
  335. const
  336.   Legal1stChars : CharSet = ['2'..'9','T','J','Q','K',
  337.                              'A','S','X','N','O','H',#13];
  338.   Legal2ndChars : CharSet = ['C','D','H','S',#8,#13];
  339. var
  340.   ch : char;
  341. begin
  342.   if Length(Command) = 0 then
  343.   begin
  344.     GetOption(ch, Legal1stChars);
  345.     ClearError;
  346.   end
  347.   else
  348.     GetOption(ch, Legal2ndChars);
  349.   Command := Command + ch;
  350. end; { ReadPlay }
  351.  
  352. procedure ParsePlay(var Command : CommandString;
  353.                      Hand : HandType; var OptionRead, Restart : boolean);
  354.  
  355. procedure ParseFirst(var Command : CommandString;
  356.                      Hand : HandType; var OptionRead, Restart : boolean);
  357. { Parses the first character of a play command }
  358. begin
  359.   case Command[1] of
  360.     #13             : begin
  361.                         Delete(Command,Length(Command),1);
  362.                         OptionRead := true;
  363.                       end;
  364.     '2'..'9','T',
  365.     'J','Q','K','A' : begin
  366.                         Write(Command);
  367.                         OptionRead := false; { Read one more }
  368.                         PlaySuitHelp;
  369.                       end;
  370.     'S'             : begin
  371.                         Write(Command);
  372.                         Delay(ShortDelay);
  373.                         ShowScore(false,Hand);
  374.                         { First paramater indicates that we are playing }
  375.                         Command := '';
  376.                         OptionRead := false; { Option handled internally }
  377.                       end;
  378.     'X'             : begin
  379.                         Write('EXIT');
  380.                         StopGames;             { Abort program }
  381.                       end;
  382.     'N'             : begin
  383.                         Write(Command);
  384.                         Delay(ShortDelay);
  385.                         Command := '';
  386.                         Restart := true;
  387.                         OptionRead := true;
  388.                         Writeln(OutputFile);
  389.                         Writeln(OutputFile);
  390.                         Writeln(OutputFile, ' ':10, 'Game cancelled...');
  391.                         Writeln(OutputFile);
  392.                       end;
  393.     'O','H'         : begin
  394.                         Write(Command);
  395.                         Delay(ShortDelay);
  396.                         OptionRead := true;
  397.                       end;
  398.   end;
  399. end; { ParseFirst }
  400.  
  401. procedure ParseSecond(var Command : CommandString;
  402.                       var OptionRead : boolean);
  403. begin
  404.   case Command[2] of
  405.     #8   : begin
  406.              BackSpace;
  407.              PlayMenu;    { Redraw the first menu }
  408.              Command := '';
  409.              OptionRead := false;
  410.            end;
  411.     #13  : begin
  412.              Delete(Command,Length(Command),1);
  413.              OptionRead := true;
  414.            end;
  415.     else  OptionRead := true;
  416.   end;
  417. end; { ParseSecond }
  418.  
  419. begin { ParsePlay }
  420.   if Length(Command) = 1 then
  421.     ParseFirst(Command, Hand, OptionRead, Restart)
  422.   else
  423.     ParseSecond(Command, OptionRead);
  424. end; { ParsePlay }
  425.  
  426. procedure GetPlayOption(Hand : HandType;
  427.                         var Command : CommandString;
  428.                         var OptionRead, Restart : boolean );
  429. begin
  430.   ReadPlay(Command);
  431.   ParsePlay(Command, Hand, OptionRead, Restart);
  432. end; { GetPlayOption }
  433.  
  434. var
  435.   OptionRead : boolean;
  436.  
  437. begin { GetPlay }
  438.   Restart := false;
  439.   ReadPrepare(Hand, Command);
  440.   repeat
  441.     GetPlayOption(Hand, Command, OptionRead, Restart);
  442.   until OptionRead;
  443.   PrintOption(Command);
  444. end; { GetPlay }
  445.  
  446. procedure Answer(Hand        : HandType;
  447.                  var Command : CommandString;
  448.                  Bidding     : boolean;
  449.                  var Restart : boolean);
  450. { Reads a Command for the Hand }
  451. begin
  452.   if Bidding then
  453.   begin
  454.     BidMenu;
  455.     GetBid(Hand, Command, Restart);
  456.   end
  457.   else
  458.     GetPlay(Hand, Command, Restart);
  459.   GotoPos(CommandPos,0,0);
  460.   ClearEol;
  461. END; { Answer }
  462.  
  463. procedure ChangeDefaults;
  464. { Ask about a new Game, change of defaults }
  465. var
  466.   Choice : char;
  467.  
  468. begin { ChangeDefaults }
  469.   ClearMenu;
  470.   FlushBuffer;
  471.   GotoPos(MenuPos,2,2);
  472.   Write('Reset the options? ');
  473.   GetOption(Choice,['Y','N']);
  474.   if Choice = 'Y' then
  475.   begin
  476.     Write('Yes');
  477.     FlushBuffer;
  478.     GetDefaults;
  479.     NewScreen;
  480.   end
  481.   else
  482.   begin
  483.     Write('No');
  484.   end;
  485.   ClearMenu;
  486. end; { ChangeDefaults }
  487.  
  488. procedure ShowHint(Hand : HandType;
  489.                    HintCard : CardType; var HintPlayed : boolean);
  490. var
  491.   Choice : char;
  492. begin
  493.   ClearMenu;
  494.   PrintPrompt(Hand);
  495.   SetColor(TrumpColor[HintCard.Suit]);
  496.   write(CardStr(HintCard));
  497.   HintHelp;
  498.   GetOption(Choice,[#13, #8]);
  499.   HintPlayed := (Choice = #13);
  500. end;
  501.  
  502. { end INPUT.BR }