Rebol3 Code Examplex


Playing cards

Model a standard deck of cards and its operations.

Rebol [
    title: "Rosetta code: Playing cards"
    file:  %Playing_cards.r3
    url:   https://rosettacode.org/wiki/Playing_cards
    note:  "Based on Red language solution"
    needs: 3.0.0
]
random/seed 1                        ;; Seed the random number generator for reproducibility

make-deck: function/with [] [
    new-deck: make block! 52         ;; Create an empty block for 52 cards
    foreach s suit [                 ;; For each suit...
        foreach r rank [             ;; ...and for each rank...
            append new-deck join r s ;; ...make a card by joining rank and suit (e.g., "Q♠") and add to deck
        ]
    ]
][
    rank: "A23456789TJQK"            ;; All ranks in a suit (Ace, 2 .. 9, Ten, Jack, Queen, King)
    suit: "♣♦♥♠"                     ;; All four suits: clubs, diamonds, hearts, spades
]

deal: func [
    other-deck [block!]              ;; Deck to deal card(s) into
    deck [block!]                    ;; Deck to deal card(s) from
][
    unless empty? deck [
        append other-deck take deck  ;; If cards remain, take the top card and append to other deck
    ]
]

contents: func [deck [block!]] [
    repeat i length? deck [
        prin [deck/:i SP]            ;; Print each card with
        if zero? i % 12  [prin LF]   ;; Newline after every 12 cards for readability
    ]
]

deck: random make-deck               ;; Create and shuffle a new deck

print "40 cards from a deck:"
loop 5 [                             ;; 5 lines total
    prin LF                          ;; Blank line to separate each row
    loop 8 [prin [take deck SP]]     ;; Deal 8 cards per line, remove from deck and print
]
prin "^/^/remaining: " contents deck ;; Print all remaining cards in deck, 12 per line