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?