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

  1. {  ╔══════════════════════════════════════════════════════╗
  2.    ║         INIT.BR  Module of BRIDGE.PAS                ║                                                      ║
  3.    ║                                                      ║
  4.    ║                Last modified 10/29/85                ║
  5.    ║                                                      ║
  6.    ║   Initializes bridge data structures, deals the      ║
  7.    ║   cards, and calls bid and play display routines.    ║
  8.    ╚══════════════════════════════════════════════════════╝
  9. }
  10.  
  11. function Min(a, b: integer): integer;
  12. begin
  13.   if a < b then
  14.     Min := a
  15.   else
  16.     Min := b;
  17. end; { Min }
  18.  
  19. function Max(a, b: integer): integer;
  20. begin
  21.   if a > b then
  22.     Max := a
  23.   else
  24.     Max := b;
  25. end; { Min }
  26.  
  27. procedure Exchange(a, b: IndexType);
  28. { Exchange cards with index A and B in Sdist and updates Sdata }
  29. var
  30.   ah, bh : HandType;
  31.   an, bn : CardNoType;
  32.   Card   : CardType;
  33.  
  34. procedure Update(Hand: HandType;   Sign: integer);
  35. { Update Sdata[Hand] }
  36. begin
  37.   with Sdata[Hand], Card do
  38.   begin
  39.     l[Suit] := l[Suit] +  Sign;
  40.     if Value > 10 then
  41.       p := p + (Value - 10) * Sign; { High Card points }
  42.     if l[Suit] * 2 - Sign <= 5 then
  43.       p := p - Sign; { Distribution points }
  44.   end;
  45. end; { Update }
  46.  
  47. begin { Exchange }
  48.   ah := a and 3;
  49.   an := a shr 2;
  50.   bh := b and 3;
  51.   bn := b shr 2;
  52.   Card := Sdist[ah, an];
  53.   Update(ah, -1);
  54.   Update(bh, 1);
  55.   Sdist[ah, an] := Sdist[bh, bn];
  56.   Sdist[bh, bn] := Card;
  57.   Card := Sdist[ah, an];
  58.   Update(bh, -1);
  59.   Update(ah, 1);
  60. end; { Exchange }
  61.  
  62. procedure ChangeCards;
  63. { Mixes some of the unknown cards in Sdist in such a way that
  64.   Sdata still corresponds with Info afterwards }
  65. var
  66.   Cnt    : integer;
  67.   a, b   : IndexType;
  68.   ah, bh : HandType;
  69.   ac, bc : CardType;
  70.  
  71. begin { ChangeCards }
  72.   for Cnt := 1 to 26 do
  73.   begin
  74.     repeat
  75.       a  := Random(52);  { 1st Card }
  76.       ah := a and 3;
  77.       ac := Sdist[ah, a shr 2];
  78.     until not ac.Known;
  79.     repeat
  80.       b  := Random(52);     { 2nd Card }
  81.       bh := b and 3;
  82.       bc := Sdist[bh, b shr 2];
  83.     until not bc.Known;
  84.     if ah <> bh then
  85.     begin
  86.       Exchange(a, b);      { Exchange cards }
  87.          { if the the difference between Sdata and Info was made
  88.            larger, then Exchange the cards Back again }
  89.       if (Info[ah].Minl[ac.Suit] > Sdata[ah].l[ac.Suit])
  90.          or (Info[bh].Minl[ac.Suit] < 0)
  91.          or (Info[bh].Minl[bc.Suit] > Sdata[bh].l[bc.Suit])
  92.          or (Info[ah].Minl[bc.Suit] < 0)
  93.          or (ac.Value > 10)
  94.            and ((Sdata[ah].p < Info[ah].MinP)
  95.              or (Sdata[ah].p > Info[ah].MaxP))
  96.          or (bc.Value > 10)
  97.            and ((Sdata[bh].p < Info[bh].MinP)
  98.              or (Sdata[bh].p > Info[bh].MaxP)) then
  99.                Exchange(a, b);
  100.     end; { if }
  101.   end;
  102. end; { ChangeCards }
  103.  
  104. procedure DealCards;
  105. { Deals the unknown cards in Sdist at Random.
  106.   if BidNo=0, All cards will be changed }
  107. var
  108.   i, j : IndexType;
  109.   Hand : HandType;
  110.   No   : CardNoType;
  111. begin
  112.   { Calculate which cards are known }
  113.   if BidNo <> 0 then
  114.     for Hand := North to West do
  115.       for No := 0 to 12 do
  116.         with Sim, Sdist[Hand, No] do
  117.           { Played and own cards and Dummy are known,
  118.             and Dummy knows partners Hand }
  119.           Known := Played or (Hand=PlayingHand)
  120.                    or (Round>0)
  121.                      and ((Hand=Dummy) or (PlayingHand=Dummy)
  122.                        and not odd(Hand + Dummy));
  123.  
  124.   for i := 0 to 50 do    { Mix unKNOWN cards }
  125.     if not Sdist[i and 3, i shr 2].Known then  { Get All unknown positions }
  126.     begin
  127.       repeat  { Pick an unknown Card }
  128.         j := i + Random(52 - i);
  129.       until not Sdist[j and 3, j shr 2].Known;
  130.       Exchange(i, j);
  131.     end;
  132. end; { DealCards }
  133.  
  134. procedure DealNewCards;
  135. { Deals the cards in Sdist at Random. }
  136. var
  137.   i, j : IndexType;
  138. begin
  139.   for i := 0 to 50 do    { Mix cards }
  140.   begin
  141.     repeat  { Pick an unknown Card }
  142.         j := i + Random(52 - i);
  143.     until not Sdist[j and 3, j shr 2].Known;
  144.     Exchange(i, j);
  145.   end;
  146. end; { DealNewCards }
  147.  
  148. procedure SortCards;
  149. { Sorts each Suit in each Hand in Sdist with largest cards first }
  150. var
  151.   h    : HandType;
  152.   i, j : CardNoType;
  153.   Card : CardType;
  154. begin
  155.   for h := North to West do
  156.     for i := 0 to 11 do with Sdist[h, i] do
  157.       if not Known then
  158.         for j := i + 1 to 12 do
  159.           if not    Sdist[h, j].Known and
  160.              (Suit =Sdist[h, j].Suit) and
  161.              (Value<Sdist[h, j].Value) then
  162.           begin
  163.             Card     := Sdist[h, i];
  164.             Sdist[h, i] := Sdist[h, j];
  165.             Sdist[h, j] := Card;
  166.           end;
  167. end; { SortCards }
  168.  
  169. procedure InitGames;
  170. { Initializes the global variables in beginning of program }
  171. var
  172.   h    : HandType;
  173.   No   : CardNoType;
  174.   s, s0 : SuitType;
  175. begin
  176.   Randomize;
  177.   InitTrumpStr;
  178.   Writeln('Creating BRIDGE script file...');
  179.   Assign(OutputFile, 'BRIDGE');
  180.   {$I-}
  181.   Rewrite(OutputFile);
  182.   if IOresult <> 0 then
  183.   begin
  184.     Writeln('Cannot open script file.  Program aborting.');
  185.     Halt;
  186.   end;
  187.   {$I+}
  188.   Writeln(OutputFile, '                          TURBO BRIDGE');
  189.   Writeln(OutputFile, '                        ================');
  190.   Writeln(OutputFile);
  191.   { Initialize Sdist and Sdata }
  192.   for s := Club to Spade do
  193.   begin
  194.     h := Ord(s);
  195.     for No := 0 to 12 do
  196.       with Rdist[h, No] do
  197.       begin
  198.         Suit := s;
  199.         Value := No + 2;
  200.         Played := true;
  201.       end;
  202.     with Rdata[h] do
  203.     begin
  204.       for s0 := Club to Spade do
  205.         l[s0] := 0;   p := 10 + 3*3;
  206.     end;
  207.   end; { for }
  208.   GameNo := 0;              { Initialize variables }
  209.   Dealer := West;
  210.   Dummy := West;
  211.   GetDefaults;            { Read information from keyboard }
  212. end; { InitGames }
  213.  
  214. procedure StopGames;
  215. begin
  216.   Close(OutputFile);
  217.   LowVideo;
  218.   GotoXY(1, 25);
  219.   ClrEol;
  220.   Halt;
  221. end;
  222.  
  223. procedure PrintBidScreen;
  224. { Setup the screen used for Bidding }
  225. var
  226.   Hand: HandType;
  227. begin
  228.   ClearInfoArea;
  229.   ClearIt;  { Clears table and bid window }
  230.   PrintScreen(North);
  231.   PrintNames(Dealer);
  232.   for Hand := North to West do
  233.     if HandKnown(Hand) then
  234.     begin
  235.       GotoHand(Hand, 7, 0);
  236.       SetColor(HandNameColor);
  237.       Write(Sdata[Hand].p - DistPoints(Hand):2, ' + ', DistPoints(Hand):1);
  238.     end;
  239.   OutputHands;
  240.   OutputNames(Dealer);
  241. end;  { PrintBidScreen }
  242.  
  243. var
  244.   DummyPartner : integer;
  245.       { holds the Value of Partner of the Dummy which needs to be
  246.         restored at the end of the Game if the Computer decided to
  247.         play the Hand for the Computer }
  248.  
  249. procedure HumanPlays(Dummy : HandType);
  250. { Now the user plays the dummys Hand }
  251. begin
  252.   Computer[DummyPartner] := false;
  253.   Computer[Dummy] := true;
  254. end; { HumanPlays }
  255.  
  256. procedure ResetPartner;
  257. { if human Played the Dummy then this procedure resets the
  258.   Dummy and the declarer appropriately.  This procedure is
  259.   called when the Hand is concluded }
  260. begin
  261.   if (DummyPartner <> - 1) then { then the human Played for the Computer }
  262.   begin
  263.     Computer[DummyPartner] := true;
  264.     Computer[Partner(DummyPartner)] := false;
  265.   end;
  266.   DummyPartner := -1;
  267. end;  { ResetPartner }
  268.  
  269. procedure PrintPlayScreen;
  270. { Setup the screen used for playing }
  271. begin
  272.   if DummyPartner <> -1 then
  273.     HumanPlays(Dummy);
  274.   PrintScreen(Dummy);
  275.   PrintNames((Dummy - 1) and 3);
  276.   PrintContract;
  277.   OutputContract;
  278.   Writeln(OutputFile);
  279.   OutputNames((Dummy - 1) and 3);
  280. end; { PrintPlayScreen }
  281.  
  282. procedure ResetGameVars;
  283. { Reset game variables for new game, new deal or new bids }
  284. var
  285.   h  : HandType;
  286.   No : CardNoType;
  287.   s  : SuitType;
  288. begin
  289.   BidNo := 0;
  290.   Contract := Pass;
  291.   Doubled := 0;
  292.   with Rel do begin
  293.     Round := 0;
  294.     WonTricks := 0;
  295.     TrickNo := 0;
  296.   end;
  297.   Sdist := Rdist;
  298.   Sdata := Rdata;  { Make All cards unPLAYED }
  299.   for h := North to West do
  300.     with Info[h] do
  301.     begin
  302.       for No := 0 to 12 do with Sdist[h, No], Sdata[h] do
  303.       begin
  304.         if Played then
  305.           l[Suit] := l[Suit] + 1;
  306.         Known := false;
  307.         Played := false;
  308.       end;
  309.       MinP := 0;
  310.       MaxP := 40;
  311.       for s := Club to Spade do
  312.         Minl[s] := 0;
  313.     end;
  314. end; { ResetGameVars }
  315.  
  316. procedure ResetGame;
  317. { Reset variables to Start a new Game }
  318. var
  319.   i : integer;
  320. begin
  321.   GameNo := GameNo + 1;
  322.   Dealer := (Dealer + 1) and 3;
  323.   ResetGameVars;
  324.   for i := 1 to (Random(3) + 1) do
  325.     DealNewCards;            { Deal and sort cards, and print the screen }
  326.   SortCards;
  327.   Rdist := Sdist;
  328.   Rdata := Sdata;
  329.   PrintBidScreen;
  330. end;  { ResetGame }
  331.  
  332. procedure NewDeal;
  333. { Reset variables to Start a new Game }
  334. var
  335.   i : integer;
  336. begin
  337.   ResetGameVars;
  338.   for i := 1 to (Random(3) + 1) do
  339.     DealNewCards;
  340.   SortCards;
  341.   Rdist := Sdist;
  342.   Rdata := Sdata;
  343.   Writeln(OutputFile);
  344.   Writeln(OutputFile, '           Redeal Cards...');
  345.   Writeln(OutputFile);
  346.   Writeln(OutputFile);
  347.   PrintBidScreen;
  348. end; { NewDeal }
  349.  
  350. procedure ClearBids;
  351. { Clears the bids in the current game without redealing }
  352. begin
  353.   ResetGameVars;
  354.   ClearTable;
  355.   InfoNo := 0;
  356.   ClearBidWindow;
  357.   Writeln(OutputFile);
  358.   Writeln(OutputFile, '           Bids Cleared...');
  359. end; { ClearBids }
  360.  
  361. procedure StartPlay;
  362. { Start the play after the Bidding }
  363. begin
  364.   with Rel do
  365.   begin
  366.     LeadHand := (Dummy + 3) and 3;
  367.     PlayingHand := LeadHand;
  368.     Sdist := Rdist;
  369.     Sdata := Rdata;
  370.     PrintContract;
  371.   end;
  372. end; { StartPlay }
  373.  
  374. { end INIT.BR }
  375.