|
Poker Squares - Source CodeTwo dimensional poker-style card game. |
|
REBOL [ Title: "Poker Squares" Date: 2-Dec-2000 Author: "Allen Kamp" Email: allen@aussieweb.com.au Version: 2.0.4 File: %psquares.r category: [games view] Purpose: {A fun card game} Notes: {Based on the game as described by David Parlett in Penguin Book of Card Games 1987.} History: [ 2.0.0 [15-Dec-2000 "Rewritten for Link" "Allen K"] 2.0.1 [16-Apr-2001 "Ported to View 1.1" "Allen K"] 2.0.1 [16-May-2001 "Updated Help" "Allen K"] 2.0.3 [15-Nov-2001 "Updated for Link" "Allen K"] 2.0.4 [3-Mar-2004 "Updated for Browser Plugin" "Allen K"] ] ] rf-view-utils: make object! [ set 'data-download func [url [url!] message [string!] {Shows a dialog if needed whilst doing a load-thru} /decompress /local data-file wait-message ][ either exists-thru? url [ data-file: either decompress [ system/words/decompress load-thru/binary url ][ load-thru/binary url ] ][ wait-message: layout [ size 350x40 backdrop 230.230.204 at 10x10 text (message) black ] view/new center-face wait-message data-file: either decompress [ system/words/decompress load-thru/binary url ][ load-thru/binary url ] unview/only wait-message ] return data-file ] ] ;--- End Rebolforces View Utils ctx-ps: context [ get-pane: func [face][copy/deep face/pane] random/seed now/time score-method: 1 ;1 English 2 American total: 0 ; do decompress read/binary %cards.bin do data-download/decompress http://www.rebol.net/plugin/demos/cards.bin "Downloading Card image File (65k). Please Wait.." ;--------------- ; Scoring Data ;--------------- hands: [ [piles [ 1 2 3 4 5] status 0] [piles [ 6 7 8 9 10] status 0] [piles [11 12 13 14 15] status 0] [piles [16 17 18 19 20] status 0] [piles [21 22 23 24 25] status 0] [piles [ 1 6 11 16 21] status 0] [piles [ 2 7 12 17 22] status 0] [piles [ 3 8 13 18 23] status 0] [piles [ 4 9 14 19 24] status 0] [piles [ 5 10 15 20 25] status 0] ] ;---------------- ; Score Functions ;---------------- scorehand: func [hand /local card score-id suits ranks][ suits: copy [] ranks: copy [] score-id: 0 foreach id hand [ card: tableau/pane/:id/content/1 append ranks cards/:card/rank append suits cards/:card/suit ] sort ranks either zero? (score-id: pairs? ranks) [ score-id: (flush? suits) + (straight? ranks) + (royal? ranks) ][ score-id ] ] display: func [score-id index /local description points][ set [description points] get-score score-id descriptions/pane/:index/text: description scores/pane/:index/text: points scores/pane/:index/data: score-id total/text: total/text + points show descriptions/pane/:index show scores/pane/:index total show total ] re-score: func [ /local which score-id score tally][ tally: 0 repeat index 10 [ score-id: scores/pane/:index/data if not none? score-id [ score: second get-score score-id scores/pane/:index/text: score show scores/pane/:index tally: tally + score ] ] total/text: tally show total ] get-score: func [score-id /local description points][ set [description points] switch/default score-id [ 20 [["Royal Flush" [30 100]]] 15 [["Straight" [12 15]]] ;ace high straight 12 [["Straight Flush" [30 75]]] 7 [["Straight" [12 15]]] ;normal straight 6 [["Four of Kind" [16 50]]] 5 [["Flush" [5 20 ]]] 4 [["Full House" [10 25]]] 3 [["Three of a Kind" [ 6 10]]] 2 [["Two Pair" [ 3 5]]] 1 [["One Pair" [ 1 2]]] ][ ["Nothing" [ 0 0]]] reduce [description pick points score-method] ] process: func [face /local index][ ;-if row or column is full, score it index: face/row hands/:index/status: hands/:index/status + 1 if hands/:index/status = 5 [ display scorehand hands/:index/piles index ] index: face/column + 5 hands/:index/status: hands/:index/status + 1 if hands/:index/status = 5 [ display scorehand hands/:index/piles index ] ] flush?: func [suits][ either (length? (intersect suits suits)) = 1 [5][0] ] straight?: func [ranks][ either all [(ranks/2 + 3) = ranks/5 any [(ranks/1 + 4) = ranks/5 (ranks/1 + 12) = ranks/5 ] ][ return 7 ][ return 0 ] ] royal?: func [ranks][ either all [ ranks/1 = 1 ranks/2 = 10 ranks/3 = 11 ranks/4 = 12 ranks/5 = 13 ][8][0] ] pairs?: func [ranks /local i][ i: 0 If ranks/1 = ranks/2 [i: i + 1] If ranks/1 = ranks/3 [i: i + 1] If ranks/1 = ranks/4 [i: i + 1] If ranks/1 = ranks/5 [i: i + 1] If ranks/2 = ranks/3 [i: i + 1] If ranks/2 = ranks/4 [i: i + 1] If ranks/2 = ranks/5 [i: i + 1] If ranks/3 = ranks/4 [i: i + 1] If ranks/3 = ranks/5 [i: i + 1] If ranks/4 = ranks/5 [i: i + 1] i ] ;------------- ; New Game ;------------- get-seed: func [ /local game-seed inactive?][ random/seed now game-seed: random 32000 ;---Catch first time as face is not active yet if seed/text = "" [inactive?: true] seed/text: game-seed if not inactive? [show seed] return game-seed ] shuffle: func [pack [block!] /seeded gseed [integer!] /local val size insize][ pack: copy pack size: length? pack insize: size + 1 if not seeded [gseed: get-seed] random/seed gseed repeat times 3 [ repeat index size [ val: pick pack index remove at pack index insert at pack (random insize) val ] ] return head pack ] new-pack: func [/local pack][ pack: copy [] repeat index 52 [ append pack index ] return head pack ] new-game: func [/seeded gseed][ unfocus repeat index 26 [ tableau/pane/:index/content: copy [53] show tableau/pane/:index ] repeat index 10 [ scores/pane/:index/text: copy "" scores/pane/:index/data: none descriptions/pane/:index/text: copy "" hands/:index/status: 0 show scores/pane/:index show descriptions/pane/:index ] ;Total Score total/text: 0 show total either seeded [ insert deck/content copy/part shuffle/seeded pack gseed 25 ][ insert deck/content copy/part shuffle pack 25 ] show deck ] repeat-game: func [seed][ if not error? try [seed: to-integer seed][new-game/seeded seed] ] ;-------------- ; Layout ;------------- deck: copy [] pile: make face [ offset: 0x0 size: 71x95 image: none edge: none effect: [key 0.191.0] color: none content: [53] row: 0 column: 0 feel: make feel [ engage: func [face action event index][ if action = 'down [ if face/id = 26 [new-game exit] if all [(length? deck/content) > 1 (length? face/content) = 1][ insert face/content first deck/content remove deck/content show [face deck] process face ] if system/view/focal-face [unfocus] ] ] redraw: func [face index][ index: first face/content face/image: cards/:index/image ] ] ] make-tableau: func [faces [block!] /local index coords tableau][ tableau: make face [ offset: 10x10 size: 610x515 color: 0.128.0 edge: none pane: copy [] ] index: 0 repeat rows 5 [ repeat columns 5 [ index: index + 1 append tableau/pane make pile [ offset: to-pair reduce [columns - 1 * 75 + 10 rows - 1 * 100 + 10] ID: index row: rows column: columns ] ] ] ;Add Deck append tableau/pane make pile [offset: 460x110 ID: 26] deck: tableau/pane/26 insert deck/content copy/part shuffle new-pack 25 append tableau/pane faces tableau ] ps: stylize [ gstrip: image 150x20 with [color: 0.100.0 image: none effect: [colorize 0.240.0]] lgstrip: image with [color: 0.128.0] 58x20 effect [colorize 0.240.0] ] how-to-play: layout [ style txt text 250 snow size 610x515 backdrop 0.88.0 at 200x10 vh1 "Poker Squares" gold at 30x50 vh2 "About" gold txt {A game of considerable skill. A poker square is an array of 25 cards in five rows and five columns. Each row and each column is assessed as a poker hand and given a score. There are two common scoring methods.} txt { 1. English (based upon rarity of hands occuring in Poker Squares) A score of 70 or more is considered a good score} txt { 2. American (based upon rarity of hands occuring in a normal Poker hand) A score of 200 or more is considered a good score.} at 65x300 list [ across space 0x0 style ytext text 255.255.204 right ytext 100x17 left ytext 22x17 ytext 20x17 ] 170x210 data [ ["" "E" "A"] ["Royal Flush" "30" "100"]["Straight Flush" "30" "75"]["Straight" "12" "15"] ["Four of a Kind" "16" "50"]["Flush" "5" "20"]["Full House" "10" "25"] ["Three of a Kind" "6" "10"]["Two Pair" "3" "5"]["One Pair" "1" "2"] ["Nothing" "0" "0"] ] with [color: none edge: none] at 320x50 vh2 {How to Play} gold txt { To place a card, simply click on the desired location in the grid, the top card of the deck will be placed there and the next card will be revealed on the top of the deck. Choose placement carefully, cards cannot be moved once they are placed. As each row or column is completed, it is scored.} txt {You may change the current scoring method at any time by clicking on the method beside "Score" it will show either "(English)" or "(American)" the scores will be recalculated to reflect the current selection. } 250 txt {To start a new game (at any time) click on the Deck} txt {Enjoy!} txt {Allen Kamp allen@aussieweb.com.au} at 480x480 label "Close" [unview/only how-to-play] 100x20 255.255.255 right ] replay-tab: make face [ offset: 390x15 size: 60x60 edge: none color: 0.80.0 pane: get-pane layout [ at 0x10 label "Poker" 60x16 center middle at 0x30 label "Squares" 60x16 center middle ] ] replay: make face [ offset: 448x15 size: 150x60 edge: make edge [size: 2x2 color: 0.80.0 effect: none] color: 0.100.0 pane: get-pane layout [styles ps at 0x0 gstrip at 38x0 label "How to Play?" [ unview/only how-to-play view/new/offset/title how-to-play tableau/offset "Poker Squares - Rules"] 80x20 255.255.255 right at 0x40 gstrip at 10x20 text "Repeat #" [repeat-game fseed/text] 255.255.205 at 70x20 fseed: field "" 65x20 255.255.205 [repeat-game fseed/text] at 40x40 text "New Game" [new-game] 255.255.205 ] ] underlay: make face [ offset: 448x240 size: 150x260 edge: make edge [size: 2x2 color: 0.80.0 effect: none] color: 0.100.0 pane: get-pane layout [ styles ps space 0x20 at 0x0 gstrip gstrip gstrip gstrip gstrip gstrip gstrip ] ] headings: make face [ offset: 390x240 size: 60x220 edge: none color: 0.80.0 pane: get-pane layout [ styles ps style lbl label 50x16 space 0x4 at 10x0 lbl "Row 1" lbl "Row 2" lbl "Row 3" lbl "Row 4" lbl "Row 5" at 0x100 lgstrip at 10x120 lbl "Col 1" lbl "Col 2" lbl "Col 3" lbl "Col 4" lbl "Col 5" ] ] descriptions: make face [ offset: 448x242 size: 110x260 image: color: edge: none pane: get-pane layout [ styles ps style slbl label "" 100x16 255.255.204 space 0x4 at 10x0 slbl slbl slbl slbl slbl pad 20 slbl slbl slbl slbl slbl at 2x240 text 70x20 [ score-method: score-method + 1 if score-method = 3 [score-method: 1] face/text: pick face/texts score-method show face re-score ] with [text: "(English)" texts: ["(English)" "(American)"]] white font-size 11 at 70x240 label "Score" 40x16 ] ] scores: make face [ offset: 557x242 size: 45x260 image: color: edge: none pane: get-pane layout [ style slbl label "" 30x16 255.255.204 right space 0x4 at 5x0 slbl slbl slbl slbl slbl pad 20 slbl slbl slbl slbl slbl at 5x240 slbl 255.255.255 ] ] ;--Shortcut total: scores/pane/11 total/text: 0 seed: replay/pane/5 ;--init pack: new-pack tableau: make-tableau [underlay headings descriptions scores replay replay-tab] ] ;print ctx-ps/tableau/size view center-face ctx-ps/tableau none |