package require Tk
pack [canvas .c -width 240 -height 280 -background green3]
.c create rect 40 20 200 260 -width 2 -outline white
.c create rect 70 20 170 70 -width 2 -outline white
.c create rect 90 20 150 40 -width 2 -outline white
set g1 [.c create rect 105 5 135 20 -fill red -stipple gray25 -tag goal]
set n$g1 0
.c create text 15 120 -tag n$g1
trace var n$g1 w ".c itemconfig n$g1 -text \[set ::n$g1\];#"
set n$g1 0
.c create rect 70 215 170 260 -width 2 -outline white
.c create line 40 140 200 140 -width 2 -fill white
.c create rect 90 240 150 260 -width 2 -outline white
set g2 [.c create rect 105 260 135 275 -fill red -stipple gray25 -tag goal]
.c create text 15 150 -tag n$g2
trace var n$g2 w ".c itemconfig n$g2 -text \[set ::n$g2\];#"
set n$g2 0
.c create oval 95 115 145 165 -width 2 -outline white
.c create oval 115 135 125 145 -fill yellow -tag ball
bind .c <1> {down %W %x %y}
bind .c <B1-Motion> {motion %W %x %y}
proc down {w x y} {
set ::X $x; set ::Y $y
foreach {bx by} [center $w ball] break
set dx [expr {$bx-$x}]
set dy [expr {$by-$y}]
if {hypot($dx,$dy)<20} {
move $w ball [expr {$dx*0.6}] [expr {$dy*0.6}]
}
}
proc motion {w x y} {
$w move ball [expr {$x-$::X}] [expr {$y-$::Y}]
set ::X $x; set ::Y $y
}
proc center {w tag} {
foreach {x0 y0 x1 y1} [$w bbox $tag] break
list [expr {($x0+$x1)/2.}] [expr {($y0+$y1)/2.}]
}
proc move {w tag dx dy} {
if {abs($dx)<1 && abs($dy)<1} return
foreach {bx by} [center $w ball] break
if {$bx<30 || $bx>210 || $by<10 || $by>270} return
$w move $tag $dx $dy
foreach {bx by} [center $w ball] break
foreach goal [$w find withtag goal] {
foreach {x0 y0 x1 y1} [$w bbox $goal] break
if {$bx>$x0 && $bx<$x1 && $by>$y0 && $by<$y1} {
goal $w $goal
return
}
}
after 50 [list move $w $tag [expr {$dx*0.8}] [expr {$dy*0.8}]]
}
proc goal {w tag} {
incr ::n$tag
foreach i {1 2 3} {
$w itemconfig $tag -fill white -stipple {}
update
after 100
$w itemconfig $tag -fill black -stipple {}
update
after 100
}
$w itemconfig $tag -fill red -stipple gray25
}
bind . <Escape> {exec wish $argv0 &; exit}NEM: Nice! 5-a-side might be better for the little screen. Could make a nice test-bed for software RoboCup [1] implementations.RS just added goal detection and counting :) - fixed distance measurement to use hypot().
JM Richard, I knew you would not resist the temptation to write some soccer little toy... good luck Germany !
[unperson] Yes good luck Brazil! :-) What in the world is the algorithm for these soccer, hockey games on Nintendo and on Windows? Do they operate on the basis of a section? If the ball is in a section, player A assigned to the section rushes and kicks the ball? Anyone knows how this thing works in terms of algorithm?

