Acht Königinnen
Auf dem Schachbrett darf die Dame längs und schräg schlagen.
Ziel des Spiels: verteile acht Damen, so dass sich keine bedroht fühlt. Sonst schmollt sie nämlich.

#!/usr/bin/wish
package require Tcl 8.5
package require Tk
bind [winfo class .] <Destroy> exit
wm resizable . no no
wm title . "Set 8 Queens, splendid safe, please!"
proc blink {widget args} {
lassign [info level 0] blink
if {$widget eq "info"} then {
#
# info
#
set result {}
foreach event [after info] {
set info [after info $event]
if {[lindex $info end] eq "timer" &&
[lindex $info 0 0] eq $blink} then {
lassign $info cmd
lassign $cmd blink widget
if {[winfo exists $widget]} then {
set line [list $blink $widget]
set opts [lrange $cmd 2 end]
if {[winfo class $widget] in {Text Canvas}} then {
lappend line -tag [dict get $opts -tag]
}
lappend line -att [dict get $opts -att]
lappend result $line
}
}
}
lsort $result
} elseif {$widget eq "stop"} then {
#
# stop all after-events
#
foreach event [after info] {
set info [after info $event]
if {[lindex $info end] eq "timer" &&
[lindex $info 0 0] eq $blink} then {
after cancel $event
}
}
} elseif {[winfo exists $widget]} then {
if {$args eq "stop"} then {
$blink $widget -action stop
} else {
set class [winfo class $widget]
#
# prepare
#
set item {
-step 0
-red0 0
-green0 0
-blue0 0
-tag blink
-red1 65535
-green1 65535
-blue1 65535
-interval 25
-action continue
}
#
# set default target attributes
#
switch -exact -- $class {
Text {
dict set item -att -foreground
}
Canvas {
dict set item -att -fill
}
default {
dict set item -att -fg
}
}
#
# customize by command line
#
dict for {key val} $args {
dict set item $key $val
}
#
# translate named colors if given
#
if {[dict exists $item -color0]} then {
lassign [winfo rgb . [dict get $item -color0]] r g b
dict set item -red0 $r
dict set item -green0 $g
dict set item -blue0 $b
dict unset item -color0
}
if {[dict exists $item -color1]} then {
lassign [winfo rgb . [dict get $item -color1]] r g b
dict set item -red1 $r
dict set item -green1 $g
dict set item -blue1 $b
dict unset item -color1
}
#
if {[dict get $item -action] eq "continue"} then {
#
# calculate increasement of color
#
dict incr item -step
if {[dict get $item -step] >= 100} then {
dict set item -step 0
}
set pi [expr {
atan2(0,-1)
}]
set factor [expr {
(cos($pi * 2 * [dict get $item -step] / 100) + 1) / 2
}]
#
# generate hexadecimal color string
#
set rrrrggggbbbb #
#
set red0 [dict get $item -red0]
set red1 [dict get $item -red1]
set red [expr {$red0+int(($red1-$red0)*$factor)}]
append rrrrggggbbbb [format %04x $red]
#
set green0 [dict get $item -green0]
set green1 [dict get $item -green1]
set green [expr {$green0+int(($green1-$green0)*$factor)}]
append rrrrggggbbbb [format %04x $green]
#
set blue0 [dict get $item -blue0]
set blue1 [dict get $item -blue1]
set blue [expr {$blue0+int(($blue1-$blue0)*$factor)}]
append rrrrggggbbbb [format %04x $blue]
#
set tag [dict get $item -tag]
set att [dict get $item -att]
switch -exact -- $class {
Canvas {
$widget itemconfigure $tag $att $rrrrggggbbbb
}
Text {
$widget tag configure $tag $att $rrrrggggbbbb
}
default {
$widget configure $att $rrrrggggbbbb
}
}
#
# repeat
#
set interval [dict get $item -interval]
after $interval [list blink $widget {*}$item]
#
} else {
#
# stop blinking of $widget
#
foreach event [after info] {
set info [after info $event]
set line [lindex $info 0]
lassign $line proc arg
if {$proc eq $blink && $arg eq $widget} then {
after cancel $event
}
}
}
}
}
}
apply {canvas {
destroy $canvas
pack [canvas $canvas -width 320 -height 320]
foreach i {0 1 2 3 4 5 6 7} {
foreach j {0 1 2 3 4 5 6 7} {
set o [expr {($i+$j)%2 ? "odd" : "even"}]
set coords [list [* $i 40] [* $j 40]\
[* [+ $i 1] 40] [* [+ $j 1] 40]]
$canvas create rectangle $coords\
-tags [list f $o r$j c$i]
$canvas create text\
[+ [* $i 40] 20] [+ [* $j 40] 20]\
-tags [list q r$j c$i]
$canvas bind r$j&&c$i <1> "check $j $i"
}
}
foreach c {-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7} {
set col $c
foreach row {0 1 2 3 4 5 6 7} {
$canvas addtag d[+ $c 7] withtag r$row&&c$col
incr col
}
}
foreach c {0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15} {
set col $c
foreach row {0 1 2 3 4 5 6 7} {
$canvas addtag e$c withtag r$row&&c$col
incr col -1
}
}
$canvas itemconfigure odd\
-fill #cccccc\
-outline ""
$canvas itemconfigure even\
-fill #ffffcc\
-outline ""
$canvas itemconfigure q\
-fill navy\
-font {Times 32}
bind $canvas <ButtonRelease>\
"$canvas itemconfigure q -fill navy"
} ::tcl::mathop} .c
proc check {row col} {
set txt [.c itemcget q&&r$row&&c$col -text]
if {$txt ne ""} then {
.c itemconfigure q&&r$row&&c$col -text ""
} else {
setQueen $row $col
}
set missing [missingOfQueens]
switch -exact -- $missing {
0 {
wm title . Congratulations!
}
1 {
wm title . "Set 1 Queen, splendid safe!"
}
default {
wm title .\
"Set $missing Queens, splendid safe!"
}
}
}
proc setQueen {row col} {
foreach tag [.c gettags q&&r$row&&c$col] {
regexp d(.+) $tag - d
regexp e(.+) $tag - e
}
set pat q&&(r$row||c$col||d$d||e$e)
set success true
set els [.c find withtag $pat]
foreach el $els {
if {[.c itemcget $el -text] ne ""} then {
set success false
}
}
if {$success} then {
.c itemconfigure q&&r$row&&c$col -text \u2655
} else {
# .c itemconfigure $pat -fill red
blink .c -tag $pat -color0 white -color1 navy -interval 10
}
}
bind .c <ButtonRelease> {
blink stop
.c itemconfigure q -fill navy
}
proc missingOfQueens {} {
set result 8
foreach item [.c find all] {
if {[.c type $item] eq "text" &&
[.c itemcget $item -text] ne ""} then {
incr result -1
}
}
set result
}
11.3.2022
<< | Heimatseite | Verzeichnis | Stichworte | Autor | >>