Listing 1 - CardsArray.cfm

<!---
<fusedoc fuse="CardsArray.cfm" language="CFML" version="2.0">
  <responsibilities>
    I create an array with an element for each card in a standard playing card deck.
  </responsibilities>
  <properties>
    <history date="2006-08-05" author="jeff@grokfusebox.com" role="Architect" type="Create" />
  </properties>
  <io>
    <in>
    </in>
    <out>
      <array name="deckArray">
        <string comments="a card value and suit" />
      </array>
    </out>
  </io>
</fusedoc>
--->
<cfset deckArray = ArrayNew(1)>
<cfset suitList = "S,D,C,H">

<!--- Populate the deck array --->
<cfloop list="#suitList#" index="aSuit">
  <!--- Now add the numbered cards for this suit --->
  <cfloop from="1" to="9" index="i">
    <cfset ArrayAppend(deckArray,"#i+1##aSuit#")>
  </cfloop>
  <!--- Now add the 'special' cards for this suit --->
  <cfset ArrayAppend(deckArray,"J#aSuit#")>
  <cfset ArrayAppend(deckArray,"Q#aSuit#")>
  <cfset ArrayAppend(deckArray,"K#aSuit#")>
  <cfset ArrayAppend(deckArray,"A#aSuit#")>
</cfloop>


Listing 2 - testCardsArray.cfm

<cfinclude template="CardsArray.cfm">

<cfdump var="#deckArray#" label="deckArray">


Listing 3 - ShuffleDeck.cfm

<!---
<fusedoc fuse="ShuffleDeck.cfm" language="CFML" version="2.0">
  <responsibilities>
    I use a deck array to create a shuffled deck array.
  </responsibilities>
  <properties>
    <history date="2006-08-05" author="jeff@grokfusebox.com" role="Architect" type="Create" />
  </properties>
  <io>
    <in>
      <array name="deckArray">
        <string comments="a card value and suit" />
      </array>
    </in>
    <out>
      <array name="shuffledDeckArray">
        <string comments="a card value and suit" />
      </array>
    </out>
  </io>
</fusedoc>
--->

<cfset shuffledDeckArray = deckArray>

<!--- Shuffle the deck by swapping random pairs of cards; higher 'to' value means more shuffling --->
<cfloop from="1" to="100" index="i">
  <cfset Card1 = RandRange(1,52)>
  <cfset Card2 = RandRange(1,52)>
  <cfset ArraySwap(shuffledDeckArray,Card1,Card2)>
</cfloop>


Listing 4 - testShuffleDeck.cfm

<cfinclude template="CardsArray.cfm">
<cfinclude template="ShuffleDeck.cfm">

<cfdump var="#shuffledDeckArray#" label="shuffledDeckArray">


Listing 5 - DealCards.cfm

<!---
<fusedoc fuse="DealCards.cfm" language="CFML" version="2.0">
  <responsibilities>
    I deal a specified number of hands, each hand consisting of a specified number of cards.
  </responsibilities>
  <properties>
    <history date="2006-08-05" author="jeff@grokfusebox.com" role="Architect" type="Create" />
  </properties>
  <io>
    <in>
      <array name="shuffledDeckArray">
        <string comments="a card value and suit" />
      </array>
      <number name="numberOfHands" precision="integer" optional="yes" default="4"/>
      <number name="cardsPerHand" precision="integer" optional="yes" default="5" />
    </in>
    <out>
      <array name="handsArray">
        <array comments="an array for each hand">
          <string comments="a card value and suit" />
        </array>
      </array>
    </out>
  </io>
</fusedoc>
--->
<cfparam name="cardsPerHand" default="5">
<cfparam name="numberOfHands" default="4">

<!--- Make an array to hold the dealt hands --->
<cfset handsArray = ArrayNew(1)>

<!--- Deal the deck into hands of the specified number of cards --->
<cfloop from="1" to="#numberOfHands#" index="i">
  <cfset handsArray[i] = ArrayNew(1)>
  <cfloop from="1" to="#cardsPerHand#" index="j">
    <cfset handsArray[i][j] = shuffledDeckArray[1]>
    <cfset ArrayDeleteAt(shuffledDeckArray,1)>
  </cfloop>
</cfloop>


Listing 6 - testDealCards.cfm

<cfinclude template="CardsArray.cfm">
<cfinclude template="ShuffleDeck.cfm">
<cfset numberOfHands = 6>
<cfset cardsPerHand = 5>
<cfinclude template="DealCards.cfm">

<cfdump var="#handsArray#" label="handsArray">
<cfdump var="#shuffledDeckArray#" label="shuffledDeckArray">


Listing 7 - ShowHands.cfm

<!---
<fusedoc fuse="ShowHands.cfm" language="CFML" version="2.0">
  <responsibilities>
    I use image files to display an array of dealt hands.
  </responsibilities>
  <properties>
    <history author="jeff@grokfusebox.com" role="Architect" type="Create" />
  </properties>
  <io>
    <in>
      <array name="handsArray">
        <array comments="an array for each hand">
          <string comments="a card value and suit" />
        </array>
      </array>
    </in>
    <out>
    </out>
  </io>
</fusedoc>
--->

<cfloop from="1" to="#ArrayLen(handsArray)#" index="i">
  <cfoutput><h3>Hand #i#:</h3></cfoutput>
  <cfloop from="1" to="#ArrayLen(handsArray[i])#" index="j">
    <cfoutput><img src="images/#handsArray[i][j]#sm.jpg"></cfoutput>
  </cfloop>
  <br />
</cfloop>


Listing 8 - testShowHands.cfm

<cfinclude template="CardsArray.cfm">
<cfinclude template="ShuffleDeck.cfm">
<cfinclude template="DealCards.cfm">
<cfinclude template="ShowHands.cfm">