const int minimum := 25; int player_funds := 3000; box decks{int ndecks} is random r; array{int,52} cards; int dealt; proc auto_init is r.randomize; dealt := 0; for int i:= upto(1, 52) do cards[i] := 0; end for; end proc; proc shuffle is auto_init; end proc; proc burn(int n) is int m; for int i:=upto(1,n) do m := deal; end for; end proc; proc display(int n) is int suit; int card; assert ( n > 0 ); suit := (n - 1) / 13; card := n mod 13; if card == 11 then putline("J"); elsif card == 12 then putline("Q"); elsif card == 0 then putline("K"); elsif card == 1 then putline("A"); else putline(card.to_string); end if; if suit == 0 then putline("C"); elsif suit == 1 then putline("D"); elsif suit == 2 then putline("H"); elsif suit == 3 then putline("S"); end if; end proc; func int value(int n) is int card; card := n mod 13; if card >= 10 then return 10; else return card; end if; end func; func int remaining is int how_many; how_many := 0; for int i:=upto(1,52) do how_many := how_many + ( ndecks - cards[i] ); end for; return how_many; end func; func int deal is int n; int tries := 0; repeat n := r.between(1,52); tries := tries + 1; if tries > 30 then if remaining <> 0 then tries := 0; else putline("The shoe is empty.\n"); return 0; end if; end if; until cards[ n ] < ndecks; cards[ n ] := cards[ n ] + 1; dealt := dealt + 1; return n; end func; end box; decks{8} cards; func int player_hand(int player) is int card; if player < 6 then card := cards.deal; return card; end if; return 0; end func; func int banker_hand(int player; int banker) is if player == 0 then #player stands if banker >= 0 and banker <= 5 then return cards.deal; else return 0; end if; end if; if banker <= 2 then return cards.deal; elsif banker == 3 then if player <> 8 then return cards.deal; else return 0; end if; elsif banker == 4 then if player >= 2 and player <= 7 then return cards.deal; else return 0; end if; elsif banker == 5 then if player >= 4 and player <= 7 then return cards.deal; else return 0; end if; elsif banker == 6 then if (player == 6) and (player == 7) then return cards.deal; else return 0; end if; else return 0; end if; end func; func int who_won(int player, banker) is if player == banker then return 0; elsif player > banker then return 1; else return -1; end if; end func; func int baccarat is int banker; int player; int card, card1; int who; putline("Player: "); card := cards.deal; cards.display(card); player := cards.value(card); putline(" "); card := cards.deal; cards.display(card); player := player + cards.value(card); player := player mod 10; putline("("); putline(player.to_string); putline(") "); card := cards.deal; putline("Banker: "); cards.display(card); banker := cards.value(card); card := cards.deal; putline(" "); cards.display(card); banker := banker + cards.value(card); banker := banker mod 10; putline(" ("); putline(banker.to_string); putline(")\n"); who := -4; if player == 9 or player == 8 or banker == 8 or banker == 9 then if banker > player then who := -1; elsif banker == player then who := 0; else who := 1; end if; elsif who == -4 then card := player_hand(player); if card <> 0 then putline("Player receives: "); cards.display(card); putline("\n"); end if; player := player + cards.value(card); player := player mod 10; card1 := banker_hand(card, banker); if card1 <> 0 then putline("Banker receives: "); cards.display(card1); putline("\n"); end if; banker := banker + cards.value(card1); banker := banker mod 10; who := who_won(player, banker); end if; if who == -1 then putline("Banker wins "+banker.to_string+" to Player's "+ player.to_string + "\n"); elsif who == 1 then putline("Player wins " + player.to_string + " to Banker's " + banker.to_string + "\n"); else putline("It's a push\n"); end if; return who; end func; func bool take_bet(ref int banker, player, tie) is bool done; string line, who; int bet; int bet_total; banker := 0; player := 0; tie := 0; repeat putline("Bet on (P)layer, (B)anker or (T)ie or hit return to commence hand: "); @getline(line); if line == "" then done := true; else who := line.left(1); if who == "q" then return true; end if; if who <> "p" and who <> "b" and who <> "t" then putline("Invalid Bet\n"); else putline("How much?"); @getline(line); bet := line.to_int; if bet + bet_total > player_funds then putline("You don't have that much!\n"); elsif bet + bet_total < minimum then putline("Total bet is below minimum of "); putline(minimum.to_string + "\n"); else player_funds := player_funds - bet; if who == "p" then player := player + bet; bet_total := bet_total + bet; elsif who == "b" then banker:= banker + bet; bet_total := bet_total + bet; else tie := tie + bet; bet_total := bet_total + bet; end if; end if; end if; end if; until done; return false; end func; func int pay( int bet_on_bank, bet_on_player, bet_on_tie, result ) is int total; int temp; if result == 0 then # push total := 9 * bet_on_tie + bet_on_player + bet_on_bank; elsif result == 1 then # player total := 2 * bet_on_player; else # banker total := bet_on_bank + (bet_on_bank - (bet_on_bank / 20)); end if; return total; end func; proc main is int p,b,t,h; int bac; int bet_on_bank, bet_on_player, bet_on_tie; string line; putline( "Welcome to Baccarat!\n"); bac := cards.deal; putline("Burning " + cards.value(bac).to_string + " cards\n"); cards.burn(cards.value(bac)); while cards.remaining > 7 do if take_bet(bet_on_bank, bet_on_player, bet_on_tie) then return; end if; bac := baccarat; player_funds := player_funds + pay(bet_on_bank, bet_on_player, bet_on_tie, bac); if player_funds == 0 then putline("You've busted!\n"); break; end if; putline( "You now have " + player_funds.to_string + "\n"); h := h + 1; if bac == 0 then t := t + 1; elsif bac == 1 then p := p + 1; else b := b + 1; end if; end while; putline("hands = " + (h - 1).to_string +" player = "+ p.to_string); putline(" banker = " + b.to_string + " tie = " + t.to_string); putline(" cards dealt = " + cards.dealt.to_string); putline("\n"); end proc;