Licht aus!
Licht aus, bitte!
Ziel des Spiels ist Schlafenszeit: alle Lichter aus. Ein Klick schaltet sowohl das geklickte Feld als auch die Nachbarfelder um. Etwas knifflig.
#!/usr/bin/wish package require Tk if {[catch {lassign "$argv 3" rows}]} then { set rows 4 } set tileSize 80 package require Tk bind [winfo class .] <Destroy> exit wm resizable . no no wm title . "Licht aus, bitte!" pack [canvas .c] namespace path ::tcl::mathop .c configure -width [* $rows $tileSize] -height [* $rows $tileSize] proc toggleOneField {c r {canvas .c}} { variable rows if {$c >= 0 && $c < $rows && $r >= 0 && $r < $rows} then { set id [$canvas find withtag c$c&&r$r] if {"on" in [$canvas gettags $id]} then { .c dtag $id on .c itemconfigure $id -fill [$canvas cget -bg] } else { .c addtag on withtag $id .c itemconfigure $id -fill white } } } proc toggleField {c r {canvas .c}} { toggleOneField $c $r $canvas toggleOneField [+ $c 1] $r $canvas toggleOneField [- $c 1] $r $canvas toggleOneField $c [+ $r 1] $canvas toggleOneField $c [- $r 1] $canvas if {[$canvas find withtag on] eq ""} then { # wm title . "Danke schön, gute Nacht!" .c delete all .c create text\ [/ [.c cget -width] 2]\ [/ [.c cget -height] 2]\ -font "Times 24 bold italic"\ -justify center\ -text "Danke\nschön!\nGute\nNacht!"\ -tags Danke blink .c\ -red0 0 -green0 0 -blue0 65535\ -red1 65535 -green1 65535 -blue1 0 } } proc blink {widget args} { set pi [expr {atan2(0,-1)}] set item {-att -fg -step 0 -red0 0 -green0 0 -blue0 0 -red1 65535 -interval 25 -green1 65535 -blue1 65535 -action continue} dict for {key val} $args { dict set item $key $val } if {[dict get $item -action] eq "continue"} then { dict incr item -step if {[dict get $item -step] >= 100} then { dict set item -step 0 } set factor [expr { (cos($pi*2*[dict get $item -step]/100)+1)/2 }] set red0 [dict get $item -red0] set red1 [dict get $item -red1] set red [expr {$red0+int(($red1-$red0)*$factor)}] set green0 [dict get $item -green0] set green1 [dict get $item -green1] set green [expr {$green0+int(($green1-$green0)*$factor)}] set blue0 [dict get $item -blue0] set blue1 [dict get $item -blue1] set blue [expr {$blue0+int(($blue1-$blue0)*$factor)}] set r [format %04x $red] set g [format %04x $green] set b [format %04x $blue] $widget itemconfigure Danke -fill #$r$g$b after [dict get $item -interval]\ [list blink $widget {*}$item] } else { foreach event [after info] { if {[lindex [after info $event] 0 0] eq "blink"} then { after cancel $event } } } } proc takeNfromList {n list} { if {$n > 0} then { set rand [expr {int(rand()*[llength $list])}] list [lindex $list $rand] {*}[takeNfromList [- $n 1] [lreplace $list $rand $rand]] } } proc randomNumOfFields rows { expr {$rows+int(rand()*$rows*($rows-2))} } apply { {canvas rows tileSize} { $canvas delete all for {set c 0} {$c < $rows} {incr c} { for {set r 0} {$r < $rows} {incr r} { $canvas create rectangle\ [+ [* $c $tileSize] 1]\ [+ [* $r $tileSize] 1]\ [+ [* $c $tileSize] $tileSize -1]\ [+ [* $r $tileSize] $tileSize -1]\ -width 0 -fill white -tags "c$c r$r on" $canvas bind c$c&&r$r <1> "toggleField $c $r" lappend fields "$c $r" } } foreach field\ [takeNfromList [randomNumOfFields $rows] $fields] { toggleField {*}$field $canvas } } } .c $rows $tileSize
11.3.2022
<< | Heimatseite | Verzeichnis | Stichworte | Autor | >>