Playing cards: Difference between revisions

Added Easylang
m (→‎more optimized: added wording to the REXX section header for 2nd version.)
(Added Easylang)
 
(63 intermediate revisions by 27 users not shown)
Line 14:
 
Each card must have a pip value and a suit value which constitute the unique value of the card.
 
<br><br>
Related tasks:
* [[Card shuffles]]
* [[Deal cards_for_FreeCell]]
* [[War Card_Game]]
* [[Poker hand_analyser]]
* [[Go Fish]]
 
 
=={{header|ACL2}}==
<langsyntaxhighlight Lisplang="lisp">(defun remove-nth (i xs)
(if (or (zp i) (endp (rest xs)))
(rest xs)
Line 69 ⟶ 76:
(defun draw-from-deck (deck)
(mv (first deck) (rest deck)))
</syntaxhighlight>
</lang>
 
Example (first 4 cards of a shuffled deck):
Line 79 ⟶ 86:
4 of DIAMONDS
(NIL <state>)</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE PTR="CARD"
DEFINE MAXDECKSIZE="52"
 
TYPE Deck=[
PTR cards ;BYTE ARRAY
BYTE first,count]
 
BYTE FUNC IsEmpty(Deck POINTER d)
IF d.count=0 THEN
RETURN (1)
FI
RETURN (0)
 
BYTE FUNC IsFull(Deck POINTER d)
IF d.count=MAXDECKSIZE THEN
RETURN (1)
FI
RETURN (0)
 
BYTE FUNC Index(Deck POINTER d BYTE i)
RETURN ((d.first+i) MOD MAXDECKSIZE)
 
PROC InitEmpty(Deck POINTER d BYTE ARRAY crds)
d.cards=crds
d.first=0
d.count=0
RETURN
 
PROC InitFull(Deck POINTER d BYTE ARRAY crds)
BYTE i
 
d.cards=crds
d.first=0
d.count=MAXDECKSIZE
FOR i=0 TO MAXDECKSIZE-1
DO
crds(i)=i
OD
RETURN
 
PROC Shuffle(Deck POINTER d)
BYTE i,j,i2,j2,tmp
BYTE ARRAY crds
 
crds=d.cards
i=d.count-1
WHILE i>0
DO
j=Rand(i)
i2=Index(d,i)
j2=Index(d,j)
tmp=crds(i2)
crds(i2)=crds(j2)
crds(j2)=tmp
i==-1
OD
RETURN
 
BYTE FUNC Deal(Deck POINTER d)
BYTE ARRAY crds
BYTE c
 
IF IsEmpty(d) THEN
PrintE("Error: deck is empty!")
Break()
FI
 
crds=d.cards
c=crds(d.first)
d.count==-1
d.first==+1
IF d.first=MAXDECKSIZE THEN
d.first=0
FI
RETURN (c)
 
PROC Add(Deck POINTER d BYTE c)
BYTE ARRAY crds
BYTE i
 
IF IsFull(d) THEN
PrintE("Error: deck is full!")
Break()
FI
 
crds=d.cards
i=Index(d,d.count)
crds(i)=c
d.count==+1
RETURN
 
PROC PrintCard(BYTE c)
BYTE s,v
BYTE ARRAY fig=['J 'Q 'K 'A]
BYTE ARRAY suit=[16 96 0 123]
 
s=c/13 v=c MOD 13
IF v<=8 THEN
PrintB(v+2)
ELSE
Put(fig(v-9))
FI
Put(suit(s))
RETURN
 
PROC PrintDeck(Deck POINTER d)
BYTE i,i2
BYTE ARRAY crds
 
crds=d.cards
IF IsEmpty(d) THEN
Print("Empty")
ELSE
FOR i=0 TO d.count-1
DO
i2=Index(d,i)
PrintCard(crds(i2))
IF i<d.count-1 THEN
Put(' )
FI
OD
FI
RETURN
 
PROC Main()
BYTE LMARGIN=$52,oldLMARGIN,i,c
BYTE ARRAY crds(MAXDECKSIZE),crds1(MAXDECKSIZE),crds2(MAXDECKSIZE)
Deck d,d1,d2
 
oldLMARGIN=LMARGIN
LMARGIN=0 ;remove left margin on the screen
Put(125) PutE() ;clear the screen
 
PrintE("New deck:")
InitFull(d,crds)
PrintDeck(d) PutE() PutE()
 
PrintE("Shuffle:")
Shuffle(d)
PrintDeck(d) PutE() PutE()
 
PrintE("Deal cards:")
InitEmpty(d1,crds1) InitEmpty(d2,crds2)
FOR i=1 TO 5
DO
c=Deal(d) Add(d1,c)
c=Deal(d) Add(d2,c)
OD
Print(" Player 1: ") PrintDeck(d1) PutE()
Print(" Player 2: ") PrintDeck(d2) PutE() PutE()
 
PrintE("Deck after dealing:")
PrintDeck(d)
 
LMARGIN=oldLMARGIN ;restore left margin on the screen
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Playing_cards.png Screenshot from Atari 8-bit computer]
<pre>
New deck:
2♣ 3♣ 4♣ 5♣ 6♣ 7♣ 8♣ 9♣ 10♣ J♣ Q♣ K♣ A♣
2♦ 3♦ 4♦ 5♦ 6♦ 7♦ 8♦ 9♦ 10♦ J♦ Q♦ K♦ A♦
2♥ 3♥ 4♥ 5♥ 6♥ 7♥ 8♥ 9♥ 10♥ J♥ Q♥ K♥ A♥
2♠ 3♠ 4♠ 5♠ 6♠ 7♠ 8♠ 9♠ 10♠ J♠ Q♠ K♠ A♠
 
Shuffle:
5♥ K♦ 2♣ 3♠ 4♣ 5♣ 9♦ J♣ 10♠ K♣ K♠ 8♦ 5♦
3♦ 4♠ 4♥ 10♦ 8♥ 3♣ A♦ 7♣ 10♥ Q♣ 6♦ 2♦ 3♥
4♦ 7♥ 7♦ J♥ 9♣ A♥ 2♠ 10♣ J♠ Q♥ 2♥ A♣ Q♦
8♣ 9♥ 9♠ 6♥ K♥ Q♠ 6♣ 5♠ A♠ 8♠ J♦ 6♠ 7♠
 
Deal cards:
Player 1: 5♥ 2♣ 4♣ 9♦ 10♠
Player 2: K♦ 3♠ 5♣ J♣ K♣
 
Deck after dealing:
K♠ 8♦ 5♦ 3♦ 4♠ 4♥ 10♦ 8♥ 3♣ A♦ 7♣ 10♥ Q♣
6♦ 2♦ 3♥ 4♦ 7♥ 7♦ J♥ 9♣ A♥ 2♠ 10♣ J♠ Q♥
2♥ A♣ Q♦ 8♣ 9♥ 9♠ 6♥ K♥ Q♠ 6♣ 5♠ A♠ 8♠
J♦ 6♠ 7♠
</pre>
 
=={{header|Ada}}==
Line 94 ⟶ 284:
* [http://www.csail.mit.edu/timeline/timeline.php?query=event&id=93 LOC was essential; Algol 68's REF was a mistake.]
 
<langsyntaxhighlight lang="algol68">MODE CARD = STRUCT(STRING pip, suit); # instance attributes #
 
# class members & attributes #
Line 168 ⟶ 358:
(init OF class deck)(deck);
(shuffle OF class deck)(deck);
print (((repr OF class deck)(deck), new line))</langsyntaxhighlight>
 
{{Out|Example output}}
<pre>((King OF Clubs), (6 OF Hearts), (7 OF Diamonds), (Ace OF Hearts), (9 OF Spades), (10 OF Clubs), (Ace OF Spades), (8 OF Clubs), (4 OF Spades), (8 OF Hearts), (Jack OF Hearts), (3 OF Clubs), (7 OF Hearts), (10 OF Hearts), (Jack OF Clubs), (Ace OF Clubs), (King OF Spades), (9 OF Clubs), (7 OF Spades), (5 OF Spades), (7 OF Clubs), (Queen OF Clubs), (9 OF Diamonds), (2 OF Spades), (6 OF Diamonds), (Ace OF Diamonds), (Queen OF Diamonds), (5 OF Hearts), (4 OF Clubs), (5 OF Clubs), (4 OF Hearts), (3 OF Diamonds), (4 OF Diamonds), (3 OF Hearts), (King OF Diamonds), (2 OF Clubs), (Jack OF Spades), (2 OF Diamonds), (5 OF Diamonds), (Queen OF Spades), (10 OF Diamonds), (King OF Hearts), (Jack OF Diamonds), (Queen OF Hearts), (8 OF Spades), (2 OF Hearts), (8 OF Diamonds), (10 OF Spades), (9 OF Hearts), (6 OF Clubs), (3 OF Spades), (6 OF Spades))</pre>
 
=={{header|APL}}==
 
<syntaxhighlight lang="apl">
deck←,'23456789TJQKA'∘.,'CDSH'
shuffle←{⍵[?⍨⍴⍵]}
</syntaxhighlight>
 
{{out}}
<pre>
deck
2C 2D 2S 2H 3C 3D 3S 3H 4C ..
shuffle deck
7H 3D 2H 9D KS 7C JH TC JS ..
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="arturo">ranks: 1..13
suits: [`♣`, `♦`, `♥`, `♠`]
 
define :card [rank, suit][
init: [
ensure ->
and? -> contains? ranks this\rank
-> contains? suits this\suit
]
 
print: [
R: ø
case [this\rank=]
when? [1] -> R: `A`
when? [11]-> R: `J`
when? [12]-> R: `Q`
when? [13]-> R: `K`
else -> R: this\rank
~{|R||this\suit|}
]
]
 
define :deck [][
init: [
this\cards: []
loop ranks 'rank ->
loop suits 'suit ->
this\cards: this\cards ++ to :card @[rank, suit]
]
]
 
shuffleUp: function [this :deck][
this\cards: shuffle this\cards
]
 
deal: function [this :deck, cnt :integer][
if cnt > size this\cards ->
panic "Not enough cards in deck"
 
cards: []
do.times: cnt [
dealt: sample this\cards
'cards ++ dealt
this\cards: remove this\cards dealt
]
return cards
]
 
; create a new deck
Deck: to :deck []
 
; and shuffle it
shuffleUp Deck
 
; deal 5 cards
print deal Deck 5</syntaxhighlight>
 
{{out}}
 
<pre>A♥ 6♣ 7♣ Q♦ K♥</pre>
 
=={{header|ATS}}==
<syntaxhighlight lang="ats">
<lang ATS>
(* ****** ****** *)
//
Line 616 ⟶ 883:
 
(* ****** ****** *)
</syntaxhighlight>
</lang>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">suits := ["♠", "♦", "♥", "♣"]
values := [2,3,4,5,6,7,8,9,10,"J","Q","K","A"]
Gui, font, s14
Line 702 ⟶ 969:
GuiControl,, Deck, % deck
return
;-----------------------------------------------</langsyntaxhighlight>
 
=={{header|AutoIt}}==
<syntaxhighlight lang="autoit">
<lang AutoIt>
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
Line 757 ⟶ 1,024:
Print()
#EndRegion ;#### USAGE ####
</syntaxhighlight>
</lang>
{{Out|Example output}}
<pre>
Line 765 ⟶ 1,032:
2C|4D|6H|AC|KC|6S|3C|AS|KS|3H|4S|10D|AD|8D|7C|QH|4C|5H|5S|3D|2D|7D|9C|2S|QD|6C|KH|7S|3S|7H|8H|JH|QC|JC|10H|JD|KD|5D|5C|9H|8S|9D|QS|8C|10C|2H|6D|10S|9S|JS|AH
</pre>
 
=={{header|BASIC}}==
==={{header|QuickBASIC}}===
{{works with|QuickBASIC|QBX 7.1}}
 
Most BASICs aren't object-oriented (or anything even resembling such) and can't do a deck of cards as a single cohesive unit -- but we can fake it.
 
<syntaxhighlight lang="qbasic">DECLARE SUB setInitialValues (deck() AS STRING * 2)
DECLARE SUB shuffle (deck() AS STRING * 2)
DECLARE SUB showDeck (deck() AS STRING * 2)
DECLARE FUNCTION deal$ (deck() AS STRING * 2)
 
DATA "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "TS", "JS", "QS", "KS"
DATA "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "TH", "JH", "QH", "KH"
DATA "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "TC", "JC", "QC", "KC"
DATA "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "TD", "JD", "QD", "KD"
 
RANDOMIZE TIMER
 
REDIM cards(51) AS STRING * 2
REDIM cards2(51) AS STRING * 2
 
setInitialValues cards()
setInitialValues cards2()
shuffle cards()
PRINT "Dealt: "; deal$(cards())
PRINT "Dealt: "; deal$(cards())
PRINT "Dealt: "; deal$(cards())
PRINT "Dealt: "; deal$(cards())
showDeck cards()
showDeck cards2()
 
FUNCTION deal$ (deck() AS STRING * 2)
'technically dealing from the BOTTOM of the deck... whatever
DIM c AS STRING * 2
c = deck(UBOUND(deck))
REDIM PRESERVE deck(LBOUND(deck) TO UBOUND(deck) - 1) AS STRING * 2
deal$ = c
END FUNCTION
 
SUB setInitialValues (deck() AS STRING * 2)
DIM L0 AS INTEGER
 
RESTORE
FOR L0 = 0 TO 51
READ deck(L0)
NEXT
END SUB
 
SUB showDeck (deck() AS STRING * 2)
FOR L% = LBOUND(deck) TO UBOUND(deck)
PRINT deck(L%); " ";
NEXT
PRINT
END SUB
 
SUB shuffle (deck() AS STRING * 2)
DIM w AS INTEGER
DIM shuffled(51) AS STRING * 2
DIM L0 AS INTEGER
 
FOR L0 = 51 TO 0 STEP -1
w = INT(RND * (L0 + 1))
shuffled(L0) = deck(w)
IF w <> L0 THEN deck(w) = deck(L0)
NEXT
 
FOR L0 = 0 TO 51
deck(L0) = shuffled(L0)
NEXT
END SUB</syntaxhighlight>
 
{{out}}
Sample output:
<pre>
Dealt: 7D
Dealt: 6D
Dealt: KD
Dealt: 8S
5D QH JC JH KC 3S QD 4D 9H 2C JD KH 7H 4H AD 7S 3D 2H 3H 5C 4S AS TD 7C QS 9S 9D
KS 8H 4C 6H 5H 5S 8D TC AH TS 9C 3C 8C TH 2D QC 6C AC 2S JS 6S
AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC
2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD
</pre>
 
=={{header|BASIC256}}==
{{trans|Run BASIC}}
<syntaxhighlight lang="vb">suite$ = "CDHS" #Club, Diamond, Heart, Spade
card$ = "A23456789TJQK" #Cards Ace to King
card = 0
 
dim n(55) #make ordered deck
for i = 1 to 52 # of 52 cards
n[i] = i
next i
 
for i = 1 to 52 * 3 #shuffle deck 3 times
i1 = int(rand * 52) + 1
i2 = int(rand * 52) + 1
h2 = n[i1]
n[i1] = n[i2]
n[i2] = h2
next i
 
for hand = 1 to 4 #4 hands
for deal = 1 to 13 #deal each 13 cards
card += 1 #next card in deck
s = (n[card] mod 4) + 1 #determine suite
c = (n[card] mod 13) + 1 #determine card
print mid(card$,c,1);mid(suite$,s,1);" "; #show the card
next deal
print
next hand
end
 
function word$(sr$, wn, delim$)
j = wn
if j = 0 then j += 1
res$ = "" : s$ = sr$ : d$ = delim$
if d$ = "" then d$ = " "
sd = length(d$) : sl = length(s$)
while true
n = instr(s$,d$) : j -= 1
if j = 0 then
if n=0 then res$=s$ else res$=mid(s$,1,n-1)
return res$
end if
if n = 0 then return res$
if n = sl - sd then res$ = "" : return res$
sl2 = sl-n : s$ = mid(s$,n+1,sl2) : sl = sl2
end while
return res$
end function</syntaxhighlight>
{{out}}
<pre>Same as Run BASIC entry.</pre>
 
=={{header|Batch File}}==
The data structure is a simple string with 3 characters per card, one char for the suit, a char for the pip (T) means ten and a last char not printed that would allow to sort a hand.
<syntaxhighlight lang="dos">@echo off
<lang Batch File>
@echo off
setlocal enabledelayedexpansion
 
Line 867 ⟶ 1,268:
set arr=!arr:@@@=%temp2%!
set "%~1=!arr!"
exit /b</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 905 ⟶ 1,305:
♥4 ♠4 ♣4 ♥J ♣A ♣9
</pre>
 
=={{header|BASIC}}==
{{works with|QuickBASIC|QBX 7.1}}
 
Most BASICs aren't object-oriented (or anything even resembling such) and can't do a deck of cards as a single cohesive unit -- but we can fake it.
 
<lang qbasic>DECLARE SUB setInitialValues (deck() AS STRING * 2)
DECLARE SUB shuffle (deck() AS STRING * 2)
DECLARE SUB showDeck (deck() AS STRING * 2)
DECLARE FUNCTION deal$ (deck() AS STRING * 2)
 
DATA "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "TS", "JS", "QS", "KS"
DATA "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "TH", "JH", "QH", "KH"
DATA "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "TC", "JC", "QC", "KC"
DATA "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "TD", "JD", "QD", "KD"
 
RANDOMIZE TIMER
 
REDIM cards(51) AS STRING * 2
REDIM cards2(51) AS STRING * 2
 
setInitialValues cards()
setInitialValues cards2()
shuffle cards()
PRINT "Dealt: "; deal$(cards())
PRINT "Dealt: "; deal$(cards())
PRINT "Dealt: "; deal$(cards())
PRINT "Dealt: "; deal$(cards())
showDeck cards()
showDeck cards2()
 
FUNCTION deal$ (deck() AS STRING * 2)
'technically dealing from the BOTTOM of the deck... whatever
DIM c AS STRING * 2
c = deck(UBOUND(deck))
REDIM PRESERVE deck(LBOUND(deck) TO UBOUND(deck) - 1) AS STRING * 2
deal$ = c
END FUNCTION
 
SUB setInitialValues (deck() AS STRING * 2)
DIM L0 AS INTEGER
 
RESTORE
FOR L0 = 0 TO 51
READ deck(L0)
NEXT
END SUB
 
SUB showDeck (deck() AS STRING * 2)
FOR L% = LBOUND(deck) TO UBOUND(deck)
PRINT deck(L%); " ";
NEXT
PRINT
END SUB
 
SUB shuffle (deck() AS STRING * 2)
DIM w AS INTEGER
DIM shuffled(51) AS STRING * 2
DIM L0 AS INTEGER
 
FOR L0 = 51 TO 0 STEP -1
w = INT(RND * (L0 + 1))
shuffled(L0) = deck(w)
IF w <> L0 THEN deck(w) = deck(L0)
NEXT
 
FOR L0 = 0 TO 51
deck(L0) = shuffled(L0)
NEXT
END SUB</lang>
 
Sample output:
Dealt: 7D
Dealt: 6D
Dealt: KD
Dealt: 8S
5D QH JC JH KC 3S QD 4D 9H 2C JD KH 7H 4H AD 7S 3D 2H 3H 5C 4S AS TD 7C QS 9S 9D
KS 8H 4C 6H 5H 5S 8D TC AH TS 9C 3C 8C TH 2D QC 6C AC 2S JS 6S
AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC
2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> DIM Deck{ncards%, card&(51)}, Suit$(3), Rank$(12)
Suit$() = "Clubs", "Diamonds", "Hearts", "Spades"
Rank$() = "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", \
Line 1,034 ⟶ 1,354:
REM Return the name of a card:
DEF FNcardname(card&)
= Rank$(card& >> 2) + " of " + Suit$(card& AND 3)</langsyntaxhighlight>
Output:
<pre>Creating a new deck...
Line 1,054 ⟶ 1,374:
 
=={{header|C}}==
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
Line 1,147 ⟶ 1,467:
//free(d);
return 0;
}</langsyntaxhighlight>output
<pre>
New deck, 52 cards: ♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♥A ♥2 ...
Line 1,158 ⟶ 1,478:
</pre>
See also [[Playing Cards/C]]
 
=={{header|C sharp|C#}}==
 
<syntaxhighlight lang="csharp">using System;
using System.Linq;
using System.Collections.Generic;
 
public struct Card
{
public Card(string rank, string suit) : this()
{
Rank = rank;
Suit = suit;
}
 
public string Rank { get; }
public string Suit { get; }
 
public override string ToString() => $"{Rank} of {Suit}";
}
 
public class Deck : IEnumerable<Card>
{
static readonly string[] ranks = { "Two", "Three", "Four", "Five", "Six",
"Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace" };
static readonly string[] suits = { "Clubs", "Diamonds", "Hearts", "Spades" };
readonly List<Card> cards;
public Deck() {
cards = (from suit in suits
from rank in ranks
select new Card(rank, suit)).ToList();
}
 
public int Count => cards.Count;
 
public void Shuffle() {
// using Knuth Shuffle (see at http://rosettacode.org/wiki/Knuth_shuffle)
var random = new Random();
for (int i = 0; i < cards.Count; i++) {
int r = random.Next(i, cards.Count);
var temp = cards[i];
cards[i] = cards[r];
cards[r] = temp;
}
}
 
public Card Deal() {
int last = cards.Count - 1;
Card card = cards[last];
//Removing from the front will shift the other items back 1 spot,
//so that would be an O(n) operation. Removing from the back is O(1).
cards.RemoveAt(last);
return card;
}
 
public IEnumerator<Card> GetEnumerator() {
//Reverse enumeration of the list so that they are returned in the order they would be dealt.
//LINQ's Reverse() copies the entire list. Let's avoid that.
for (int i = cards.Count - 1; i >= 0; i--)
yield return cards[i];
}
 
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator();
}</syntaxhighlight>
 
=={{header|C++}}==
=== Text version ===
<lang cpp>#include <deque>
<syntaxhighlight lang="cpp">#include <deque>
#include <algorithm>
#include <ostream>
Line 1,235 ⟶ 1,621:
return os;
}
}</syntaxhighlight>
}
</lang>
 
main.cpp:
=={{header|C sharp|C#}}==
<syntaxhighlight lang="cpp">#include <iostream>
 
int main(int argc, const char** args) {
<lang csharp>using System;
cards::deck d;
using System.Linq;
d.shuffle();
using System.Collections.Generic;
std::cout << d;
 
return 0;
public struct Card
}</syntaxhighlight>
{
public Card(string rank, string suit) : this()
{
Rank = rank;
Suit = suit;
}
 
=== Unicode version ===
public string Rank { get; }
{{Works with|Unicode|6 and above}}
public string Suit { get; }
<syntaxhighlight lang="cpp">#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
 
const std::vector<std::string> cards = { "🂡", "🂱", "🃁", "🃑",
public override string ToString() => $"{Rank} of {Suit}";
"🂢", "🂲", "🃂", "🃒",
}
"🂣", "🂳", "🃃", "🃓",
"🂤", "🂴", "🃄", "🃔",
"🂥", "🂵", "🃅", "🃕",
"🂦", "🂶", "🃆", "🃖",
"🂧", "🂷", "🃇", "🃗",
"🂨", "🂸", "🂸", "🂸",
"🂩", "🂩", "🃉", "🃙",
"🂪", "🂺", "🃊", "🃚",
"🂫", "🂻", "🃋", "🃛",
"🂭", "🂽", "🃍", "🃝",
"🂮", "🂾", "🃎", "🃞"
};
 
int main(int argc, const char* args[]) {
public class Deck : IEnumerable<Card>
auto deck(cards);
{
std::random_shuffle(deck.begin(), deck.end());
static readonly string[] ranks = { "Two", "Three", "Four", "Five", "Six",
uint i = 1;
"Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace" };
for (auto &card: deck) {
static readonly string[] suits = { "Clubs", "Diamonds", "Hearts", "Spades" };
std::cout << card;
readonly List<Card> cards;
if (i++ % 13 == 0)
std::cout << std::endl;
public Deck() {
cards = (from suit in suits
from rank in ranks
select new Card(rank, suit)).ToList();
}
 
return 0;
public int Count => cards.Count;
}</syntaxhighlight>
 
{{out}}
public void Shuffle() {
<pre>🂢🃞🃓🃔🂧🃙🂵🂪🃇🃎🂩🃚🃕
// using Knuth Shuffle (see at http://rosettacode.org/wiki/Knuth_shuffle)
🃁🃝🂾🂷🃅🂩🂫🂲🂶🃒🂤🃄🃋
var random = new Random();
🃗🃂🂽🂭🂸🃊🂴🂺🃑🂥🂸🃛🂳
for (int i = 0; i < cards.Count; i++) {
🃆🂣🃖🂦🃉🂱🃃🂸🂡🃍🂻🂮🂨</pre>
int r = random.Next(i, cards.Count);
var temp = cards[i];
cards[i] = cards[r];
cards[r] = temp;
}
}
 
public Card Deal() {
int last = cards.Count - 1;
Card card = cards[last];
//Removing from the front will shift the other items back 1 spot,
//so that would be an O(n) operation. Removing from the back is O(1).
cards.RemoveAt(last);
return card;
}
 
public IEnumerator<Card> GetEnumerator() {
//Reverse enumeration of the list so that they are returned in the order they would be dealt.
//LINQ's Reverse() copies the entire list. Let's avoid that.
for (int i = cards.Count - 1; i >= 0; i--)
yield return cards[i];
}
 
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator();
}</lang>
 
=={{Headerheader|Ceylon}}==
<langsyntaxhighlight lang="ceylon">import com.vasileff.ceylon.random.api { ... }
 
"""Run the example code for Rosetta Code ["Playing cards" task] (http://rosettacode.org/wiki/Playing_cards)."""
Line 1,384 ⟶ 1,755:
}
}
}</langsyntaxhighlight>
 
Output:
Line 1,409 ⟶ 1,780:
8 of ♠, 10 of ♥, 3 of ♠, 10 of ♣, 9 of ♥, 10 of ♠, 3 of ♣, J of ♠, K of ♣, K of ♦, A of ♠</pre>
 
=={{Headerheader|Clojure}}==
<langsyntaxhighlight Clojurelang="clojure">(def suits [:club :diamond :heart :spade])
(def pips [:ace 2 3 4 5 6 7 8 9 10 :jack :queen :king])
 
Line 1,421 ⟶ 1,792:
(println (format "%s of %ss"
(if (keyword? pip) (name pip) pip)
(name suit)))))</langsyntaxhighlight>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">% Represents one playing card.
card = cluster is make, parse, unparse, equal, all_cards
rep = struct[pip: int, suit: char]
own suits: string := "CHSD";
own pips: sequence[string] := sequence[string]$
["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
find_pip = proc (pip: string) returns (int) signals (bad_format)
for i: int in int$from_to(1, sequence[string]$size(pips)) do
if pips[i] = pip then return(i) end
end
signal bad_format
end find_pip
make = proc (pip: int, suit: char) returns (cvt) signals (bad_format)
if string$indexc(suit, suits) = 0
cor ~(pip >= 1 cand pip <= 13)
then signal bad_format
end
return(rep${pip: pip, suit: suit})
end make
parse = proc (s: string) returns (cvt) signals (bad_format)
size: int := string$size(s)
if size<2 cor size>3 then signal bad_format end
pip: string := string$substr(s, 1, size-1)
suit: char := string$rest(s, size-1)[1]
return(down(make(find_pip(pip), suit))) resignal bad_format
end parse
unparse = proc (c: cvt) returns (string)
return( pips[c.pip] || string$c2s(c.suit) )
end unparse
equal = proc (a, b: cvt) returns (bool)
return( a.pip = b.pip cand a.suit = b.suit )
end equal
% Yield all cards in the canonical order
all_cards = iter () yields (cvt)
for suit: char in string$chars(suits) do
for pip: int in int$from_to(1,sequence[string]$size(pips)) do
yield(down(make(pip, suit)))
end
end
end all_cards
end card
 
% Represents a deck
deck = cluster is new, shuffle, cards, deal, unparse
rep = array[card]
new = proc () returns (cvt)
d: rep := rep$new()
for c: card in card$all_cards() do rep$addh(d, c) end
return(d)
end new
shuffle = proc (d: cvt)
lo: int := rep$low(d)
hi: int := rep$high(d)
for i: int in int$from_to_by(hi, lo+1, -1) do
j: int := lo + random$next(i-lo)
c: card := d[i]
d[i] := d[j]
d[j] := c
end
end shuffle
cards = iter (d: cvt) yields (card)
for c: card in rep$elements(d) do yield(c) end
end cards
deal = proc (d: cvt) returns (card) signals (empty)
if rep$empty(d) then signal empty end
return(rep$reml(d))
end deal
unparse = proc (d: cvt) returns (string)
ss: stream := stream$create_output()
n: int := 0
for c: card in cards(up(d)) do
if n~=0 cand n//13=0 then stream$putc(ss, '\n')
elseif n~=0 then stream$putc(ss, ' ')
end
stream$puts(ss, card$unparse(c))
n := n+1
end
return(stream$get_contents(ss))
end unparse
end deck
 
start_up = proc ()
po: stream := stream$primary_output()
% seed the RNG
d_: date := now()
random$seed(d_.second + 60*(d_.minute + 60*d_.hour))
% make a new deck
d: deck := deck$new()
stream$putl(po, "New deck: ")
stream$putl(po, deck$unparse(d))
% shuffle the deck
deck$shuffle(d)
stream$putl(po, "\nShuffled deck: ")
stream$putl(po, deck$unparse(d))
% deal some cards
stream$puts(po, "\nDealing 10 cards:")
for i: int in int$from_to(1, 10) do
stream$puts(po, " " || card$unparse(deck$deal(d)))
end
% show remaining deck
stream$putl(po, "\n\nRemaining cards in deck:")
stream$putl(po, deck$unparse(d))
end start_up</syntaxhighlight>
{{out}}
<pre>New deck:
AC 2C 3C 4C 5C 6C 7C 8C 9C 10C JC QC KC
AH 2H 3H 4H 5H 6H 7H 8H 9H 10H JH QH KH
AS 2S 3S 4S 5S 6S 7S 8S 9S 10S JS QS KS
AD 2D 3D 4D 5D 6D 7D 8D 9D 10D JD QD KD
 
Shuffled deck:
QS 5D 5C 3H 8D 8C 2D 4H 3S QH 8H JS 9H
9C AH 4S 7S 8S 9S 2H AD QC 9D 5S 7C 10S
5H 4C KC 6S 4D 3C KS 6C JC 2C QD 7H AC
AS 10H 6H 3D KD 10D JD 7D JH KH 6D 2S 10C
 
Dealing 10 cards: QS 5D 5C 3H 8D 8C 2D 4H 3S QH
 
Remaining cards in deck:
8H JS 9H 9C AH 4S 7S 8S 9S 2H AD QC 9D
5S 7C 10S 5H 4C KC 6S 4D 3C KS 6C JC 2C
QD 7H AC AS 10H 6H 3D KD 10D JD 7D JH KH
6D 2S 10C</pre>
 
=={{header|COBOL}}==
{{works with|GnuCOBOL}}
<langsyntaxhighlight COBOLlang="cobol"> identification division.
program-id. playing-cards.
 
Line 1,602 ⟶ 2,113:
 
end program playing-cards.
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,656 ⟶ 2,167:
queen of hearts</pre>
 
GnuCOBOL pseudo-random number sequences are reproducible. A command line argument can be used to pass an initial seed value.
 
=={{Headerheader|CoffeeScript}}==
 
<langsyntaxhighlight lang="coffeescript">#translated from JavaScript example
class Card
constructor: (@pip, @suit) ->
Line 1,684 ⟶ 2,195:
@cards[i] = @cards.splice(randomCard, 1, card)[0]
deal: -> @cards.shift()</langsyntaxhighlight>
 
=={{header|Common Lisp}}==
Line 1,690 ⟶ 2,201:
A card is a cons of a suit and a pip. A deck is a list of cards, and so dealing is simply popping off of a deck. Shuffling is naïve, just a sort with a random predicate. Printing is built in.
 
<langsyntaxhighlight lang="lisp">(defconstant +suits+
'(club diamond heart spade)
"Card suits are the symbols club, diamond, heart, and spade.")
Line 1,711 ⟶ 2,222:
(sort list #'(lambda (x y)
(declare (ignore x y))
(zerop (random 2)))))</langsyntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.typecons, std.algorithm, std.traits, std.array,
std.range, std.random;
 
Line 1,744 ⟶ 2,254:
while (!d.empty)
d.dealCard.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>Deck:
Line 1,854 ⟶ 2,364:
 
===More Refined Version===
<langsyntaxhighlight lang="d">import std.stdio, std.random, std.algorithm, std.string, std.range;
 
struct Card {
Line 1,964 ⟶ 2,474:
g.sortDeck.showDeck;
}
}</langsyntaxhighlight>
{{out}}
<pre>Host
Line 2,002 ⟶ 2,512:
 
=={{header|Delphi}}==
<langsyntaxhighlight lang="delphi">program Cards;
 
{$APPTYPE CONSOLE}
Line 2,126 ⟶ 2,636:
 
Readln;
end.</langsyntaxhighlight>
 
=={{header|E}}==
See [[Playing Cards/E]]
 
=={{header|EasyLang}}==
<syntaxhighlight>
global deck[] top .
proc new . .
deck[] = [ ]
for i to 52
deck[] &= i
.
top = 52
.
suit$[] = [ "♠" "♦" "♥" "♣" ]
val$[] = [ 2 3 4 5 6 7 8 9 10 "J" "Q" "K" "A" ]
func$ name card .
return suit$[card mod1 4] & val$[card div1 4]
.
proc show . .
for i to top
write name deck[i] & " "
.
print ""
print ""
.
proc shuffle . .
for i = 52 downto 2
r = randint i
swap deck[i] deck[r]
.
top = 52
.
func deal .
top -= 1
return deck[top + 1]
.
new
show
shuffle
show
for i to 10
write name deal & " "
.
print ""
print ""
show
</syntaxhighlight>
 
{{out}}
<pre>
♠2 ♦2 ♥2 ♣2 ♠3 ♦3 ♥3 ♣3 ♠4 ♦4 ♥4 ♣4 ♠5 ♦5 ♥5 ♣5 ♠6 ♦6 ♥6 ♣6 ♠7 ♦7 ♥7 ♣7 ♠8 ♦8 ♥8 ♣8 ♠9 ♦9 ♥9 ♣9 ♠10 ♦10 ♥10 ♣10 ♠J ♦J ♥J ♣J ♠Q ♦Q ♥Q ♣Q ♠K ♦K ♥K ♣K ♠A ♦A ♥A ♣A
 
♦2 ♣2 ♦6 ♠10 ♦5 ♥3 ♣4 ♦7 ♣9 ♥2 ♣7 ♣K ♦K ♠Q ♠2 ♦Q ♥7 ♥8 ♣8 ♥A ♠3 ♥10 ♥Q ♣10 ♠K ♠5 ♦8 ♠9 ♠4 ♣5 ♣J ♥5 ♠J ♠7 ♦4 ♦3 ♦10 ♥6 ♣Q ♥4 ♠6 ♣3 ♥K ♦J ♠A ♠8 ♥J ♥9 ♣A ♦9 ♣6 ♦A
 
♦A ♣6 ♦9 ♣A ♥9 ♥J ♠8 ♠A ♦J ♥K
 
♦2 ♣2 ♦6 ♠10 ♦5 ♥3 ♣4 ♦7 ♣9 ♥2 ♣7 ♣K ♦K ♠Q ♠2 ♦Q ♥7 ♥8 ♣8 ♥A ♠3 ♥10 ♥Q ♣10 ♠K ♠5 ♦8 ♠9 ♠4 ♣5 ♣J ♥5 ♠J ♠7 ♦4 ♦3 ♦10 ♥6 ♣Q ♥4 ♠6 ♣3
</pre>
 
=={{header|Elixir}}==
{{trans|Erlang}}
<langsyntaxhighlight lang="elixir">defmodule Card do
defstruct pip: nil, suit: nil
end
Line 2,173 ⟶ 2,739:
end
 
Playing_cards.task</langsyntaxhighlight>
 
{{out}}
Line 2,187 ⟶ 2,753:
 
This module is used by [[Go_Fish]].
<syntaxhighlight lang="erlang">
<lang Erlang>
-module( playing_cards ).
 
Line 2,226 ⟶ 2,792:
 
suites() -> ["Clubs", "Hearts", "Spades", "Diamonds"].
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,240 ⟶ 2,806:
Since our data structure is both a sequence and a stack, we can leverage the existing <code>randomize</code> word for shuffling and <code>pop</code> word for dealing.
 
<langsyntaxhighlight lang="factor">USING: formatting grouping io kernel math qw random sequences
vectors ;
IN: rosetta-code.playing-cards
Line 2,258 ⟶ 2,824:
randomize ! shuffle the deck
dup pop drop ! deal from the deck (and discard)
print-deck ! print the deck</langsyntaxhighlight>
{{out}}
<pre>
Line 2,268 ⟶ 2,834:
 
=={{header|Fantom}}==
<langsyntaxhighlight lang="fantom">
enum class Suit { clubs, diamonds, hearts, spades }
enum class Pips { ace, two, three, four, five,
Line 2,335 ⟶ 2,901:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Forth}}==
{{works with|GNU Forth}}
<langsyntaxhighlight lang="forth">require random.fs \ RANDOM ( n -- 0..n-1 ) is called CHOOSE in other Forths
 
create pips s" A23456789TJQK" mem,
Line 2,370 ⟶ 2,936:
new-deck shuffle .deck
5 .hand
cards-left . \ 47</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">MODULE Cards
 
IMPLICIT NONE
Line 2,439 ⟶ 3,005:
END SUBROUTINE Print_deck
 
END MODULE Cards</langsyntaxhighlight>
Example use:
<langsyntaxhighlight lang="fortran">PROGRAM Playing_Cards
USE Cards
Line 2,451 ⟶ 3,017:
CALL Print_deck
END PROGRAM</langsyntaxhighlight>
This creates a new deck, shuffles it, deals five cards to hand, prints the cards in hand and then prints the cards remaining in the deck.
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">#define NSWAPS 100
 
type card
suit : 2 as ubyte
face : 4 as ubyte
'the remaining 2 bits are unused
end type
 
dim shared as string*8 Suits(0 to 3) = {"Spades", "Clubs", "Hearts", "Diamonds"}
dim shared as string*8 Faces(0 to 12) = {"Ace", "Two", "Three", "Four", "Five",_
"Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"}
 
sub newdeck( deck() as card )
'produces an unshuffled deck of 52 cards
redim preserve deck(0 to 51) as card
for s as ubyte = 0 to 3
for f as ubyte = 0 to 12
deck(13*s + f).suit = s
deck(13*s + f).face = f
next f
next s
end sub
 
function deal( deck() as card ) as card
'deals one card from the top of the deck, returning that
'card and removing it from the deck
dim as card dealt = deck(ubound(deck))
redim preserve deck(0 to ubound(deck) - 1)
return dealt
end function
 
function card_name( c as card ) as string
'returns the name of a single given card
return Faces(c.face) + " of " + Suits(c.suit)
end function
 
sub print_deck( deck() as card )
'displays the contents of the deck,
'with the top card (next to be dealt) first
for i as byte = ubound(deck) to 0 step -1
print card_name( deck(i) )
next i
end sub
 
sub shuffle_deck( deck() as card )
dim as integer n = ubound(deck)+1
for i as integer = 1 to NSWAPS
swap deck( int(rnd*n) ), deck( int(rnd*n) )
next i
end sub
redim as card deck(0 to 0) 'allocate a new deck
newdeck(deck()) 'set up the new deck
print "Dealing a card: ", card_name( deal( deck() ) )
for j as integer = 1 to 41 'deal another 41 cards and discard them
deal(deck())
next j
shuffle_deck(deck()) 'shuffle the remaining cards
print_deck(deck()) 'display the last ten cards</syntaxhighlight>
{{out}}<pre>Dealing a card: King of Diamonds
Ace of Spades
Eight of Spades
Nine of Spades
Two of Spades
Ten of Spades
Six of Spades
Five of Spades
Three of Spades
Four of Spades
Seven of Spades</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package cards
 
import (
Line 2,628 ⟶ 3,266:
}
return hands, true
}</langsyntaxhighlight>
Example use:
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,674 ⟶ 3,312:
fmt.Println("\nReturning the cards to the deck")
fmt.Println(d)
}</langsyntaxhighlight>
Output:
<pre>
Line 2,719 ⟶ 3,357:
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">import groovy.transform.TupleConstructor
 
enum Pip {
Line 2,755 ⟶ 3,393:
 
String toString() { cards.isEmpty() ? "Empty Deck" : "Deck $cards" }
}</langsyntaxhighlight>
Test Code
<langsyntaxhighlight lang="groovy">Deck deck = new Deck()
deck.shuffle()
(0..<5).each { println deck.deal() }</langsyntaxhighlight>
Output:
<pre>TWO of DIAMONDS
Line 2,770 ⟶ 3,408:
 
Straightforward implementation with explicit names for pips and suits. A deck is just a list of cards. Dealing consists of splitting off cards from the beginning of the list by the usual pattern matching (not shown). Printing is automatic. Purely functional shuffling is a bit tricky, so here we just do the naive quadratic version. This also works for other than full decks.
<langsyntaxhighlight lang="haskell">import System.Random
 
data Pip = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten |
Line 2,796 ⟶ 3,434:
shuffle' g [] _ ys = ys
shuffle' g (x:xs) n ys = shuffle' g' xs (n+1) (insertAt k x ys) where
(k,g') = randomR (0,n) g</langsyntaxhighlight>
 
=={{header|Hy}}==
Line 2,803 ⟶ 3,441:
A simple program that deals out two five card hands.
 
<langsyntaxhighlight Hylang="hy">(import [random [shuffle]])
(setv pips (.split "2 3 4 5 6 7 8 9 10 J Q K A"))
(setv suits (.split "♥ ♦ ♣ ♠"))
Line 2,831 ⟶ 3,469:
(print "\nThe first hand delt was:" (.join " " (map str first_hand)))
(print "\nThe second hand delt was:" (.join " " (map str second_hand)))
(print "\nThe remaining cards in the deck are...\n" (.join " " (map str deck)))))</langsyntaxhighlight>
 
Sample Output:
Line 2,841 ⟶ 3,479:
The remaining cards in the deck are...
3♦ 6♥ 10♠ Q♦ 7♥ 2♠ 5♥ K♥ A♦ A♥ J♥ 4♣ 3♥ A♣ 8♦ 5♦ 10♥ 7♠ A♠ J♠ 5♣ 2♥ 9♥ 4♦ 8♠ 9♦ 6♠ 7♣ 10♣ 2♣ Q♥ Q♠ 9♠ 7♦ 8♥ Q♣ 3♠ 6♦ K♣ 4♠ K♦ J♦
 
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main(arglist)
 
cards := 2 # cards per hand
Line 2,896 ⟶ 3,533:
procedure card2string(x) #: return a string version of a card
return x.pip || x.suit
end</langsyntaxhighlight>
Sample output:
<pre>New deck : 2H 3H 4H 5H 6H 7H 8H 9H 10H JH QH KH AH 2S 3S 4S 5S 6S 7S 8S 9S 10S JS QS KS AS 2D 3D 4D 5D 6D 7D 8D 9D 10D JD QD KD AD 2C 3C 4C 5C 6C 7C 8C 9C 10C JC QC KC AC
Line 2,909 ⟶ 3,546:
=={{header|J}}==
'''Solution:'''<br>
<langsyntaxhighlight lang="j">NB. playingcards.ijs
NB. Defines a Rosetta Code playing cards class
NB. Multiple decks may be used, one for each instance of this class.
Line 2,950 ⟶ 3,587:
)
 
newDeck_z_=: conew&'rcpc'</langsyntaxhighlight>
 
'''Example use:'''
<langsyntaxhighlight lang="j"> load '~user/playingcards.ijs'
coinsert 'rcpc' NB. insert rcpc class in the path of current locale
pc=: newDeck ''
Line 2,975 ⟶ 3,612:
42 2
destroy__pc ''
1</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|1.5+}}
 
<langsyntaxhighlight lang="java">public enum Pip { Two, Three, Four, Five, Six, Seven,
Eight, Nine, Ten, Jack, Queen, King, Ace }</langsyntaxhighlight>
<langsyntaxhighlight lang="java">public enum Suit { Diamonds, Spades, Hearts, Clubs }</langsyntaxhighlight>
 
The card:
<langsyntaxhighlight lang="java">public class Card {
private final Suit suit;
private final Pip value;
Line 2,997 ⟶ 3,634:
return value + " of " + suit;
}
}</langsyntaxhighlight>
The deck:
<langsyntaxhighlight lang="java">import java.util.Collections;
import java.util.LinkedList;
 
Line 3,022 ⟶ 3,659:
return deck.toString();
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">function Card(pip, suit) {
this.pip = pip;
this.suit = suit;
Line 3,055 ⟶ 3,692:
return this.deck.shift();
};
}</langsyntaxhighlight>
 
=={{header|jq}}==
In the following, dealing of cards is accomplished in the conventional manner,
that is in a round-robin fashion whereby in each round, each player is dealt one card from the top of the deck in turn.
 
Since neither the C nor the Go implementation of jq currently has a built-in
PRNG,
this program assumes an invocation such as:
<pre>
< /dev/urandom tr -cd '0-9' | fold -w 1 | $JQ -MRcnr -f playing-cards.jq
</pre>
where $JQ can be either jq or gojq. If gojq is used, the def of
`_nwise` given below should be uncommented.
 
<syntaxhighlight lang=jq>
# Uncomment for gojq:
# def _nwise($n):
# def nw: if length <= $n then . else .[0:$n] , (.[$n:] | nw) end;
# nw;
 
# Output: a prn in range(0;$n) where $n is .
def prn:
if . == 1 then 0
else . as $n
| (($n-1)|tostring|length) as $w
| [limit($w; inputs)] | join("") | tonumber
| if . < $n then . else ($n | prn) end
end;
 
def knuthShuffle:
length as $n
| if $n <= 1 then .
else {i: $n, a: .}
| until(.i == 0;
.i += -1
| (.i + 1 | prn) as $j
| .a[.i] as $t
| .a[.i] = .a[$j]
| .a[$j] = $t)
| .a
end;
 
def Pip: ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
 
def Suit: ["♦", "♣", "♥", "♠"];
 
def Card(pip; suit): pip + suit;
 
def Deck: Card(Pip[]; Suit[]);
 
# Deal one round of the cards in .deck to the players
# represented by .hands,
# but if there are not enough cards, do nothing except add .error to the input
# Input {deck, hands}
def deal:
(.hands | length) as $nplayers
| if $nplayers > (.deck|length) then .error = "not enough cards"
else reduce range(0;$nplayers) as $i (.; .hands[$i] += [.deck[$i]])
| .deck |= .[$nplayers:]
 
# Deal $n cards to $nplayers players if there are enough cards in the input deck
# Input: a deck
# Output: {deck, hands}
def deal($n; $nplayers):
if $n * $nplayers > length then "deal/2: not enough cards" | error
else {deck: ., hands: [range(0; $nplayers)|[]]}
| until( .hands[0]|length == $n; deal)
end ;
 
# display an entire deck or else just the cards
def display:
if length == 52 then _nwise(13) | join(" ")
else join(" ")
end;
 
def task:
Deck
| "After creation, the deck consists of:", display, "",
(knuthShuffle
| "After shuffling:", display, "",
( deal(5; 4)
| "After dealing 5 cards each to 4 players, the hands are:",
(.hands[] | display), "", "... leaving \(.deck|length) cards") ) ;
 
task
</syntaxhighlight>
{{output}}
An example.
<pre>
After creation, the deck consists of:
A♦ 2♦ 3♦ 4♦ 5♦ 6♦ 7♦ 8♦ 9♦ 10♦ J♦ Q♦ K♦
A♣ 2♣ 3♣ 4♣ 5♣ 6♣ 7♣ 8♣ 9♣ 10♣ J♣ Q♣ K♣
A♥ 2♥ 3♥ 4♥ 5♥ 6♥ 7♥ 8♥ 9♥ 10♥ J♥ Q♥ K♥
A♠ 2♠ 3♠ 4♠ 5♠ 6♠ 7♠ 8♠ 9♠ 10♠ J♠ Q♠ K♠
 
After shuffling:
9♦ 7♦ J♥ 7♥ 4♥ 3♠ 4♣ 2♦ 2♠ 6♦ Q♠ 8♦ A♣
8♥ 4♦ J♣ 5♠ 3♣ Q♣ 3♥ 7♠ 9♥ 8♣ 10♠ 2♥ A♠
Q♦ 5♦ 10♦ J♠ K♥ 5♣ A♦ 10♥ 10♣ A♥ 2♣ 9♣ 7♣
K♣ 6♠ K♦ 9♠ J♦ 5♥ Q♥ 4♠ K♠ 8♠ 6♣ 6♥ 3♦
 
After dealing 5 cards each to 4 players, the hands are:
9♦ 4♥ 2♠ A♣ 5♠
7♦ 3♠ 6♦ 8♥ 3♣
J♥ 4♣ Q♠ 4♦ Q♣
7♥ 2♦ 8♦ J♣ 3♥
 
... leaving 32 cards
</pre>
 
=={{header|Julia}}==
Line 3,062 ⟶ 3,808:
A deck consists of an array of integers and a <tt>DeckDesign</tt> type, which defines the meanings of the cards. This is a somewhat simplified implementation. While strictly speaking, a deck should be an array of cards, it is sufficient here to use integers. Indeed, cards and hands are just decks with smaller numbers of cards.
 
<syntaxhighlight lang="julia">
<lang Julia>
type DeckDesign{T<:Integer,U<:String}
rlen::T
Line 3,088 ⟶ 3,834:
Deck(collect(1:des.rlen*des.slen), des)
end
</syntaxhighlight>
</lang>
 
'''Define a Few of the Standard Methods'''
Line 3,094 ⟶ 3,840:
Many of these definitions are simply passed through to the card array component of the deck. But note that <tt>size</tt> returns parameters appropriate to a complete deck. This behavior is helpful when assigning meaning to any list of cards.
<syntaxhighlight lang="julia">
<lang Julia>
Base.isempty(d::Deck) = isempty(d.cards)
Base.empty!(d::Deck) = empty!(d.cards)
Line 3,109 ⟶ 3,855:
join(r.*s, " ")
end
</syntaxhighlight>
</lang>
 
'''Define Some Special Methods'''
Line 3,115 ⟶ 3,861:
<tt>deal!</tt> is the only deck specific method required to complete the essentials for this task.
 
<syntaxhighlight lang="julia">
<lang Julia>
function deal!{T<:Integer}(d::Deck, hlen::T)
if hlen < length(d)
Line 3,141 ⟶ 3,887:
chop(s)
end
</syntaxhighlight>
</lang>
 
'''Main'''
<syntaxhighlight lang="julia">
<lang Julia>
d = fresh(pokerlayout())
println("A new poker deck:")
Line 3,165 ⟶ 3,911:
println("And now the deck contains:")
println(pretty(d))
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,197 ⟶ 3,943:
 
Create the deck.
<langsyntaxhighlight Klang="k"> v:"A23456789TJQK" / values
s:"SHCD" / suites
 
/ create a new deck
newdeck:{deck::,/s,'\:v}
newdeck();</langsyntaxhighlight>
 
Show the deck.
<langsyntaxhighlight Klang="k"> show:{`0:$,/-3$$deck}
 
show()
SA S2 S3 S4 S5 S6 S7 S8 S9 ST SJ SQ SK HA H2 H3 H4 H5 H6 H7 H8 H9 HT HJ HQ HK CA C2 C3 C4 C5 C6 C7 C8 C9 CT CJ CQ CK DA D2 D3 D4 D5 D6 D7 D8 D9 DT DJ DQ DK </langsyntaxhighlight>
 
Shuffle the deck.
<langsyntaxhighlight Klang="k"> shuffle:{deck::(-#deck)?deck}
 
shuffle();show()
S8 CA D5 D2 SJ D6 DJ H7 S4 S9 SQ SK S5 D8 C4 HT DA H3 S6 S2 DT HA C2 C5 D9 ST C7 DK S3 HQ D7 DQ C8 D3 SA CJ CQ CT H4 H2 CK H9 H5 C3 C6 H6 D4 HJ C9 S7 HK H8 </langsyntaxhighlight>
 
Deal: Get the N top cards and remove them from the deck.
Deal 5 cards.
<langsyntaxhighlight Klang="k"> deal1:{|((#deck)-x)_|deck}
deal:{c:deal1[x];deck::(deck _dvl c);c}
 
Line 3,229 ⟶ 3,975:
 
#deck / 5 cards are removed
47</langsyntaxhighlight>
 
Deal 3 more hands.
<langsyntaxhighlight Klang="k"> {deal@5}'!3
(("D6"
"DJ"
Line 3,247 ⟶ 3,993:
"H3"
"S6"
"S2"))</langsyntaxhighlight>
 
We now have 32 cards left.
<langsyntaxhighlight Klang="k"> #deck
32
show()
DT HA C2 C5 D9 ST C7 DK S3 HQ D7 DQ C8 D3 SA CJ CQ CT H4 H2 CK H9 H5 C3 C6 H6 D4 HJ C9 S7 HK H8</langsyntaxhighlight>
 
=={{header|Kotlin}}==
=== procedural style ===
<lang scala>// version 1.3.50
{{Works with|Kotlin|1.3.50}}
const val FACES = "23456789TJQKA"
<syntaxhighlight lang="scala">const val FACES = "23456789TJQKA"
const val SUITS = "shdc"
 
Line 3,290 ⟶ 4,037:
println("\nThe 10 cards dealt from the bottom of the deck are:")
printDeck(dealtBottom)
}</syntaxhighlight>
}
</lang>
Sample output:
{{out}}
Line 3,311 ⟶ 4,057:
 
The 10 cards dealt from the bottom of the deck are:
5d 3h 8c 9h Kc 7c Qs 2s 6c 7h </pre>
 
</pre>
=== object-oriented ===
{{Works with|Kotlin|1.4.10}}
<syntaxhighlight lang="scala">class Deck : ArrayList<String> {
constructor() { FACES.forEach { face -> SUITS.forEach { add("$face$it") } } }
constructor(c: Collection<String>) { addAll(c) }
 
fun dealTop(n: Int) = Deck(take(n))
fun dealBottom(n: Int) = Deck(takeLast(n).reversed())
 
fun print() {
forEachIndexed { i, s ->
print("$s ")
if ((i + 1) % 13 == 0 || i == size - 1) println()
}
}
 
private companion object {
const val FACES = "23456789TJQKA"
const val SUITS = "shdc"
}
}
 
fun main(args: Array<String>) {
val deck = Deck()
println("After creation, deck consists of:")
deck.print()
deck.shuffle()
println("\nAfter shuffling, deck consists of:")
deck.print()
println("\nThe 10 cards dealt from the top of the deck are:")
deck.dealTop(10).print()
println("\nThe 10 cards dealt from the bottom of the deck are:")
deck.dealBottom(10).print()
}</syntaxhighlight>
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb"> Dim deckCards(52)
Dim holdCards(1, 1)
Print "The Sorted Deck"
Line 3,406 ⟶ 4,186:
pipLabel$ = "Ace Deuce Three Four Five Six Seven Eight Nine Ten Jack Queen King"
pip$ = Word$(pipLabel$, faceValue)
End Function</langsyntaxhighlight>
 
=={{header|Logo}}==
{{works with|UCB Logo}}
<langsyntaxhighlight lang="logo">make "suits {Diamonds Hearts Clubs Spades}
make "pips {Ace Two Three Four Five Six Seven Eight Nine Ten Jack Queen King}
 
Line 3,442 ⟶ 4,222:
new.deck
shuffle.deck
repeat 5 [deal.card]</langsyntaxhighlight>
 
=={{header|Lua}}==
===Version 1===
<syntaxhighlight lang="lua">
<lang Lua>
suits = {"Clubs", "Diamonds", "Hearts", "Spades"}
faces = {2,3,4,5,6,7,8,9,10,"Jack","Queen","King","Ace"}
Line 3,511 ⟶ 4,291:
print(d - 4 .. "")
print(-b .. "")
</syntaxhighlight>
</lang>
 
===Version 2===
<langsyntaxhighlight Lualang="lua">local tPlayers = {} -- cards of players
local tBoard = {} -- cards in a board
local nPlayers = 5 -- number of players
Line 3,572 ⟶ 4,352:
 
print('ALL CARDS IN THE DECK\n', table.concat(tDeck, ' '), '\n')
</syntaxhighlight>
</lang>
 
Output:
<langsyntaxhighlight Lualang="lua">FRESH DECK
2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ad 2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks As 2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh Ah 2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ac
 
Line 3,595 ⟶ 4,375:
ALL CARDS IN THE DECK
7c 3d 8h 7h 7s 9c 8c Ks 8s 2s 5s 8d 2h 3h Jc 6h Td Ts Jh Tc 6s Kd 7d 4h 4d 5d Qd 5h 5c Kh 9d 2d Ah 6d 3c Js 9h 9s 6c Qc 2c Jd Ac Th 4s Qs Ad Qh 4c 3s As Kc
</syntaxhighlight>
</lang>
 
=={{header|M2000 Interpreter}}==
We can use one or more packs. When we need a card and deck has no card then a new pack inserted (automatic drop some random cards)
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module PlayCards {
Font "Arial" ' Ensure characters exist for Suits
Line 3,707 ⟶ 4,488:
}
PlayCards
</syntaxhighlight>
</lang>
 
=={{header|M4}}==
<langsyntaxhighlight M4lang="m4">define(`randSeed',141592653)dnl
define(`setRand',
`define(`randSeed',ifelse(eval($1<10000),1,`eval(20000-$1)',`$1'))')dnl
Line 3,749 ⟶ 4,530:
deal deal(`b')
deal deal(`b')
show(`b')</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">MakeDeck[] := Tuples[{{"Ace ", 2, 3 , 4 , 5, 6 , 7 , 8 , 9 , 10, "Jack" , "Queen", "King"}, {♦ , ♣, ♥ , ♠}}]
DeckShuffle[deck_] := RandomSample[deck, Length@deck]
DealFromDeck[] := (Print@First@deck; deck = deck[[2 ;; All]];)</langsyntaxhighlight>
Example usage:
<pre>deck = DeckShuffle@MakeDeck[]; Print[deck]
Line 3,779 ⟶ 4,560:
 
=={{header|MiniScript}}==
<langsyntaxhighlight MiniScriptlang="miniscript">suits = ["Spades", "Clubs", "Hearts", "Diamonds"]
pips = ["Ace","Two","Three","Four","Five","Six","Seven",
"Eight","Nine","Ten","Jack","Queen","King"]
 
Card = {}
Card.str = function()
return self.pip + " of " + self.suit + " (value: " + self.value + ")"
end function
 
//Build Deck
deck = []
for s in suits.indexes
for p in pips.indexes
card = new Card
card.suit = suits[s]
card.pip = pips[p]
card.value = s * 100 + p
deck.push card
end for
end for
draw = function(count=7)
hand = []
for i in range(01,7 count)
card = floor(rnd *hand.push deck.len)pop
hand.push deck[card]
deck.remove card
end for
return hand
Line 3,795 ⟶ 4,591:
display = function(stack)
for card in stack
print card[2] + " of " + card[1] + " (value: " + card[0] + ")".str
end for
end function
//Build Deck
deck = []
for s in suits.indexes
for p in pips.indexes
card = [s*100+p, suits[s],pips[p]]
// print card
deck.push card
end for
end for
print "Deck created. Cards in Deck: " + deck.len
Line 3,817 ⟶ 4,603:
print "First hand: "
display hand
 
print "Deck: "
print deck.len + " cards left in deck:"
display deck
display deck</syntaxhighlight>
print "Cards remaining: " + deck.len</lang>
{{out}}
<pre>Deck created. Cards in Deck: 52
<pre>
Deck created. Cards in Deck: 52
Deck Shuffled
First hand:
Queen of Hearts (value: 211)
Eight of Spades (value: 7)
King of Clubs (value: 112)
Six of Hearts (value: 205)
Ace of Spades (value: 0)
Three of Clubs (value: 102)
Two of Clubs (value: 101)
Nine of Diamonds (value: 308)
Queen of Spades (value: 11)
Deck:
Seven of Clubs (value: 106)
NineTen of HeartsDiamonds (value: 208309)
TwoSeven of DiamondsHearts (value: 301206)
Eight of Spades (value: 7)
 
King of Diamonds (value: 312)
etc
</pre>
45 cards left in deck:
Nine of Spades (value: 8)
Four of Spades (value: 3)
Queen of Hearts (value: 211)
(etc.)</pre>
 
=={{header|MUMPS}}==
Line 3,847 ⟶ 4,629:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import mathrandom, strutils
randomize()
 
proc shuffle[T](x: var seq[T]) =
for i in countdown(x.high, 0):
let j = random(i + 1)
swap(x[i], x[j])
 
type
Suit* = enum ♥, ♦, ♣, ♠
 
Rank* {.pure.} = enum
Pip = enum c02, c03, c04, c05, c06, c07, c08, c09, c10, cQu, cKi, cAs
Ace = (1, "A")
Two = (2, "2")
Three = (3, "3")
Four = (4, "4")
Five = (5, "5")
Six = (6, "6")
Seven = (7, "7")
Eight = (8, "8")
Nine = (9, "9")
Ten = (10, "10")
Jack = (11, "J")
Queen = (12, "Q")
King = (13, "K")
 
Card* = objecttuple[rank: Rank; suit: Suit]
pip: Pip
suit: Suit
 
# Sequences of cards: synonyms for seq[Card].
Deck = object
Deck* cards:= seq[Card]
Hand* = seq[Card]
 
var initRandom = false # True if "randomize" has been called.
proc `$`(c: Card): string = $c.pip & $c.suit
 
 
proc initDeck(): Deck =
proc `$`*(c: Card): string =
result = Deck(cards: @[])
## Return the representation of a card.
$c.rank & $c.suit
 
 
proc initDeck*(): Deck =
## Initialize a deck.
for suit in Suit:
for piprank in PipRank:
result.cards.add Card(pip: piprank, suit: suit)
 
proc `$`(d: Deck): string = $d.cards
 
proc shuffle*(dcards: var Deckseq[Card]) = shuffle(d.cards)
## Shuffle a list of cards (deck or hand).
if not initRandom:
randomize()
initRandom = true
random.shuffle(cards)
 
proc deal(d: var Deck): Card =
d.shuffle()
d.cards.pop()
 
func `$`*(cards: seq[Card]): string =
var d = initDeck()
## Return the representation of a list o cards.
echo "40 cards from a deck:"
cards.join(" ")
for i in 0..4:
 
for j in 0..7:
 
stdout.write($d.deal(), " ")
func dealOne*(cards: var seq[Card]): Card =
echo ""
## Deal one card from a list of cards.
echo "The remaining cards are: ", $d</lang>
assert cards.len > 0
Output:
<pre>40 cards from a deck:.pop()
 
c10♦ c06♥ cKi♠ c09♥ c06♣ c02♦ c10♣ c08♣
 
c03♥ cQu♠ c07♠ c02♣ c04♦ c09♠ c07♦ c09♦
## Draw one card from a list of cards.
c02♠ c06♠ cKi♥ cAs♦ cAs♥ c04♥ c05♣ c02♥
let draw* = dealOne
cQu♥ c03♠ cQu♣ c05♦ c08♥ c04♠ c10♥ cQu♦
 
c04♣ c03♣ c03♦ cAs♠ c10♠ cKi♣ cKi♦ c05♠
 
The remaining cards are: @[c07♣, cAs♣, c05♥, c06♦, c08♦, c08♠, c09♣, c07♥]</pre>
func deal*(deck: var Deck; nPlayers: Positive; nCards: Positive): seq[Hand] =
## Deal "nCards" cards to "nPlayers" players.
assert deck.len >= nCards * nPlayers
result.setLen(nPlayers)
for n in 1..nCards:
for p in 0..<nPlayers:
result[p].add deck.pop()
 
 
when isMainModule:
import strformat
 
var deck = initDeck()
deck.shuffle()
echo "Initial deck after shuffling: "
for i in 0..2: echo deck[(i * 13)..(i * 13 + 12)], " ..."
echo deck[^13..^1]
 
echo "\nDeal eight cards for five players from the deck:"
var hands = deck.deal(5, 8)
for i, hand in hands: echo &"Player {i + 1} hand: ", hand
echo "Remaining cards: ", deck
 
echo "\nAfter player 1 drew a card from the deck: "
hands[0].add deck.draw()
echo "Player 1 hand: ", hands[0]
echo "Remaining cards: ", deck</syntaxhighlight>
 
{{out}}
<pre>Initial deck after shuffling:
A♦ Q♣ 2♣ A♥ 10♣ 3♠ Q♦ 7♦ A♣ 4♠ 9♥ 4♦ 7♠ ...
6♣ J♦ 7♥ 6♦ 9♠ 2♥ 8♥ 8♣ 8♦ 8♠ 4♣ 5♠ 2♦ ...
3♣ 9♦ 6♠ K♦ K♣ 5♦ 3♦ 10♠ J♠ 9♣ Q♥ 10♦ Q♠ ...
6♥ 5♣ 2♠ J♣ 3♥ K♠ A♠ 4♥ J♥ K♥ 10♥ 7♣ 5♥
 
Deal eight cards for five players from the deck:
Player 1 hand: 5♥ 4♥ 2♠ Q♥ 5♦ 3♣ 8♦ 6♦
Player 2 hand: 7♣ A♠ 5♣ 9♣ K♣ 2♦ 8♣ 7♥
Player 3 hand: 10♥ K♠ 6♥ J♠ K♦ 5♠ 8♥ J♦
Player 4 hand: K♥ 3♥ Q♠ 10♠ 6♠ 4♣ 2♥ 6♣
Player 5 hand: J♥ J♣ 10♦ 3♦ 9♦ 8♠ 9♠ 7♠
Remaining cards: A♦ Q♣ 2♣ A♥ 10♣ 3♠ Q♦ 7♦ A♣ 4♠ 9♥ 4♦
 
After player 1 drew a card from the deck:
Player 1 hand: 5♥ 4♥ 2♠ Q♥ 5♦ 3♣ 8♦ 6♦ 4♦
Remaining cards: A♦ Q♣ 2♣ A♥ 10♣ 3♠ Q♦ 7♦ A♣ 4♠ 9♥</pre>
 
=={{header|OCaml}}==
Straightforward implementation with algebraic types for the pips and suits, and lists of their values. A deck is an array of cards.
<langsyntaxhighlight lang="ocaml">type pip = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten |
Jack | Queen | King | Ace
let pips = [Two; Three; Four; Five; Six; Seven; Eight; Nine; Ten;
Line 3,915 ⟶ 4,756:
deck.(i) <- deck.(j);
deck.(j) <- temp
done</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
Uses a global variable v to pass around the remaining cards in the deck. If used inside a function this would be a good case for a dynamically-scoped variable (<code>local</code>) rather than the typically-preferred lexical scoping of <code>my</code>.
<langsyntaxhighlight lang="parigp">name(n)=Str(["A",2,3,4,5,6,7,8,9,10,"J","Q","K"][(n+3)>>2],["h","d","s","c"][n%4+1]);
newdeck()={
v=vector(52,i,i);
Line 3,938 ⟶ 4,779:
);
v
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
Line 3,944 ⟶ 4,785:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">package Playing_Card_Deck;
 
use strict;
use warnings;
 
@Playing_Card_Deck::suits = qw
Line 3,962 ⟶ 4,804:
{my $invocant = shift;
my $class = ref($invocant) || $invocant;
my @cards = ();
foreach my $suit (@Playing_Card_Deck::suits)
{foreach my $pip (@Playing_Card_Deck::pips)
Line 3,971 ⟶ 4,813:
# Removes the top card of the given deck and returns it as a hash
# with the keys "suit" and "pip".
{return %{ shift( @{shift(@_)} ) };}
 
sub shuffle
Line 3,985 ⟶ 4,827:
sub print_cards
# Prints out a description of every card in the deck, in order.
{print "$_->{pip} of $_->{suit}\n" foreach @{shift(@_)};}</langsyntaxhighlight>
Some examples of use:
<langsyntaxhighlight lang="perl">my $deck = new Playing_Card_Deck->new;
$deck->shuffle;
my %card = $deck->deal;
print uc("$card{pip} OF $card{suit}\n");
$deck->print_cards;</langsyntaxhighlight>
This creates a new deck, shuffles it, removes the top card, prints out that card's name in all caps, and then prints the rest of the deck.
 
=={{header|Perl 6Phix}}==
Includes both ascii/console and unicode/gui displays
{{Works with|rakudo|2016.08}}
{{libheader|Phix/pGUI}}
<lang perl6>enum Pip <A 2 3 4 5 6 7 8 9 10 J Q K>;
<!--<syntaxhighlight lang="phix">-->
enum Suit <♦ ♣ ♥ ♠>;
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Playing_cards.exw</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">deal</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">deck</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">nhands</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">ncards</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">hands</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">({},</span><span style="color: #000000;">nhands</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">ncards</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">h</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">nhands</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">hands</span><span style="color: #0000FF;">[</span><span style="color: #000000;">h</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">deck</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">deck</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">deck</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hands</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #000080;font-style:italic;">--console:</span>
class Card {
<span style="color: #008080;">procedure</span> <span style="color: #000000;">show_cards</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
has Pip $.pip;
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
has Suit $.suit;
<span style="color: #004080;">integer</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">1</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">sep</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"23456789TJQKA"</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]&</span><span style="color: #008000;">"SHDC"</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">/</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]&</span><span style="color: #000000;">sep</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">deck</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hands</span>
method Str { $!pip ~ $!suit }
}
<span style="color: #008080;">procedure</span> <span style="color: #000000;">console_show</span><span style="color: #0000FF;">()</span>
class Deck {
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hands</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
has Card @.cards = pick *,
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"hand%d:\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">})</span>
map { Card.new(:$^pip, :$^suit) }, flat (Pip.pick(*) X Suit.pick(*));
<span style="color: #000000;">show_cards</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hands</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"remaining cards(%d):\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">)})</span>
<span style="color: #000000;">show_cards</span><span style="color: #0000FF;">(</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000080;font-style:italic;">--GUI:</span>
method shuffle { @!cards .= pick: * }
<span style="color: #008080;">function</span> <span style="color: #000000;">cards_to_utf8</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">utf32</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">pip</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">utf32</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">0x1F0A1</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">pip</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">pip</span><span style="color: #0000FF;">></span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">c</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">#10</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #000000;">i</span><span style="color: #0000FF;"><</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">utf32</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">'\n'</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">utf32_to_utf8</span><span style="color: #0000FF;">(</span><span style="color: #000000;">utf32</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
method deal { shift @!cards }
<span style="color: #008080;">constant</span> <span style="color: #000000;">FONT</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`FONT="Arial, %d"`</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">92</span><span style="color: #0000FF;">})</span>
method Str { ~@!cards }
method gist { ~@!cards }
<span style="color: #008080;">procedure</span> <span style="color: #000000;">gui_show</span><span style="color: #0000FF;">()</span>
}
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
 
<span style="color: #7060A8;">IupSetGlobal</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"UTF8MODE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"YES"</span><span style="color: #0000FF;">)</span>
my Deck $d = Deck.new;
say "Deck: $d";
<span style="color: #004080;">Ihandles</span> <span style="color: #000000;">lh</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
 
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hands</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
my $top = $d.deal;
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"hand%d:"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">}))</span>
say "Top card: $top";
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cards_to_utf8</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hands</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])),</span><span style="color: #000000;">FONT</span><span style="color: #0000FF;">)</span>
 
<span style="color: #000000;">lh</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">&</span><span style="color: #000000;">h</span>
$d.shuffle;
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
say "Deck, re-shuffled: ", $d;</lang>
<span style="color: #000000;">lh</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"remaining cards:"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">lh</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cards_to_utf8</span><span style="color: #0000FF;">(</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">),</span><span style="color: #000000;">FONT</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">IupVbox</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lh</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">DECKSIZE</span><span style="color: #0000FF;">=</span><span style="color: #000000;">52</span>
<span style="color: #000000;">deck</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">shuffle</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">DECKSIZE</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">show_cards</span><span style="color: #0000FF;">(</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hands</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">deal</span><span style="color: #0000FF;">(</span><span style="color: #000000;">deck</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">console_show</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">gui_show</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
(console)
<pre>Deck: 3♦ J♦ 4♥ 7♠ 7♣ 7♥ 9♣ K♥ 6♠ 2♦ 3♠ Q♥ 8♥ 2♥ J♥ 5♥ 8♦ 8♣ 6♦ 7♦ 5♦ 2♣ 4♦ 8♠ 9♥ 4♣ 3♥ K♠ 2♠ 5♣ Q♣ Q♦ K♦ 4♠ 9♦ Q♠ 5♠ 6♥ J♣ J♠ K♣ 9♠ 3♣ 6♣
<pre>
Top card: 3♦
JC QC 6C 3D QS 7C 7D KS 2S AH TD TS 3C
Deck, re-shuffled: K♦ 4♣ J♠ 2♥ J♥ K♣ 6♣ 5♠ 3♥ 6♦ 5♦ 4♠ J♣ 4♦ 6♥ K♥ 7♥ 7♦ 2♦ 4♥ 6♠ 7♣ 9♦ 3♣ 3♠ 2♣ 2♠ 8♦ 5♣ 9♠ 5♥ J♦ 9♥ Q♦ Q♣ Q♥ Q♠ 8♥ 8♠ K♠ 9♣ 8♣ 7♠</pre>
QH 5H 4S KD 9S 8H QD 3S TC 2H 6S 9C 3H
7S 5S 8C 2D 5D 2C 4H 8S 9D JS 4D 8D JD
KH AS 6D AC JH 4C 6H KC TH 9H 5C AD 7H
hand1:
2S 3S QS KD 3C 9C JC
hand2:
9S 3H QH AH 7C TC QC
hand3:
7S 2H 5H 8H 7D TD 6C
hand4:
4S 5S 6S TS KS 3D QD
remaining cards(24):
8C 2D 5D 2C 4H 8S 9D JS 4D 8D JD KH AS
6D AC JH 4C 6H KC TH 9H 5C AD 7H
</pre>
 
=={{header|PHP}}==
{{works with|PHP|5.3+}}
Implementation:
<langsyntaxhighlight lang="php">class Card
{
// if unable to save as UTF-8, use other, non-UTF-8, symbols here
Line 4,309 ⟶ 5,216:
return $result[ 0 ];
}
}</langsyntaxhighlight>
 
Usage:
<langsyntaxhighlight lang="php">// if viewing in a browser, lets output a text/plain header with utf-8 charset
header( 'Content-Type: text/plain; charset=utf-8' );
 
Line 4,368 ⟶ 5,275:
 
// show the remaining cards in the deck
echo PHP_EOL . count( $deck ) . ' cards remaining in the deck: ' . PHP_EOL . $deck . PHP_EOL;</langsyntaxhighlight>
 
This will output something like:
Line 4,391 ⟶ 5,298:
♥A ♥6 ♦2 ♦5 ♥J ♣T ♦3 ♠5 ♠A ♣8 ♥8 ♥7 ♥K ♦7 ♥T ♦6 ♦T ♣6 ♣3 ♣A ♦4 ♥4 ♠6 ♣9</pre>
 
=={{header|PhixPicat}}==
<syntaxhighlight lang="picat">go =>
Includes both ascii/console and unicode/gui displays
% Create and print the deck
{{libheader|pGUI}}
deck(Deck),
<lang Phix>--
print_deck(Deck),
-- demo\rosetta\Playing_cards.exw
nl,
--
function deal(sequence deck, integer nhands, integer ncards)
% Shuffle the deck
sequence hands = repeat({},nhands)
print_deck(shuffle(Deck)),
for n=1 to ncards do
nl,
for h=1 to nhands do
hands[h] &= deck[1]
deck = deck[2..$]
end for
end for
return {deck,hands}
end function
 
% Deal 3 cards
--console:
Deck := deal(Deck,Card1),
procedure show_cards(sequence s)
Deck := deal(Deck,Card2),
for i=1 to length(s) do
Deck := deal(Deck,Card3),
integer c = s[i]-1
string sep = iff(mod(i,13)=0 or i=length(s)?"\n":" ")
puts(1,"23456789TJQKA"[mod(c,13)+1]&"SHDC"[floor(c/13)+1]&sep)
end for
end procedure
 
println(deal1=Card1),
sequence deck, hands
println(deal2=Card2),
println(deal3=Card3),
% The remaining deck
print_deck(Deck),
nl,
 
% Deal 5 cards
procedure console_show()
Deck := deal(Deck,Card4),
for i=1 to length(hands) do
Deck := deal(Deck,Card5),
printf(1,"hand%d:\n",{i})
Deck := deal(Deck,Card6),
show_cards(sort(hands[i]))
Deck := deal(Deck,Card7),
end for
Deck := deal(Deck,Card8),
printf(1,"remaining cards(%d):\n",{length(deck)})
show_cards(deck)
end procedure
 
println(cards4_to_8=[Card4,Card5,Card6,Card7,Card8]),
--GUI:
nl,
function cards_to_utf8(sequence s)
sequence utf32 = {}
for i=1 to length(s) do
integer c = s[i]
integer pip = mod(c,13)
utf32 &= 0x1F0A1 + pip+(pip>10) + floor((c-1)/13)*#10
end for
return utf32_to_utf8(utf32)
end function
 
% Deal 5 cards
include pGUI.e
Deck := deal_n(Deck,5,FiveCards),
println(fiveCards=FiveCards),
print_deck(Deck),
nl,
 
% And deal some more cards
constant FONT = sprintf("FONT=\"Arial, %d\"",{92})
% This chaining works since deal/1 returns the remaining deck
Deck := Deck.deal(Card9).deal(Card10).deal(Card11).deal(Card12),
println("4_more_cards"=[Card9,Card10,Card11,Card12]),
print_deck(Deck),
 
nl.
procedure gui_show()
IupOpen()
IupSetGlobal("UTF8MODE","YES")
 
% suits(Suits) => Suits = ["♠","♥","♦","♣"].
Ihandles lh = {}
suits(Suits) => Suits = ["C","H","S","D"].
for i=1 to length(hands) do
values(Values) => Values = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"].
Ihandle l = IupLabel(sprintf("hand%d:",{i}))
 
Ihandle h = IupLabel(cards_to_utf8(sort(hands[i])),FONT)
% Create a (sorted) deck.
lh &= l&h
deck(Deck) =>
end for
suits(Suits),
lh &= IupLabel("remaining cards:")
values(Values),
lh &= IupLabel(cards_to_utf8(deck),FONT)
Deck =[S++V :V in Values, S in Suits].sort().
 
% Shuffle a deck
shuffle(Deck) = Deck2 =>
Deck2 = Deck,
Len = Deck2.length,
foreach(I in 1..Len)
R2 = random(1,Len),
Deck2 := swap(Deck2,I,R2)
end.
 
% Swap position I <=> J in list L
swap(L,I,J) = L2, list(L) =>
L2 = L,
T = L2[I],
L2[I] := L2[J],
L2[J] := T.
 
 
% The first card is returned as the out parameter Card.
% The deck is returned as the function value.
deal(Deck, Card) = Deck.tail() => Card = Deck.first().
 
% Deal N cards
deal_n(Deck, N, Cards) = [Deck[I] : I in Len+1..Deck.length] =>
Len = min(N,Deck.length),
Cards = [Deck[I] : I in 1..Len].
 
% Print deck
Ihandle dlg = IupDialog(IupVbox(lh))
print_deck(Deck) =>
IupShow(dlg)
println("Deck:"),
IupMainLoop()
foreach({Card,I} in zip(Deck,1..Deck.len))
IupClose()
printf("%w ", Card),
end procedure
if I mod 10 == 0 then
nl
end
end,
nl.</syntaxhighlight>
 
constant DECKSIZE=52
deck = shuffle(tagset(DECKSIZE))
show_cards(deck)
{deck,hands} = deal(deck,4,7)
console_show()
gui_show()</lang>
{{out}}
<pre>Deck:
(console)
C2 C3 C4 C5 C6 C7 C8 C9 CA CJ
<pre>
JCCK QCCQ 6CCT 3DD2 QSD3 7CD4 7DD5 KSD6 2SD7 AHD8 TD TS 3C
QHD9 5HDA 4SDJ KDDK 9SDQ 8HDT QDH2 3SH3 TCH4 2HH5 6S 9C 3H
7SH6 5SH7 8CH8 2DH9 5DHA 2CHJ 4HHK 8SHQ 9DHT JSS2 4D 8D JD
KHS3 ASS4 6DS5 ACS6 JHS7 4CS8 6HS9 KCSA THSJ 9HSK 5C AD 7H
SQ ST
hand1:
 
2S 3S QS KD 3C 9C JC
Deck:
hand2:
SA C2 D7 C7 C4 S8 HT D9 DA H6
9S 3H QH AH 7C TC QC
D6 S6 H2 C5 H8 ST SJ HQ S9 DQ
hand3:
D5 C6 CJ H4 S5 HK CK HJ H5 D8
7S 2H 5H 8H 7D TD 6C
H9 C8 D4 CQ H3 H7 SK S4 DK SQ
hand4:
CA S7 D2 C9 DJ HA DT S2 C3 CT
4S 5S 6S TS KS 3D QD
D3 S3
remaining cards(24):
 
8C 2D 5D 2C 4H 8S 9D JS 4D 8D JD KH AS
deal1 = SA
6D AC JH 4C 6H KC TH 9H 5C AD 7H
deal2 = C2
</pre>
deal3 = D7
Deck:
C7 C4 S8 HT D9 DA H6 D6 S6 H2
C5 H8 ST SJ HQ S9 DQ D5 C6 CJ
H4 S5 HK CK HJ H5 D8 H9 C8 D4
CQ H3 H7 SK S4 DK SQ CA S7 D2
C9 DJ HA DT S2 C3 CT D3 S3
 
cards4_to_8 = [C7,C4,S8,HT,D9]
 
fiveCards = [DA,H6,D6,S6,H2]
Deck:
C5 H8 ST SJ HQ S9 DQ D5 C6 CJ
H4 S5 HK CK HJ H5 D8 H9 C8 D4
CQ H3 H7 SK S4 DK SQ CA S7 D2
C9 DJ HA DT S2 C3 CT D3 S3
 
4_more_cards = [C5,H8,ST,SJ]
Deck:
HQ S9 DQ D5 C6 CJ H4 S5 HK CK
HJ H5 D8 H9 C8 D4 CQ H3 H7 SK
S4 DK SQ CA S7 D2 C9 DJ HA DT
S2 C3 CT D3 S3 </pre>
 
 
=={{header|PicoLisp}}==
{{trans|Common Lisp}}
<langsyntaxhighlight PicoLisplang="picolisp">(de *Suits
Club Diamond Heart Spade )
 
Line 4,502 ⟶ 5,450:
 
(de shuffle (Lst)
(by '(NIL (rand)) sort Lst) )</langsyntaxhighlight>
 
=={{header|PowerShell}}==
This implementation was designed as a pre-requisite to other cards games. For this reason, this has the ability to have more than one persistent deck, more than one persistent hand, and shuffle the ''same deck'' over and over again or after some cards have been dealt out. There is also a full help file accessed by typing
''Get-Help Any-Function -full''
<syntaxhighlight lang="powershell">
<#
.Synopsis
Creates a new "Deck" which is a hashtable converted to a dictionary
This is only used for creating the deck, to view/list the deck contents use Get-Deck.
.DESCRIPTION
Casts the string value that the user inputs to the name of the variable that holds the "deck"
Creates a global variable, allowing you to use the name you choose in other functions and allows you to create
multiple decks under different names.
.EXAMPLE
PS C:\WINDOWS\system32> New-Deck
cmdlet New-Deck at command pipeline position 1
Supply values for the following parameters:
YourDeckName: Deck1
 
PS C:\WINDOWS\system32>
 
.EXAMPLE
PS C:\WINDOWS\system32> New-Deck -YourDeckName Deck2
 
PS C:\WINDOWS\system32>
.EXAMPLE
PS C:\WINDOWS\system32> New-Deck -YourDeckName Deck2
 
PS C:\WINDOWS\system32> New-Deck -YourDeckName Deck3
 
PS C:\WINDOWS\system32>
#>
function New-Deck
{
[CmdletBinding()]
[OutputType([int])]
Param
(
# Name your Deck, this will be the name of the variable that holds your deck
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$False,
Position=0)]$YourDeckName
)
 
Begin
{
$Suit = @(' of Hearts', ' of Spades', ' of Diamonds', ' of Clubs')
$Pip = @('Ace', 'King', 'Queen', 'Jack', '10', '9', '8', '7', '6', '5', '4', '3', '2')
 
#Creates the hash table that will hold the suit and pip variables
$Deck = @{}
#creates counters for the loop below to make 52 total cards with 13 cards per suit
[int]$SuitCounter = 0
[int]$PipCounter = 0
[int]$CardValue = 0
 
}
Process
{
#Creates the initial deck
do
{
#card2add is the rows in the hashtable
$Card2Add = ($Pip[$PipCounter]+$Suit[$SuitCounter])
 
#Addes the row to the hashtable
$Deck.Add($CardValue, $Card2Add)
 
#Used to create the Keys
$CardValue++
 
#Counts the amount of cards per suit
$PipCounter ++
if ($PipCounter -eq 13)
{
#once reached the suit is changed
$SuitCounter++
#and the per-suit counter is reset
$PipCounter = 0
}
else
{
continue
}
}
#52 cards in a deck
until ($Deck.count -eq 52)
 
}
End
{
#sets the name of a variable that is unknown
#Then converts the hash table to a dictionary and pipes it to the Get-Random cmdlet with the arguments to randomize the contents
Set-Variable -Name "$YourDeckName" -Value ($Deck.GetEnumerator() | Get-Random -Count ([int]::MaxValue)) -Scope Global
}
}
 
<#
.Synopsis
Lists the cards in your selected deck
.DESCRIPTION
Contains a Try-Catch-Finally block in case the deck requested has not been created
.EXAMPLE
PS C:\WINDOWS\system32> Get-Deck -YourDeckName deck1
 
8 of Clubs
5 of Hearts
--Shortened--
King of Clubs
Jack of Diamonds
 
PS C:\WINDOWS\system32>
 
 
.EXAMPLE
PS C:\WINDOWS\system32> Get-Deck -YourDeckName deck2
 
deck2 does not exist...
Creating Deck deck2...
 
Ace of Spades
10 of Hearts
--Shortened--
5 of Clubs
4 of Clubs
 
PS C:\WINDOWS\system32>
 
.EXAMPLE
PS C:\WINDOWS\system32> deck deck2
 
Ace of Spades
10 of Hearts
--Shortened--
4 of Spades
6 of Spades
Queen of Spades
 
PS C:\WINDOWS\system32>
#>
function Get-Deck
{
[CmdletBinding()]
[Alias('Deck')]
[OutputType([int])]
Param
(
#Brings the Vairiable in from Get-Deck
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]$YourDeckName
)
 
Begin
{
}
Process
{
# Will return a terminal error if the deck has not been created
try
{
$temp = Get-Variable -name "$YourDeckName" -ValueOnly -ErrorAction stop
}
catch
{
Write-Host
Write-Host "$YourDeckName does not exist..."
Write-Host "Creating Deck $YourDeckName..."
New-Deck -YourDeckName $YourDeckName
$temp = Get-Variable -name "$YourDeckName" -ValueOnly
}
 
finally
{
$temp | select Value | ft -HideTableHeaders
}
 
}
End
{
Write-Verbose "End of show-deck function"
}
}
 
<#
.Synopsis
Shuffles a deck of your selection with Get-Random
.DESCRIPTION
This function can be used to Shuffle any deck that has been created.
This can be used on a deck that has less than 52 cards
Contains a Try-Catch-Finally block in case the deck requested has not been created
Does NOT output the value of the deck being shuffled (You wouldn't look at the cards you shuffled, would you?)
 
.EXAMPLE
PS C:\WINDOWS\system32> Shuffle-Deck -YourDeckName Deck1
Your Deck was shuffled
 
PS C:\WINDOWS\system32>
 
.EXAMPLE
PS C:\WINDOWS\system32> Shuffle NotMadeYet
 
NotMadeYet does not exist...
Creating and shuffling NotMadeYet...
Your Deck was shuffled
 
PS C:\WINDOWS\system32>
#>
function Shuffle-Deck
{
[CmdletBinding()]
[Alias('Shuffle')]
[OutputType([int])]
Param
(
#The Deck you want to shuffle
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]$YourDeckName)
Begin
{
Write-Verbose 'Shuffles your deck with Get-Random'
}
Process
{
# Will return a missing variable error if the deck has net been created
try
{
#These two commands could be on one line using the pipeline, but look cleaner on two
$temp1 = Get-Variable -name "$YourDeckName" -ValueOnly -ErrorAction stop
$temp1 = $temp1 | Get-Random -Count ([int]::MaxValue)
}
catch
{
Write-Host
Write-Host "$YourDeckName does not exist..."
Write-Host "Creating and shuffling $YourDeckName..."
New-Deck -YourDeckName $YourDeckName
$temp1 = Get-Variable -name "$YourDeckName" -ValueOnly
$temp1 = $temp1 | Get-Random -Count ([int]::MaxValue)
 
}
 
finally
{
#Gets the actual value of variable $YourDeckName from the New-Deck function and uses that string value
#to set the variables name
Set-Variable -Name "$YourDeckName" -value ($temp1) -Scope Global
}
}
End
{
Write-Host "Your Deck was shuffled"
}
}
 
<#
.Synopsis
Creates a new "Hand" which is a hashtable converted to a dictionary
This is only used for creating the hand, to view/list the deck contents use Get-Hand.
.DESCRIPTION
Casts the string value that the user inputs to the name of the variable that holds the "hand"
Creates a global variable, allowing you to use the name you choose in other functions and allows you to create
multiple hands under different names.
.EXAMPLE
PS C:\WINDOWS\system32> New-Hand -YourHandName JohnDoe
 
PS C:\WINDOWS\system32>
.EXAMPLE
PS C:\WINDOWS\system32> New-Hand JaneDoe
 
PS C:\WINDOWS\system32>
>
#>
function New-Hand
{
[CmdletBinding()]
[OutputType([int])]
Param
(
# Name your Deck, this will be the name of the variable that holds your deck
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$False,
Position=0)]$YourHandName
)
 
Begin
{
$Hand = @{}
}
Process
{
}
End
{
Set-Variable -Name "$YourHandName" -Value ($Hand.GetEnumerator()) -Scope Global
}
}
 
<#
.Synopsis
Lists the cards in the selected Hand
.DESCRIPTION
Contains a Try-Catch-Finally block in case the hand requested has not been created
.EXAMPLE
#create a new hand
PS C:\WINDOWS\system32> New-Hand -YourHandName Hand1
 
PS C:\WINDOWS\system32> Get-Hand -YourHandName Hand1
Hand1's hand contains cards, they are...
 
PS C:\WINDOWS\system32>
#This hand is empty
.EXAMPLE
PS C:\WINDOWS\system32> Get-Hand -YourHandName Hand2
 
Hand2 does not exist...
Creating Hand Hand2...
Hand2's hand contains cards, they are...
 
PS C:\WINDOWS\system32>
 
.EXAMPLE
PS C:\WINDOWS\system32> hand hand3
hand3's hand contains 4 cards, they are...
 
5 of Spades
4 of Spades
6 of Spades
Queen of Diamonds
#>
function Get-Hand
{
[CmdletBinding()]
[Alias('Hand')]
[OutputType([int])]
Param
(
#Brings the Vairiable in from Get-Deck
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]$YourHandName
)
Begin
{
}
Process
{
# Will return a missing variable error if the deck has net been created
try
{
$temp = Get-Variable -name "$YourHandName" -ValueOnly -ErrorAction stop
}
catch
{
Write-Host
Write-Host "$YourHandName does not exist..."
Write-Host "Creating Hand $YourHandName..."
New-Hand -YourHandName $YourHandName
$temp = Get-Variable -name "$YourHandName" -ValueOnly
}
 
finally
{
$count = $temp.count
Write-Host "$YourHandName's hand contains $count cards, they are..."
$temp | select Value | ft -HideTableHeaders
}
 
}
End
{
Write-Verbose "End of show-deck function"
}
}
 
<#
.Synopsis
Draws/returns cards
.DESCRIPTION
Draws/returns cards from your chosen deck , to your chosen hand
Can be used without creating a deck or hand first
.EXAMPLE
PS C:\WINDOWS\system32> DrawFrom-Deck -YourDeckName Deck1 -YourHandName test1 -HowManyCardsToDraw 10
 
 
PS C:\WINDOWS\system32>
.EXAMPLE
DrawFrom-Deck -YourDeckName Deck2 -YourHandName test2 -HowManyCardsToDraw 10
Deck2 does not exist...
Creating Deck Deck2...
 
test2 does not exist...
Creating Hand test2...
test2's hand contains cards, they are...
 
 
.EXAMPLE
PS C:\WINDOWS\system32> draw -YourDeckName deck1 -YourHandName test1 -HowManyCardsToDraw 5
 
 
 
#>
function Draw-Deck
{
[CmdletBinding()]
[Alias('Draw')]
[OutputType([int])]
Param
(
# The Deck in which you want to draw cards out of
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]$YourDeckName,
#The hand in which you want to draw cards to
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]$YourHandName,
 
 
#Quanity of cards being drawn
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]$HowManyCardsToDraw
 
)
Begin
{
Write-Verbose "Draws a chosen amount of cards from the chosen deck"
 
#try-catch-finally blocks so the user does not have to use New-Deck and New-Hand beforehand.
try
{
$temp = Get-Variable -name "$YourDeckName" -ValueOnly -ErrorAction Stop
}
catch
{
Get-Deck -YourDeckName $YourDeckName
$temp = Get-Variable -name "$YourDeckName" -ValueOnly -ErrorAction Stop
}
finally
{
Write-Host
}
 
try
{
$temp2 = Get-Variable -name "$YourHandName" -ValueOnly -ErrorAction Stop
}
catch
{
Get-Hand -YourHandName $YourHandName
$temp2 = Get-Variable -name "$YourHandName" -ValueOnly -ErrorAction Stop
}
finally
{
Write-Host
}
}
 
Process
{
Write-Host "you drew $HowManyCardsToDraw cards, they are..."
 
$handValues = Get-Variable -name "$YourDeckName" -ValueOnly
$handValues = $handValues[0..(($HowManyCardsToDraw -1))] | select value | ft -HideTableHeaders
$handValues
 
}
End
{
#sets the new values for the deck and the hand selected
Set-Variable -Name "$YourDeckName" -value ($temp[$HowManyCardsToDraw..($temp.count)]) -Scope Global
Set-Variable -Name "$YourHandName" -value ($temp2 + $handValues) -Scope Global
}
}
</syntaxhighlight>
Results of using ''Draw-Deck'' without creating a hand or deck beforehand.
Note: Due to length I've shortened some of the results, however when run it returns everything:
<pre>
PS C:\WINDOWS\system32> Draw-Deck -YourDeckName TestDeck -YourHandName TestHand -HowManyCardsToDraw 5
 
TestDeck does not exist...
Creating Deck TestDeck...
 
2 of Spades
7 of Hearts
--Shortened--
6 of Spades
10 of Diamonds
 
 
TestHand does not exist...
Creating Hand TestHand...
TestHand's hand contains cards, they are...
 
you drew 5 cards, they are...
 
2 of Spades
Jack of Hearts
King of Clubs
Queen of Diamonds
4 of Spades
 
</pre>
 
Results of ''Get-Hand'':
<pre>
PS C:\WINDOWS\system32> Get-Hand -YourHandName TestHand
TestHand's hand contains 5 cards, they are...
 
King of Spades
King of Clubs
10 of Clubs
2 of Clubs
Ace of Spades
 
PS C:\WINDOWS\system32>
 
</pre>
Results of dealing all but 10 cards out of a deck and then shuffling the remaining cards in the deck:
<pre>
PS C:\WINDOWS\system32> draw -YourDeckName Deck -YourHandName MyHand -HowManyCardsToDraw 42
 
Deck does not exist...
Creating Deck Deck...
 
8 of Spades
2 of Diamonds
--Shortened--
6 of Hearts
5 of Spades
 
MyHand does not exist...
Creating Hand MyHand...
MyHand's hand contains cards, they are...
 
you drew 42 cards, they are...
 
8 of Spades
--Shortened--
2 of Clubs
 
PS C:\WINDOWS\system32> Get-Deck deck
 
6 of Diamonds
Ace of Diamonds
6 of Clubs
5 of Diamonds
9 of Hearts
Queen of Diamonds
9 of Diamonds
4 of Hearts
6 of Hearts
5 of Spades
 
PS C:\WINDOWS\system32> $deck.count
10
 
PS C:\WINDOWS\system32> Shuffle-Deck deck
Your Deck was shuffled
 
PS C:\WINDOWS\system32> Get-Deck deck
 
5 of Diamonds
Ace of Diamonds
9 of Hearts
6 of Hearts
6 of Diamonds
4 of Hearts
9 of Diamonds
6 of Clubs
Queen of Diamonds
5 of Spades
 
PS C:\WINDOWS\system32>
 
</pre>
 
=={{header|Prolog}}==
Line 4,508 ⟶ 6,043:
{{works with|SWI Prolog|4.8.0}}
 
<langsyntaxhighlight Prologlang="prolog">/** <module> Cards
 
A card is represented by the term "card(Pip, Suit)".
Line 4,546 ⟶ 6,081:
print_card(card(Pip, Suit)) :-
format('~a of ~a~n', [Pip, Suit]).
</syntaxhighlight>
</lang>
 
=={{header|PureBasic}}==
This approach keeps track of the cards in an abbrieviated form but allows them to be expanded to a more wordy form when they are dealt or shown.
<langsyntaxhighlight PureBasiclang="purebasic">#MaxCards = 52 ;Max Cards in a deck
Structure card
pip.s
Line 4,683 ⟶ 6,218:
Input()
CloseConsole()
EndIf</langsyntaxhighlight>
Sample output:
<pre>Dealt: Queen of Hearts
Line 4,698 ⟶ 6,233:
=={{header|Python}}==
===Python 2.x, standalone===
<langsyntaxhighlight lang="python">import random
 
class Card(object):
Line 4,723 ⟶ 6,258:
def deal(self):
self.shuffle() # Can't tell what is next from self.deck
return self.deck.pop(0)</langsyntaxhighlight>
 
===Python 3: extending [[Poker hand analyser#Python]]===
Assume the code from [[Poker hand analyser#Python]] is in a file pokerhand.py and importable.
<langsyntaxhighlight lang="python">from pokerhand import Card, suit, face
from itertools import product
from random import randrange
Line 4,751 ⟶ 6,286:
print(deck.deal(), end=' ')
print()
print('\nThe remaining cards are a', deck)</langsyntaxhighlight>
 
{{out}}
Line 4,763 ⟶ 6,298:
 
The remaining cards are a Deck of 2♦ 2♠ 4♦ 4♠ 5♦ 6♦ 8♦ 8♣ j♥ j♠ q♦ a♦</pre>
 
=={{header|Quackery}}==
 
This task is the subject of the chapter Dealing With Quackery in the book The Book of Quackery, which can be found at the GitHub Quackery repository, here: [https://github.com/GordonCharlton/Quackery]. Code presented here is done so with the permission of the author (me).
 
First, a demonstration in the Quackery shell of sufficient of the code to fulfil the requirements of this task:
 
<pre>/O> newpack +jokers 3 riffles 4 players 7 deal
... say "The player's hands..." cr cr
... witheach [ echohand cr ]
... say "Cards left in the pack (the talon)..." cr cr
... echohand
...
The player's hands...
 
eight of hearts
seven of clubs
nine of hearts
two of diamonds
three of diamonds
three of hearts
seven of spades
 
low joker
ace of hearts
ace of clubs
queen of diamonds
nine of clubs
six of spades
six of diamonds
 
ten of diamonds
five of spades
jack of diamonds
two of hearts
two of clubs
five of diamonds
ten of clubs
 
ace of diamonds
ace of spades
eight of clubs
king of diamonds
four of diamonds
ten of hearts
three of clubs
 
Cards left in the pack (the talon)...
 
eight of spades
four of hearts
jack of hearts
four of clubs
nine of spades
ten of spades
two of spades
five of hearts
seven of diamonds
five of clubs
jack of clubs
eight of diamonds
six of hearts
queen of hearts
three of spades
nine of diamonds
six of clubs
queen of clubs
four of spades
seven of hearts
jack of spades
queen of spades
king of hearts
king of spades
king of clubs
high joker
</pre>
 
A listing of the code accompanying the chapter, which does the above and more:
 
<syntaxhighlight lang="quackery"> [ /mod if 1+ ] is /up ( n n --> n )
 
[ [] 52 times [ i^ join ] ] is newpack ( --> [ )
 
[ -13 swap join ] is +lowjoker ( [ --> [ )
 
[ 64 join ] is +highjoker ( [ --> [ )
 
[ +lowjoker +highjoker ] is +jokers ( [ --> [ )
 
[ [ table
$ 'ace' $ 'two' $ 'three'
$ 'four' $ 'five' $ 'six'
$ 'seven' $ 'eight' $ 'nine'
$ 'ten' $ 'jack' $ 'queen'
$ 'king' ] do ] is rank ( n --> $ )
 
[ [ table
$ 'clubs' $ 'diamonds'
$ 'hearts' $ 'spades' ]
do ] is suit ( n --> $ )
 
[ dup -13 = iff
[ drop $ 'low joker' ] done
dup 64 = iff
[ drop $ 'high joker' ] done
13 /mod rank
$ ' of ' join
swap suit join ] is card ( n --> $ )
 
[ [] swap
witheach
[ card join
carriage join ] ] is hand ( [ --> $ )
 
[ card echo$ ] is echocard ( n --> )
 
[ hand echo$ ] is echohand ( [ --> )
 
[ > ] is bysuit ( n n --> b )
 
[ 13 /mod 4 * + ] is rankfirst ( n --> n )
 
[ rankfirst
swap rankfirst < ] is byrank ( n n --> b )
 
[ dup [] != while
dup size random split
swap join ] is cut ( [ --> [ )
 
[ dup [] != while
dup size 2 * 3 /up
random split
dup size dup iff
[ random split
dip swap join ]
else drop join ] is scarne ( [ --> [ )
 
[ [] nested swap of ] is players ( n --> [ )
 
[ temp put
over size * times
[ over [] = iff
[ 1 split swap join ]
else
[ swap temp share split
swap rot behead
rot join
nested join ] ]
temp release ] is dealby ( [ [ n n --> [ [ )
 
[ 1 dealby ] is deal ( [ [ n --> [ [ )
 
[ 1 swap dealby ] is dealeach ( [ [ n --> [ [ )
 
[ over size deal ] is dealall ( [ [ --> [ [ )
 
[ [] swap
[ behead 1 split
dip [ swap dip join ]
dup [] = iff
drop
else
[ nested join ]
dup [] = until ]
drop swap join ] is undeal ( [ [ --> [ )
 
[ over size over size
tuck /mod
rot over -
dip [ over 1+ swap of ]
rot swap of join
swap []
2swap
witheach
[ split unrot nested join
swap ]
unrot witheach
[ dip behead join
nested join ] ] is divvy ( [ [ --> [ [ )
 
[ newpack
4 players divvy
witheach
[ 1 split 7 split
nip join join ]
+highjoker ] is euchrepack ( --> [ )
 
[ [] swap witheach join
swap join ] is gather ( [ [ --> [ )
 
[ 2 players divvy undeal ] is faro-out ( [ --> [ )
 
[ 2 players divvy
1 split swap join undeal ] is faro-in ( [ --> [ )
 
[ unrot times
[ over i bit & iff
faro-in else faro-out ]
nip ] is faro ( [ n n --> [ )
 
[ players dealall gather ] is piles ( [ n --> [ )
 
[ players dealall
shuffle gather ] is mixpiles ( [ --> [ )
 
[ stack 5 ] is riffskill ( --> [ )
 
[ [] swap
dup size 2 /up split
2 random if swap
[ dup [] != while
behead nested
dip rot join unrot
riffskill share 1+ random
1 != if swap
again ] drop join ] is riffle ( [ --> [ )
 
[ times riffle ] is riffles ( [ n --> [ )</syntaxhighlight>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">pips <- c("2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace")
suit <- c("Clubs", "Diamonds", "Hearts", "Spades")
# Create a deck
Line 4,789 ⟶ 6,542:
deck <- deal(deck)
# While no-one is looking, sneakily deal a card from the bottom of the pack
deck <- deal(deck, FALSE)</langsyntaxhighlight>
 
=={{header|Racket}}==
 
<langsyntaxhighlight Racketlang="racket">#lang racket
 
;; suits:
Line 4,814 ⟶ 6,567:
(set-box! deck (shuffle (unbox deck))))
 
;; deal a card from tAthe 2 3 4 5 6 7 8 9 10 J Q K>;deck:
enum Suit he deck:
(define (deck-deal deck)
(begin0 (first (unbox deck))
Line 4,826 ⟶ 6,578:
(deck-deal my-deck)
(deck-deal my-deck)
(length (unbox my-deck))</langsyntaxhighlight>
 
{{out}}
Line 4,836 ⟶ 6,588:
> </pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{Works with|rakudo|2016.08}}
<syntaxhighlight lang="raku" line>enum Pip <A 2 3 4 5 6 7 8 9 10 J Q K>;
enum Suit <♦ ♣ ♥ ♠>;
class Card {
has Pip $.pip;
has Suit $.suit;
method Str { $!pip ~ $!suit }
}
class Deck {
has Card @.cards = pick *,
map { Card.new(:$^pip, :$^suit) }, flat (Pip.pick(*) X Suit.pick(*));
method shuffle { @!cards .= pick: * }
method deal { shift @!cards }
method Str { ~@!cards }
method gist { ~@!cards }
}
 
my Deck $d = Deck.new;
say "Deck: $d";
 
my $top = $d.deal;
say "Top card: $top";
 
$d.shuffle;
say "Deck, re-shuffled: ", $d;</syntaxhighlight>
{{out}}
<pre>Deck: 3♦ J♦ 4♥ 7♠ 7♣ 7♥ 9♣ K♥ 6♠ 2♦ 3♠ Q♥ 8♥ 2♥ J♥ 5♥ 8♦ 8♣ 6♦ 7♦ 5♦ 2♣ 4♦ 8♠ 9♥ 4♣ 3♥ K♠ 2♠ 5♣ Q♣ Q♦ K♦ 4♠ 9♦ Q♠ 5♠ 6♥ J♣ J♠ K♣ 9♠ 3♣ 6♣
Top card: 3♦
Deck, re-shuffled: K♦ 4♣ J♠ 2♥ J♥ K♣ 6♣ 5♠ 3♥ 6♦ 5♦ 4♠ J♣ 4♦ 6♥ K♥ 7♥ 7♦ 2♦ 4♥ 6♠ 7♣ 9♦ 3♣ 3♠ 2♣ 2♠ 8♦ 5♣ 9♠ 5♥ J♦ 9♥ Q♦ Q♣ Q♥ Q♠ 8♥ 8♠ K♠ 9♣ 8♣ 7♠</pre>
 
=={{header|Red}}==
<syntaxhighlight lang="rebol">
Red [Title: "Playing Cards"]
 
pip: ["a" "2" "3" "4" "5" "6" "7" "8" "9" "10" "j" "q" "k"]
suit: ["♣" "♦" "♥" "♠"]
 
make-deck: function [] [
new-deck: make block! 52
foreach s suit [foreach p pip [append/only new-deck reduce [p s]]]
return new-deck
]
 
shuffle: function [deck [block!]] [deck: random deck]
 
deal: function [other-deck [block!] deck [block!]] [unless empty? deck [append/only other-deck take deck]]
 
contents: function [deck [block!]] [
line: 0
repeat i length? deck [
prin [trim/all form deck/:i " "]
if (to-integer i / 13) > line [line: line + 1 print ""]
]]
 
deck: shuffle make-deck
print "40 cards from a deck:"
loop 5 [ print "" loop 8 [prin [trim/all form take deck " "]]]
prin "^/^/remaining: "
contents deck
</syntaxhighlight>
{{out}}
<pre>
40 cards from a deck:
 
a♣ 3♠ 6♦ 9♦ 8♦ q♣ a♥ 8♣
10♥ 3♥ a♦ k♦ 6♣ 9♣ k♥ 4♥
j♠ j♣ 5♦ q♦ 9♠ 2♥ 10♦ k♣
4♦ k♠ j♥ 5♠ q♠ 8♠ 2♣ 7♥
3♣ 2♦ 5♥ 7♦ 6♠ 6♥ q♥ 9♥
 
remaining: 3♦ 10♠ a♠ 7♠ 8♥ 4♣ j♦ 5♣ 2♠ 7♣ 4♠ 10♣
</pre>
=={{header|REXX}}==
===version 1===
<langsyntaxhighlight lang="rexx">/* REXX ***************************************************************
* 1) Build ordered Card deck
* 2) Create shuffled stack
Line 4,887 ⟶ 6,719:
Say 'Left on shuffled stack:'
Say ' 'subword(ss,1,26) /* and what's left on stack */
Say ' 'subword(ss,27,6)</langsyntaxhighlight>
Output:
<pre>
Line 4,907 ⟶ 6,739:
===version 2===
A check is made to see if ASCII characters can be used to display the suits &nbsp; (if using an ASCII machine).
<langsyntaxhighlight lang="rexx">/*REXX pgm shows a method to build/shuffle/deal 5 cards (using a 52─card deck)──►4 hands*/
box = build(); say ' box of cards:' box /*a brand new standard box of 52 cards.*/
deck= mix(); say 'shuffled deck:' deck /*obtain a randomly shuffled deck. */
Line 4,915 ⟶ 6,747:
say; say right('[south]' hand.3, 60)
say; say; say; say 'remainder of deck: ' deck
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
build: _=; ranks= "A 2 3 4 5 6 7 8 9 10 J Q K" /*ranks. */
Line 4,938 ⟶ 6,770:
@= @ word(_, ?) /*shuffled deck, 1 card at a time.*/
_= delword(_, ?, 1) /*elide just─chosen card from deck*/
end /*mixer*/; return @</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default values of four hands holding five cards:}}
<pre>
Line 4,960 ⟶ 6,792:
The Cards game, Screen shot : http://ring-lang.sourceforge.net/doc/_images/ringqt_shot48.jpg
 
<langsyntaxhighlight lang="ring">
Load "guilib.ring"
 
Line 5,206 ⟶ 7,038:
oTest = new qTest
oTest.qsleep(nTime)
</syntaxhighlight>
</lang>
 
=={{header|Ruby}}==
Line 5,212 ⟶ 7,044:
 
{{works with|Ruby|2.0.0+}}
<langsyntaxhighlight lang="ruby">class Card
# class constants
SUITS = %i[ Clubs Hearts Spades Diamonds ]
Line 5,262 ⟶ 7,094:
hand = deck.deal(5)
puts hand.join(", ")
puts hand.sort.join(", ")</langsyntaxhighlight>
 
{{out}}
Line 5,270 ⟶ 7,102:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">suite$ = "C,D,H,S" ' Club, Diamond,Hart Heart,Spaces Spade
card$ = "A,2,3,4,5,6,7,8,9,T,J,Q,K" ' Cards Ace to King
 
Line 5,294 ⟶ 7,126:
next deal
print
next hand</langsyntaxhighlight>
<pre>TD 7S JD 7C 3H AS 6D QD KH 5H 2C QH 8C
8H 5S 7D 2D 2H 4D KS JS 7H QC KC 9S TH
Line 5,302 ⟶ 7,134:
=={{header|Rust}}==
{{libheader|rand}}
<langsyntaxhighlight lang="rust">extern crate rand;
 
use std::fmt;
Line 5,364 ⟶ 7,196:
println!("{}", deck.deal().unwrap());
}
}</langsyntaxhighlight>
'''Sample output: 5 random cards'''
<pre>Jack of Diamonds
Line 5,373 ⟶ 7,205:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">import scala.annotation.tailrec
import scala.util.Random
 
Line 5,407 ⟶ 7,239:
}
override def toString():String="Deck: " + (cards mkString ", ")
}</langsyntaxhighlight>
Usage:
<langsyntaxhighlight lang="scala">val deck=new Deck()
val deckShuffled:Deck=deck.shuffle
 
Line 5,423 ⟶ 7,255:
val (cards, rest3) =deckShuffled deal 6
println(cards)
println(rest3)</langsyntaxhighlight>
Output:
<pre>Deck: Four of Diamonds, Two of Diamonds, Queen of Diamonds, Jack of Diamonds, Nine of Diamonds, Five of Diamonds, Seven of Diamonds, Ten of Diamonds, Six of Diamonds, Ace of Diamonds, King of Diamonds, Three of Diamonds, Eight of Diamonds, Ten of Spades, Seven of Spades, Eight of Spades, King of Spades, Ace of Spades, Three of Spades, Queen of Spades, Jack of Spades, Six of Spades, Five of Spades, Nine of Spades, Four of Spades, Two of Spades, Seven of Hearts, Queen of Hearts, Two of Hearts, Ten of Hearts, Eight of Hearts, Jack of Hearts, Four of Hearts, Nine of Hearts, Six of Hearts, King of Hearts, Five of Hearts, Three of Hearts, Ace of Hearts, King of Clubs, Jack of Clubs, Queen of Clubs, Six of Clubs, Three of Clubs, Two of Clubs, Eight of Clubs, Seven of Clubs, Ace of Clubs, Four of Clubs, Nine of Clubs, Five of Clubs, Ten of Clubs
Line 5,438 ⟶ 7,270:
The procedure <code>shuffle</code> requires an appropriate procedure <code>random</code> to be
defined. Some Scheme implementations provide this as an extension.
<langsyntaxhighlight lang="scheme">(define ranks
(quote (ace 2 3 4 5 6 7 8 9 10 jack queen king)))
 
Line 5,465 ⟶ 7,297:
(syntax-rules ()
((deal! deck hand)
(begin (set! hand (cons (car deck) hand)) (set! deck (cdr deck))))))</langsyntaxhighlight>
Example:
<langsyntaxhighlight lang="scheme">(define deck
(shuffle new-deck))
 
Line 5,480 ⟶ 7,312:
 
(display hand)
(newline)</langsyntaxhighlight>
Sample output:
<pre>((jack . hearts) (5 . clubs) (9 . hearts) (7 . clubs) (6 . spades))</pre>
 
=={{header|SenseTalk}}==
Using Object-Oriented Programming in SenseTalk, the object below is defined in a script titled, DeckOfCards. A second script would then be used to call the DeckOfCards and its methods.
 
DeckOfCards:
<syntaxhighlight lang="sensetalk">properties
cards: []
end properties
to initialize
set pips to (2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King", "Ace")
set suits to ("Clubs", "Spades", "Diamonds", "Hearts")
repeat for each suit in suits
repeat for each pip in pips
set card to pip && "of" && suit
insert card into my cards
end repeat
end repeat
put "New deck created, number of cards in deck:" && the number of items in my cards
end initialize
to shuffle
sort my cards by random of a million
put "Deck shuffled"
end shuffle
to deal
pull from my cards into card
put "Card dealt:" && card
put "Cards in deck remaining:" && the number of items in my cards
end deal
to handle asText
return my cards joined by return
end asText</syntaxhighlight>
Run:
<syntaxhighlight lang="sensetalk">put a new DeckOfCards into deck1
get deck1.shuffle
get deck1.deal
put deck1</syntaxhighlight>
Output:
<pre>New deck created, number of cards in deck: 52
Deck shuffled
Card dealt: 10 of Hearts
Cards in deck remaining: 51
9 of Spades
3 of Hearts
Ace of Hearts
9 of Clubs
5 of Clubs
5 of Diamonds
10 of Clubs
4 of Diamonds
King of Spades
6 of Hearts
5 of Spades
2 of Clubs
9 of Diamonds
4 of Clubs
King of Hearts
8 of Diamonds
Queen of Hearts
5 of Hearts
King of Diamonds
Queen of Diamonds
6 of Diamonds
10 of Diamonds
Ace of Diamonds
2 of Spades
3 of Diamonds
Queen of Spades
Jack of Hearts
Jack of Spades
Ace of Clubs
2 of Hearts
7 of Spades
6 of Clubs
4 of Spades
10 of Spades
7 of Clubs
3 of Clubs
6 of Spades
Jack of Clubs
Queen of Clubs
8 of Spades
9 of Hearts
4 of Hearts
King of Clubs
7 of Hearts
2 of Diamonds
8 of Hearts
7 of Diamonds
Jack of Diamonds
8 of Clubs
3 of Spades
Ace of Spades</pre>
 
=={{header|Sidef}}==
{{trans|Perl 6Raku}}
<langsyntaxhighlight lang="ruby">define Pip = <A 2 3 4 5 6 7 8 9 10 J Q K>;
define Suit = <♦ ♣ ♥ ♠>;
 
Line 5,516 ⟶ 7,440:
 
d.shuffle;
say "Deck, shuffled: #{d}";</langsyntaxhighlight>
{{out}}
<pre>
Line 5,527 ⟶ 7,451:
===Version 1===
{{works with|GNU Smalltalk}}
<langsyntaxhighlight lang="smalltalk">Object subclass: #Card
instanceVariableNames: 'thePip theSuit'
classVariableNames: 'pips suits'
Line 5,629 ⟶ 7,553:
 
"create a deck, shuffle it, remove the first card and display it"
Deck new shuffle deal displayNl.</langsyntaxhighlight>
 
'''Note''': there's something odd with the class method for getting pips and suits; it's because I've not understood how to initialize class variables to certain values without the need to explicitly call a method to do so.
Line 5,635 ⟶ 7,559:
===Version 2===
{{works with|GNU Smalltalk}}
<langsyntaxhighlight lang="smalltalk">Object subclass: Deck [
 
| cards |
Line 5,671 ⟶ 7,595:
'2c' '3c' '4c' '5c' '6c' '7c' '8c' '9c' 'Tc' 'Jc' 'Qc' 'Kc' 'Ac'
) deepCopy]
]</langsyntaxhighlight>
 
The Card class should obviously be more intricate to fulfil the needs of a CardGame class. :-)
 
Use example:
<langsyntaxhighlight Smalltalklang="smalltalk">st> myDeck := Deck of: Card
a Deck
st> myDeck displayNl
Line 5,689 ⟶ 7,613:
5
st> myHand
OrderedCollection ('Ad' 'Jd' 'Ks' 'Th' '6d' )</langsyntaxhighlight>
 
=={{header|Swift}}==
{{works with|Swift|5}}
<syntaxhighlight lang="swift">
struct Card: CustomStringConvertible
{
enum Suit: String, CaseIterable, CustomStringConvertible
{
case clubs = "♣️"
case diamonds = "♦️"
case hearts = "♥️"
case spades = "♠️"
 
var description: String { rawValue }
}
 
let suit: Suit
let value: Int
 
var description: String
{
let valueAsString: String
switch value
{
case 1:
valueAsString = "A"
case 11:
valueAsString = "J"
case 12:
valueAsString = "Q"
case 13:
valueAsString = "K"
default:
valueAsString = "\(value)"
}
return valueAsString + suit.description
}
}
 
struct Deck: CustomStringConvertible
{
var cards: [Card] = []
 
init()
{
for suit in Card.Suit.allCases
{
for faceValue in 1 ... 13
{
cards.append(Card(suit: suit, value: faceValue))
}
}
}
 
var description: String
{
String(cards.map{ $0.description }.joined(separator: ", "))
}
 
mutating func shuffle()
{
cards.shuffle()
}
 
mutating func dealCard() -> Card?
{
guard !cards.isEmpty else { return nil }
return cards.removeLast()
}
}
 
var deck = Deck()
print("New deck:")
print(deck)
deck.shuffle()
print("Shuffled deck:")
print(deck)
 
var hands: [[Card]] = [[], [], [], []]
 
var handIndex = 0
 
while let card = deck.dealCard()
{
hands[handIndex].append(card)
handIndex = (handIndex + 1) % hands.count
}
 
print ("Hands:")
print(hands.map({ $0.description }).joined(separator: "\n"))
print("Remaining deck (should be empty):")
print(deck)
</syntaxhighlight>
{{out}}
<pre>
New deck:
A♣️, 2♣️, 3♣️, 4♣️, 5♣️, 6♣️, 7♣️, 8♣️, 9♣️, 10♣️, J♣️, Q♣️, K♣️, A♦️, 2♦️, 3♦️, 4♦️, 5♦️, 6♦️, 7♦️, 8♦️, 9♦️, 10♦️, J♦️, Q♦️, K♦️, A♥️, 2♥️, 3♥️, 4♥️, 5♥️, 6♥️, 7♥️, 8♥️, 9♥️, 10♥️, J♥️, Q♥️, K♥️, A♠️, 2♠️, 3♠️, 4♠️, 5♠️, 6♠️, 7♠️, 8♠️, 9♠️, 10♠️, J♠️, Q♠️, K♠️
Shuffled deck:
2♣️, 2♠️, 8♠️, K♣️, 7♥️, Q♠️, 3♥️, 5♦️, 7♣️, 6♥️, J♥️, 10♣️, 6♠️, 8♥️, A♦️, 6♣️, 10♠️, 9♠️, 2♥️, 7♠️, 3♠️, 6♦️, A♥️, 5♥️, 9♣️, 5♣️, A♣️, 3♣️, 3♦️, 9♥️, Q♥️, 4♣️, 8♣️, K♦️, 10♥️, 4♦️, J♦️, 7♦️, 8♦️, J♣️, Q♦️, 5♠️, 2♦️, 4♥️, 10♦️, 9♦️, K♥️, 4♠️, J♠️, K♠️, Q♣️, A♠️
Hands:
[A♠️, 4♠️, 4♥️, J♣️, 4♦️, 4♣️, 3♣️, 5♥️, 7♠️, 6♣️, 10♣️, 5♦️, K♣️]
[Q♣️, K♥️, 2♦️, 8♦️, 10♥️, Q♥️, A♣️, A♥️, 2♥️, A♦️, J♥️, 3♥️, 8♠️]
[K♠️, 9♦️, 5♠️, 7♦️, K♦️, 9♥️, 5♣️, 6♦️, 9♠️, 8♥️, 6♥️, Q♠️, 2♠️]
[J♠️, 10♦️, Q♦️, J♦️, 8♣️, 3♦️, 9♣️, 3♠️, 10♠️, 6♠️, 7♣️, 7♥️, 2♣️]
Remaining deck (should be empty):
 
</pre>
 
{{works with|Swift 2.0}}
 
Enter this into a playground to see results
<langsyntaxhighlight lang="swift">
import Foundation
 
Line 5,880 ⟶ 7,910:
 
 
</syntaxhighlight>
</lang>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
namespace eval playing_cards {
Line 5,948 ⟶ 7,978:
playing_cards::print $hand -sort true
puts "\nthe deck:"
playing_cards::print_deck</langsyntaxhighlight>
 
=={{header|VBScript}}==
=====Implementation=====
<syntaxhighlight lang="vb">
<lang vb>
class playingcard
dim suit
Line 6,019 ⟶ 8,049:
end sub
end class
</syntaxhighlight>
</lang>
 
=====Invocation=====
<syntaxhighlight lang="vb">
<lang vb>
dim pack
set pack = new carddeck
Line 6,041 ⟶ 8,071:
end if
 
</syntaxhighlight>
</lang>
 
=====Output=====
Line 6,057 ⟶ 8,087:
Each users hand is another edit buffer.
There is no need for any routines to display the deck or a hand, since each of them is displayed in an edit window.
<langsyntaxhighlight lang="vedit">// Playing Cards, main program
 
Call("CREATE_DECK")
Line 6,139 ⟶ 8,169:
Buf_Switch(#11) // players hand
Reg_ins(9) // insert the cards here
Return</langsyntaxhighlight>
 
=={{header|Wren}}==
{{trans|Kotlin}}
<syntaxhighlight lang="wren">import "random" for Random
 
var FACES = "23456789TJQKA"
var SUITS = "shdc"
 
var createDeck = Fn.new {
var cards = []
SUITS.each { |suit| FACES.each { |face| cards.add("%(face)%(suit)") } }
return cards
}
 
var dealTopDeck = Fn.new { |deck, n| deck.take(n).toList }
 
var dealBottomDeck = Fn.new { |deck, n| deck[-n..-1][-1..0] }
 
var printDeck = Fn.new { |deck|
for (i in 0...deck.count) {
System.write("%(deck[i]) ")
if ((i + 1) % 13 == 0 || i == deck.count - 1) System.print()
}
}
 
var deck = createDeck.call()
System.print("After creation, deck consists of:")
printDeck.call(deck)
Random.new().shuffle(deck)
System.print("\nAfter shuffling, deck consists of:")
printDeck.call(deck)
var dealtTop = dealTopDeck.call(deck, 10)
System.print("\nThe 10 cards dealt from the top of the deck are:")
printDeck.call(dealtTop)
var dealtBottom = dealBottomDeck.call(deck, 10)
System.print("\nThe 10 cards dealt from the bottom of the deck are:")
printDeck.call(dealtBottom)</syntaxhighlight>
 
{{out}}
<pre>
After creation, deck consists of:
2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks As
2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh Ah
2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ad
2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ac
 
After shuffling, deck consists of:
Qs 9c 3c Qd 2h 5h As 5c 7s 7d 6s Qh Jc
Td 9s 6h Ad 5d 2d 4c 8d Kh Kc 8s Tc 7c
Ts 9h 3d 9d 7h 2s 3s 4d 5s Ac Kd 4s Ks
4h 8c Qc 6d Th 6c Jh 8h 2c 3h Ah Js Jd
 
The 10 cards dealt from the top of the deck are:
Qs 9c 3c Qd 2h 5h As 5c 7s 7d
 
The 10 cards dealt from the bottom of the deck are:
Jd Js Ah 3h 2c 8h Jh 6c Th 6d
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">char Deck(52); \card structure (low 2 bits = suit)
def Players = 4; \number of players to deal to
char Hand(Players, 52); \each player's hand
int Card, N, I, J, T;
char Suit, Royal;
[for Card:= 0 to 52-1 do \make a new deck
Deck(Card):= Card;
for N:= 0 to 10000 do \shuffle the deck
[I:= Ran(52); J:= Ran(52);
T:= Deck(I); Deck(I):= Deck(J); Deck(J):= T;
];
for N:= 0 to 52-1 do \deal from the deck
[Card:= Deck(N);
I:= N/Players;
J:= rem(0);
Hand(J, I):= Card;
];
Suit:= "HDCS "; \print each player's hand
Royal:= "JQK "; \ (= contents of the deck)
for J:= 0 to Players-1 do \e.g: 2D 3C 10C AS KD
[for I:= 0 to 52/Players -1 do
[Card:= Hand(J, I);
N:= Card>>2 + 1; \pip value
if N = 1 then ChOut(0, ^A)
else if N >= 11 then ChOut(0, Royal(N-11))
else IntOut(0, N);
ChOut(0, Suit(Card&3));
ChOut(0, ^ );
];
CrLf(0);
];
]</syntaxhighlight>
 
{{out}}
<pre>
3S 9C 4C 5D KC 9H QS 4H 5C 6H 2C 3C 5S
8D 4S 3H 8C 2D 7C 2S 8H 8S 10D 9S AH JC
6C 10C KH 9D 3D 5H JS 10S 2H 4D 10H 7H JH
QD KS 7S QH 6S JD QC 6D KD AC 7D AS AD
</pre>
 
=={{header|Yabasic}}==
{{trans|Run BASIC}}
<syntaxhighlight lang="vb">suite$ = "CDHS" //Club, Diamond, Heart, Spade
card$ = "A23456789TJQK" //Cards Ace to King
 
dim n(55) //make ordered deck
for i = 1 to 52 // of 52 cards
n(i) = i
next i
 
for i = 1 to 52 * 3 //shuffle deck 3 times
i1 = int(ran(52)) + 1
i2 = int(ran(52)) + 1
h2 = n(i1)
n(i1) = n(i2)
n(i2) = h2
next i
 
for hand = 1 to 4 //4 hands
for deal = 1 to 13 //deal each 13 cards
card = card + 1 //next card in deck
s = mod(n(card), 4) + 1 //determine suite
c = mod(n(card), 13) + 1 //determine card
print mid$(card$,c,1),mid$(suite$,s,1)," "; //show the card
next deal
print
next hand
end</syntaxhighlight>
{{out}}
<pre>Same as Run BASIC entry.</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">const Diamonds=1, Spades=3, Clubs=0, Hearts=2, Ace=1; // informational
var suits=T(0x1F0D1,0x1F0C1,0x1F0B1,0x1F0A1); //unicode 🃑,🃁,🂱,🂡
 
Line 6,166 ⟶ 8,327:
fcn deal(cards=5){ deck.pop(0,cards); }
fcn toString{ deck.pump(String,"toString"); }
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">d:=Deck();
d.println(d.deck.len());
d.deal().println();
d.println();</langsyntaxhighlight>
{{out}}
<pre>
Line 6,177 ⟶ 8,338:
🃄🂷🂤🃉🂡🂽🂥🂶🃃🃇🂳🂫🃍🃅🂭🃚🃞🃋🃘🂹🃛🂩🂺🃁🂮🂣🃖🂨🃙🃝🃒🂪🃂🃊🂲🃈🂧🃑🃆🂵🂴🃔🂾🂦🃓🂻🃕
</pre>
 
=={{header|ZX Spectrum Basic}}==
The deck is just a basic index from 1 to 52, with 1-13 representing the A-K of hearts, 14-26 the A-K of spades, etc. This makes it easier to sort a hand later, if so desired.
<syntaxhighlight lang="zxbasic">10 GOSUB 5000
20 CLS
30 PRINT "Options:"
40 PRINT "1: Shuffle deck"
50 PRINT "2: Deal cards"
60 PRINT "3: Display deck"
70 INPUT o
80 IF o<1 OR o>3 OR o<>INT o THEN GOTO 70
90 GO SUB (o+1)*1000
100 GO TO 20
 
999 REM convert index to card
1000 LET s=INT ((x-1)/13)+1
1010 LET p=x-13*(s-1)
1020 LET n=s-2*INT (s/2)+1
1030 LET c$=p$(p)+CHR$ 16+CHR$ (n AND n>1)+s$(s): REM colour codes to force red or black
1040 RETURN
 
1999 REM shuffle - only a naive shuffle algorithm but it'll do; the modularity of the program means this is easy enough to modify
2000 CLS : PRINT FLASH 1;"Shuffling..."
2010 LET s=1: REM changing s allows shuffling the remainder of an undealt deck, say
2020 FOR x=1 TO 100
2030 LET a=INT (RND*53-s)+s
2040 LET b=INT (RND*53-s)+s
2050 LET n=d(a)
2060 LET d(a)=d(b)
2070 LET d(b)=n
2080 NEXT x
2090 RETURN
 
2999 REM deal
3000 INPUT "How many players? ";p
3010 INPUT "How many cards? ";c
3020 IF c<1 OR p<1 OR c<>INT c OR p<>INT p THEN PRINT "Don't be silly!": GO TO 3000
3030 IF c*p>52 THEN PRINT "Not enough cards for that!": GO TO 3000
3040 CLS : DIM h(p,c)
3050 LET k=1
3060 FOR f=1 TO c
3070 FOR e=1 TO p
3080 LET h(e,f)=d(k)
3090 LET k=k+1
3100 NEXT e
3110 NEXT f
3120 FOR e=1 TO p
3130 PRINT "Player ";e;"'s hand:"
3140 FOR f=1 TO c
3150 LET x=h(e,f)
3160 GO SUB 1000
3170 PRINT c$;" ";
3180 NEXT e
3190 PRINT
3200 NEXT f
3210 PRINT
3220 PRINT "Remaining deck:"
3230 IF c*p=52 THEN PRINT "none"
3240 GO SUB 4010
3250 RETURN
 
3999 REM display deck
4000 CLS : LET k=1
4010 FOR y=k TO 52: REM enter here with k>1 to show the rest of an undealt deck
4020 LET x=d(y)
4030 GO SUB 1000
4040 PRINT c$
4050 NEXT y
4060 FOR y=0 TO 1000
4070 NEXT y
4080 RETURN
 
4999 REM initialise
5000 DIM d(52)
5010 GO SUB 6000
5020 LET s$=CHR$ 144+CHR$ 145+CHR$ 146+CHR$ 147: REM or LET s$="HSDC" if you don't want symbols
5030 LET p$="A23456789TJQK"
5040 FOR x=1 TO 52
5050 LET d(x)=x
5060 NEXT x
5070 RETURN
 
5999 REM characters - the ZX Spectrum character set doesn't contain suit symbols
6000 RESTORE 7000
6010 FOR x=65368 TO 65399
6020 READ a
6030 POKE x,a
6040 NEXT x
6050 RETURN
 
7000 DATA BIN 01101100: REM 108
7010 DATA BIN 11111110: REM 254
7020 DATA BIN 11111110: REM 254
7030 DATA BIN 11111110: REM 254
7040 DATA BIN 01111100: REM 124
7050 DATA BIN 00111000: REM 56
7060 DATA BIN 00010000: REM 16
7070 DATA BIN 00000000: REM 0
 
7080 DATA BIN 00010000: REM 16
7090 DATA BIN 00111000: REM 56
7100 DATA BIN 01111100: REM 124
7110 DATA BIN 11111110: REM 254
7120 DATA BIN 01010100: REM 84
7130 DATA BIN 00010000: REM 16
7140 DATA BIN 01111100: REM 124
7150 DATA BIN 00000000: REM 0
 
7160 DATA BIN 00010000: REM 16
7170 DATA BIN 00111000: REM 56
7180 DATA BIN 01111100: REM 124
7190 DATA BIN 11111110: REM 254
7200 DATA BIN 01111100: REM 124
7210 DATA BIN 00111000: REM 56
7220 DATA BIN 00010000: REM 16
7230 DATA BIN 00000000: REM 0
 
7240 DATA BIN 00010000: REM 16
7250 DATA BIN 00111000: REM 56
7260 DATA BIN 01010100: REM 84
7270 DATA BIN 11111110: REM 254
7280 DATA BIN 01010100: REM 84
7290 DATA BIN 00010000: REM 16
7300 DATA BIN 01111100: REM 124
7310 DATA BIN 00000000: REM 0</syntaxhighlight>
{{out}}
Using the HSDC mod from line 5020 to make it easier here. H and D would appear in colour.
<pre>
Player 1's hand:
QD 8D 6S 7D JS 8C 9S QH
 
Player 2's hand:
5C 7H 7C 4D 8H 3H 2H AD
 
Player 3's hand:
3C 5S QC AS 2D TS JH 6H
 
Player 4's hand:
9C 4C 7S TC 2C 6D AH 9D
Player 5's hand:
KH 6C JC 8S KD TD TH 5H
 
Player 6's hand:
AC JD QS KC 5D 3D 4H 4S
 
Remaining deck:
2S
KS
9H
3S</pre>
2,023

edits