#!/usr/local/bin/wish

set n 7


bind . <space> "Reset"
bind . <Return> "destroy ."

frame .f 
grid .f -row 1 -column 0 -columnspan 8
label .f.l -text "length:"
entry .f.e -width 3 -textvariable n
button .f.r -text "reset" -command Reset
button .f.d -text "dismiss" -command "destroy ."
set i 0
foreach p {l e r d} {
grid .f.$p -row 1 -column [expr 2*$i] -columnspan 2
incr i
}


proc Reset {} {
global n
for {set i 1} {$i <= $n} {incr i} {
if {$i <= [expr {$n/2}]} {
set cor red
} elseif {$i > [expr {$n/2 + 1}]} {
set cor blue
} else {
set cor white
}
if {[winfo exists .b$i]} {
destroy .b$i
}
button .b$i -height 2 -width 2 -background $cor -command "Do $i"
grid .b$i -row 0 -column [expr {$i - 1}]
}
}

proc Do {i} {
global n
if {[.b$i cget -background] == "red"} {
if {$i < $n && [.b[expr {$i+1}] cget -background] == "white"} {
.b$i configure -background white
.b[expr {$i+1}] configure -background red
} elseif {$i < [expr {$n - 1}] && [.b[expr {$i+2}] cget -background] == "white"} {
.b$i configure -background white
.b[expr {$i+2}] configure -background red
} 
}
if {[.b$i cget -background] == "blue"} {
if {$i > 1 && [.b[expr {$i - 1}] cget -background] == "white"} {
.b$i configure -background white
.b[expr {$i - 1}] configure -background blue
} elseif {$i  > 2 && [.b[expr {$i - 2}] cget -background] == "white"} {
.b$i configure -background white
.b[expr {$i - 2}] configure -background blue
} 
}
}

Reset
