Deal cards for FreeCell: Difference between revisions
Content added Content deleted
(added ocaml) |
|||
Line 161: | Line 161: | ||
JD 7D 8H 9C 2H QD 4C 5H |
JD 7D 8H 9C 2H QD 4C 5H |
||
KC 8D 2S 3S</pre> |
KC 8D 2S 3S</pre> |
||
=={{header|Icon}} and {{header|Unicon}}== |
|||
<lang Icon>procedure main(A) # freecelldealer |
|||
freecelldealer(\A[1] | &null) # seed from command line |
|||
end |
|||
procedure newDeck() #: return a new unshuffled deck |
|||
every D := list(52) & i := 0 & r := !"A23456789TJQK" & s := !"CDHS" do |
|||
D[i +:= 1] := r || s # initial deck AC AD ... KS |
|||
return D |
|||
end |
|||
procedure freecelldealer(gamenum) #: deal a freecell hand |
|||
/gamenum := 11982 |
|||
return showHand(freecellshuffle(newDeck(),gamenum)) |
|||
end |
|||
procedure showHand(D) #: show a freecell hand |
|||
write("Hand:\n") |
|||
every writes(" ",(1 to 8) | "\n") |
|||
every writes(" ",D[i := 1 to *D]) do |
|||
if i%8 = 0 then write() |
|||
write("\n") |
|||
return D |
|||
end |
|||
procedure freecellshuffle(D,gamenum) #: freecell shuffle |
|||
rand_freecell(gamenum) # seed random number generator |
|||
D2 := [] |
|||
until *D = 0 do { # repeat until all dealt |
|||
D[r := rand_freecell() % *D + 1] :=: D[*D] # swap random & last cards |
|||
put(D2,pull(D)) # remove dealt card from list |
|||
} |
|||
return D2 |
|||
end |
|||
procedure rand_freecell(x) |
|||
static seed |
|||
if \x | /seed then |
|||
return seed := \x | 0 |
|||
seed := (214013 * seed + 2531011) % 2147483648 |
|||
return ishift(seed,-16) |
|||
end</lang> |
|||
Sample output for game 1:<pre>Hand: |
|||
1 2 3 4 5 6 7 8 |
|||
JD 2D 9H JC 5D 7H 7C 5H |
|||
KD KC 9S 5S AD QC KH 3H |
|||
2S KS 9D QD JS AS AH 3C |
|||
4C 5C TS QH 4H AC 4D 7S |
|||
3S TD 4S TH 8H 2C JH 7D |
|||
6D 8S 8D QS 6C 3D 8C TC |
|||
6S 9C 2H 6H</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |