##+########################################################################## # # mind.tcl -- A mind reading game based on http://www.flashpsychic.com/ # by Keith Vetter, December 2005 # package require Tk if {![catch {package require tile 0.5}]} { catch {namespace import -force ::ttk::button} } set chars [list \x25 \x26 \x27 \x28 \x36 \x3e \x49 \x4d \x4e \x4f \x50 \x51 \ \x52 \x53 \x54 \x55 \x56 \x57 \x58 \x59 \x60 \x61 \x62 \x63 \ \x64 \x65 \x66 \x67 \x68 \x69 \x6a \x6b \x6c \x6d \x79 \x7a \ \x7b \x7c \xa3 \xa5 \xa9 \xaa \xab \xae \xb3 \xb4 \xb5 \xb6 \ \xcb \xd0 \xd9 \xfd] proc DoDisplay {} { option add *Background white . config -bg white wm title . "Mind Reader" bind all <Key-F2> {console show} set msg "Choose any two digit number, add together both digits\n" append msg "and then subtract the total from your original number.\n" append msg "For example, if you choose 23: 23-(2+3) = 23-5 = 18.\n\n" append msg "When you have the final number look it up on the chart\n" append msg "and find the relevant symbol. Concentrate on the symbol\n" append msg "and when you have it clearly in your mind, click on the\n" append msg "crystal ball and it will show you the symbol you are\n" append msg "thinking of..." frame .left label .title -text "Mind Reader" -font {Times 32 italic} canvas .c -width 200 -height 200 -highlightthickness 0 bind .c <1> Predict MakeBall label .l -text $msg -justify left -padx 5 -pady 20 -font {Helvetica 8 bold} pack .title .c .l -side top -in .left frame .right -bd 2 -relief ridge for {set row 0} {$row < 20} {incr row} { for {set col 0} {$col < 5} {incr col} { set val [expr {99 - $col*20 - $row}] label .l$row,$col -text [format "%02d" $val] -font {Helvetica 10 bold} label .ll$row,$col -textvariable ::T($val) -fg \#640406 -font {Wingdings 10 bold} grid .l$row,$col -row $row -column [expr {2*$col}] -in .right grid .ll$row,$col -row $row -column [expr {2*$col+1}] -padx {0 5} -in .right } } pack .left .right -side left -fill both } proc FillTable {} { for {set i 0} {$i < 100} {incr i} { set ::T($i) [lindex $::chars [expr {int(rand() * [llength $::chars])}]] } for {set i 18} {$i <= 81} {incr i 9} { set ::T($i) $::T(9) } } proc GradientSteps {n c1 c2} { # Get RGB in 0 to 255 range foreach var {r1 g1 b1 r2 g2 b2} v [concat [winfo rgb . $c1] [winfo rgb . $c2]] { set $var [expr {$v * 255 / 65535}] } set grad {} for {set i 0} {$i <= $n} {incr i} { set r [expr {int($r1 + (($r2 - $r1) * $i / double($n)))}] set g [expr {int($g1 + (($g2 - $g1) * $i / double($n)))}] set b [expr {int($b1 + (($b2 - $b1) * $i / double($n)))}] lappend grad [format "#%.2X%.2X%.2X" $r $g $b] } return $grad } proc MakeBall {} { set n 90 set steps [GradientSteps $n white blue] set width [winfo reqwidth .c] set height [winfo reqheight .c] set centre 100 .c create oval 10 10 190 190 -tag o -outline \#0000aa -width 15 for {set i $n} {$i > 0} {incr i -1} { #set centre [expr $centre - 0.55] set centre [expr $centre - 0.45] set x1 [expr $centre - $i] set x2 [expr $centre + $i] set color [lindex $steps $i] .c create oval $x1 $x1 $x2 $x2 -fill $color -outline $color } } proc Predict {} { wm geom . [wm geom .] frame .try pack forget .right ; pack .try -side right -expand 1 .l config -fg white .c create text 100 100 -tag c -text $::T(9) -anchor c -fill \#004477 \ -font {Wingdings 12 bold} for {set fsize 24} {$fsize < 90} {incr fsize 6} { update after 10 .c itemconfig c -font [list Wingdings $fsize bold] } label .try.amazing -text "Can you\nbelieve it?" -font {Times 24 bold} -fg red button .try.again -text "Try Again?" -command Again catch {.try.again config -bg wheat} ;# looks better for non-tile buttons pack .try.amazing .try.again -side top -expand 1 -pady .15i } proc Again {} { destroy .try pack .right -side right FillTable .c delete c .l config -fg [lindex [.l config -fg] 3] } FillTable DoDisplay return
Interesting algo. I noticed from testing that all derived values always end up with the same symbol.