Deal cards for FreeCell: Difference between revisions

Content added Content deleted
(→‎{{header|C}}: colors; just one array)
(→‎Tcl: Added implementation)
Line 76: Line 76:
return 0;
return 0;
}</lang>
}</lang>

=={{header|Tcl}}==
{{trans|C}}
<lang tcl>proc rnd {{*r seed}} {
upvar 1 ${*r} r
expr {[set r [expr {($r * 214013 + 2531011) & 0x7fffffff}]] >> 16}
}
proc show cards {
set suits {\u2663 \u2666 \u2665 \u2660}
set values {A 2 3 4 5 6 7 8 9 T J Q K}
for {set i 0} {$i < 52} {incr i} {
set c [lindex $cards $i]
puts -nonewline [format " \033\[%dm%s\033\[m%s" [expr {32-(1+$c)%4/2}] \
[lindex $suits [expr {$c % 4}]] [lindex $values [expr {$c / 4}]]]
if {($i&7)==7 || $i==51} {puts ""}
}
}
proc deal {seed} {
for {set i 0} {$i < 52} {incr i} {lappend cards [expr {51 - $i}]}
for {set i 0} {$i < 51} {incr i} {
set j [expr {51 - [rnd]%(52-$i)}]
set tmp [lindex $cards $i]
lset cards $i [lindex $cards $j]
lset cards $j $tmp
}
return $cards
}

if {![scan =[lindex $argv 0]= =%d= s] || $s <= 0} {
set s 11982
}
set cards [deal $s]
puts "Hand $s"
show $cards</lang>