#!/usr/bin/perl -w use Tk; use strict; my ( $main, $n_digit, $n_blank, @ans, $cur_show, $cur_focus, ); $n_digit = 4; $n_blank = 5; @ans = (); $main = MainWindow->new(); for (my $i = 0; $i < $n_blank; ++$i) { $main->{"e$i"} = $main->Entry(-width=>$n_digit, -takefocus=>0); $main->{"l$i"} = $main->Label(-width=>$n_digit, -bd=>2, -relief=>"ridge"); $main->{"e$i"}->grid($main->{"l$i"}); $main->{"e$i"}->bind("", [\&check, $i]); $ans[$i] = int(rand(exp(log(10)*$n_digit))); } $cur_show = 0; jump(); MainLoop(); #================================================================= sub jump { my ($i, $r); $main->{"l$cur_show"}->configure(-text=>"") unless $main->{"e$cur_show"}->cget(-state) eq "disabled"; $r = int(rand($n_blank)); for ($i=0; $i < $n_blank; ++$i) { $cur_focus = ($i + $r) % $n_blank; last unless $main->{"e$cur_focus"}->cget(-state) eq "disabled"; } if ($i >= $n_blank) { print "congratulations!\n"; exit; } $main->{"e$cur_focus"}->focus(); $r = int(rand($n_blank)); for ($i=0; $i < $n_blank; ++$i) { $cur_show = ($i + $r) % $n_blank; last unless $main->{"e$cur_show"}->cget(-state) eq "disabled"; } $main->{"l$cur_show"}->configure(-text=>$ans[$cur_show]); $main->after(2000, \&jump); } sub check { my ($w, $i) = @_; return unless $main->{"e$i"}->get() eq $ans[$i]; $main->{"l$i"}->configure(-bg=>"red", -text=>$ans[$i]); $main->{"e$i"}->configure(-bg=>"red", -state=>"disabled"); }