home *** CD-ROM | disk | FTP | other *** search
Wrap
'*********************************************************************** ' Poker.rlz ' ' Casino-Style Draw Poker ' ' Copyright ⌐ 1991-1992 Computer Associates International, Inc. ' All rights reserved. ' '*********************************************************************** RUN "StdArray" RUN "StdSys" SetSys(_Size, {_Maximize}) HandString = {"nothing", "jacks or better", "two pair", "three of a kind", "a straight", "a flush", "a full house", "four of a kind", "a straight flush", "a royal flush"} Payoff = {-1, 2, 3, 5, 10, 20, 50, 100, 200, 500} FUNC CardSuit(cn) RETURN (cn - 1)\13 + 1 END FUNC FUNC CardVal(cn) RETURN ((cn - 1) mod 13) + 1 END FUNC FUNC CardName(cn) RETURN Sprint("CARDP(0).BMP", cn) END FUNC FUNC HandCompute(cards) LOCAL i, straight, flush LOCAL suits, counts, groups, high1, low1, high2, low2 counts[1:13] = 0 suits[1:4] = 0 groups[1:4] = 0 low1 = 15 high1 = 0 low2 = 15 high2 = 0 highpair = 0 FOR i = 1 to 5 val = ((cards[i] - 1) mod 13) + 1 suit = (cards[i] - 1)\13 + 1 counts[val] = counts[val] + 1 suits[suit] = suits[suit] + 1 low1 = Min(low1, val) high1 = Max(high1, val) val = IF val = 1 THEN 14 ELSE val low2 = Min(low2, val) high2 = Max(high2, val) NEXT i FOR i = 1 to 13 val = counts[i] IF val THEN groups[val] = groups[val] + 1 IF val = 2 THEN highpair = Max(highpair, IF i = 1 THEN 14 ELSE i) END IF END IF NEXT i straight = (((high1 - low1 = 4) OR (high2 - low2 = 4)) AND (groups[1] = 5)) flush = 0 FOR i = 1 to 4 IF suits[i] = 5 THEN flush = 1 END IF NEXT i IF straight AND flush THEN IF low2 = 10 THEN RETURN 10 ELSE RETURN 9 END IF END IF IF groups[4] THEN RETURN 8 END IF IF groups[3] AND groups[2] THEN RETURN 7 END IF IF flush THEN RETURN 6 END IF IF straight THEN RETURN 5 END IF IF groups[3] THEN RETURN 4 END IF IF groups[2] = 2 THEN RETURN 3 END IF IF groups[2] AND highpair > 10 THEN RETURN 2 END IF RETURN 1 END FUNC PROC ResetCards PDeck[1:52] = 0 IF CFlag = -1 THEN PDeck = {49, 52, 15, 33, 50, 40, 51, 19, 37, 8} CFlag = 1 END IF END PROC FUNC RandomCard LOCAL i IF CFlag > 0 THEN CFlag = CFlag + 1 RETURN PDeck[CFlag - 1] END IF LOOP i = Floor(rnd * 52) + 1 IF i <> 53 THEN IF NOT(PDeck[i]) THEN PDeck[i] = 1 RETURN i END IF END IF END LOOP END FUNC PROC DrawCard(cards, i) FormSetObject(10 + i, _Bitmap, CardName(cards[i]), ((18*i) - 11) pct, 50 pct) END PROC PROC DrawCardBack(i) FormSetObject(10 + i, _Bitmap, "BACK.BMP", ((18*i) - 11) pct, 50 pct) END PROC FUNC c(n, x) RETURN IF x = n THEN _Red ELSE _Black END FUNC PROC UpdateTitles(n) LOCAL obj IF n = LastTitle THEN EXIT PROC END IF IF LastTitle > 1THEN obj = 29+2*(LastTitle-1) FormModifyObject(obj; _Black) FormModifyObject(obj+1; _Black) END IF IF n > 1 THEN obj = 29+2*(n-1) FormModifyObject(obj; _Red) FormModifyObject(obj+1; _Red) END IF LastTitle = n END PROC PROC DrawTitles LOCAL c c = _Black FormSetObject(31, _CaptionLeft, "Jacks or better", 10 pct, 20 pct; c) FormSetObject(32, _CaptionRight, "2 to 1", 33 pct, 20 pct, 10 pct, _Default; c) FormSetObject(33, _CaptionLeft, "Two Pair", 10 pct, 24.2 pct; c) FormSetObject(34, _CaptionRight, "3 to 1", 33 pct, 24.2 pct, 10 pct, _Default; c) FormSetObject(35, _CaptionLeft, "Three of a Kind", 10 pct, 28.4 pct; c) FormSetObject(36, _CaptionRight, "5 to 1", 33 pct, 28.4 pct, 10 pct, _Default; c) FormSetObject(37, _CaptionLeft, "Straight", 10 pct, 32.6 pct; c) FormSetObject(38, _CaptionRight, "10 to 1", 33 pct, 32.6 pct, 10 pct, _Default; c) FormSetObject(39, _CaptionLeft, "Flush", 10 pct, 36.8 pct; c) FormSetObject(40, _CaptionRight, "20 to 1", 33 pct, 36.8 pct, 10 pct, _Default; c) FormSetObject(41, _CaptionLeft, "Full House", 52 pct, 20 pct; c) FormSetObject(42, _CaptionRight, "50 to 1", 75 pct, 20 pct, 10 pct, _Default; c) FormSetObject(43, _CaptionLeft, "Four of a Kind", 52 pct, 24.2 pct; c) FormSetObject(44, _CaptionRight, "100 to 1", 75 pct, 24.2 pct, 10 pct, _Default; c) FormSetObject(45, _CaptionLeft, "Straight Flush", 52 pct, 28.4 pct; c) FormSetObject(46, _CaptionRight, "200 to 1", 75 pct, 28.4 pct, 10 pct, _Default; c) FormSetObject(47, _CaptionLeft, "Royal Flush", 52 pct, 32.6 pct; c) FormSetObject(48, _CaptionRight, "500 to 1", 75 pct, 32.6 pct, 10 pct, _Default; c) END PROC PROC PlayHand LOCAL i, sel, c UpdateTitles(0) FOR i = 1 to 5 DrawCardBack(i) NEXT i ResetCards FOR i = 1 to 5 cards[i] = RandomCard NEXT i FOR i = 1 to 5 DrawCard(cards, i) NEXT i FormModifyObject(1, _Gray) UpdateTitles(HandCompute(cards)) FormModifyObject(1, _Normal, "Draw") FormModifyObject(60, _Gray) flipped = dim(5) PokerMode = 2 END PROC PROC ProcessMode2(sel) LOCAL i, c, h SELECT CASE sel CASE 1 'Draw FOR i = 1 to 5 IF flipped[i] THEN cards[i] = RandomCard DrawCard(cards, i) END IF NEXT i FormModifyObject(1, _Gray) h = HandCompute(cards) UpdateTitles(h) score = score + Payoff[h] * bet FormSetObject(62, _CaptionCenter, "Cash: $ " + sprint("P(0)", score), 32 pct, 88.8 pct) FormModifyObject(1, _Normal, "Deal") FormModifyObject(60, _Normal) IF CFlag > 1 THEN CFlag = 0 END IF PokerMode = 1 CASE 11 TO 15 'Cards c = sel - 10 IF flipped[c] THEN DrawCard(cards, c) flipped[c] = 0 ELSE DrawCardBack(c) flipped[c] = 1 END IF END SELECT END PROC PROC ProcessMode1(sel) SELECT CASE sel CASE 1 'Deal newbet = StrToNum(FormQStr(60)) IF newbet < 1 OR newbet > 5 THEN INPUT "1 to 5 coins, please"; ELSE bet = newbet PlayHand PokerMode = 2 END IF END SELECT END PROC PROC formprocPoker(params) FormSelect(params[_FormNum]) IF params[_Invoke] = _Close OR params[_ItemNum] = 3 THEN %%PokerFlag = 0 FormControl(_Close) EXIT PROGRAM END IF IF PokerMode = 1 THEN ProcessMode1(params[_ItemNum]) ELSE ProcessMode2(params[_ItemNum]) END IF END PROC PROC mpC(params) IF CFlag = 0 THEN CFlag = -1 END IF END PROC CFlag = 0 score = 100 bet = 1 AddSys(_LoadDir, QSys(_ProgDir) + "cards") menuC = MenuQUnique MenuNew(menuC; "") MenuSetCmd(1, "", 12) MenuSetProc(mpC) FontNew(1; "helv", 24, _Bold) Randomize StrToNum(sprint("D(m1s1)", qdate)) fdPoker = FormQUnique FormNew(fdPoker; "Draw Poker", _Title + _Minimize + _Close) FormControl(_Size; 5 pct, 5 pct, 90 pct, 90 pct) FormSetColor(0.4, 1.0, 0.6) FormSetColor(_Black; _Text) FormSetColor(0.4, 1.0, 0.6; _Field) FormSetObject(20, _CaptionCenter, "Realizer Casino -- Draw Poker", 1, 0 pct, 2 pct, 100 pct, _Default) LastTitle = 0 FormSetObject(1, _DefButton, "Deal", 10 pct, 87 pct, 15 pct, _Default) FormSetObject(61, _CaptionLeft, "Bet:", 51 pct, 88.8 pct) FormSetObject(60, _EditText, "1", 58 pct, 87.3 pct, 10 pct, _Default) FormSetObject(62, _CaptionCenter, "Cash: $ " + sprint("P(0)", score), 32 pct, 88.8 pct) FormSetObject(3, _Button, "Quit", 75 pct, 87 pct, 15 pct, _Default) DrawTitles PokerMode = 1 FormSetProc(formprocPoker) FormControl(_Show)