$|=1;
-my (@player) = @ARGV;
+my ($shout_fifo, @player) = @ARGV;
my $dart = new Dart(player_names=>\@player,
+ shout_fifo=>$shout_fifo,
callbacks => {
shoot=>\&shoot,
next_player=>\&next_player,
+ before_shoot=>\&print_score,
+ init=>\&init,
}
);
exit $dart->run();
return $zahl>1;
}
+sub init
+{
+ my $self=shift;
+ for my $i (0..21)
+ {
+ for my $player_idx (0..($self->{player_count}-1))
+ {
+ my $zahl = $i>20?25:$i;
+ next if $zahl > 0 and not gueltig($zahl);
+ $self->get_player($player_idx)->{score}->{$zahl}=0;
+ }
+ }
+}
+
+sub win_condition
+{
+ my ($self) = @_;
+ for my $i (keys %{$self->get_current_player()->{score}})
+ {
+ next if not $i;
+ return if $self->get_current_player()->{score}->{$i}<3;
+ }
+ my $score = $self->get_current_player()->{score}->{0};
+ for my $player_idx (0..($self->{player_count}-1))
+ {
+ next if not $self->get_player($player_idx)->{active};
+ return if $score > $self->get_player($player_idx)->{score}->{0};
+ }
+ return 1;
+}
+
sub shoot
{
my $self=shift;
$self->shout_last_shoot() if ($scored || $self_scored);
$self->shout("scored") if $scored;
$self->shout("scho") if $scho && not $scored;
- &print_score($self);
+ $self->win() if &win_condition($self);
}
sub next_player
{
my $self=shift;
- &print_score($self);
}
sub print_score
{
my ($self)=@_;
- printf STDERR "\n\n";
- printf STDERR "Runde\t%d\n\n",$self->{round};
+ printf "\n\n";
+ printf "Runde\t%d\n\n",$self->{round};
for my $player_idx (0..($self->{player_count}-1))
{
- printf STDERR "%s\t", ($player_idx == $self->{current_player})?"(".$self->get_player($player_idx)->{name}.")":$self->get_player($player_idx)->{name};
+ printf "%s\t", ($player_idx == $self->{current_player})?"(".$self->get_player($player_idx)->{name}.")":$self->get_player($player_idx)->{name};
}
- print STDERR "\n";
+ print "\n";
for my $i (1..21)
{
for my $player_idx (0..($self->{player_count}-1))
{
my $zahl = $i>20?25:$i;
next if not gueltig($zahl);
- printf STDERR ("%2d %s ",$zahl, '#' x $self->get_player($player_idx)->{score}->{$zahl}. '-' x (3-$self->get_player($player_idx)->{score}->{$zahl}));
+ printf ("%2d %s ",$zahl, '#' x $self->get_player($player_idx)->{score}->{$zahl}. '-' x (3-$self->get_player($player_idx)->{score}->{$zahl}));
}
- print STDERR "\n";
+ print "\n";
}
for my $player_idx (0..($self->{player_count}-1))
{
- printf STDERR ("%3d\t", $self->get_player($player_idx)->{score}->{0});
+ printf ("%3d\t", $self->get_player($player_idx)->{score}->{0});
}
}