#!/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("<KeyRelease>", [\&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");
}

