From 6958c3826f9f0587d2e2071c9370eb0e87a6d167 Mon Sep 17 00:00:00 2001 From: realraum Date: Sun, 3 Jul 2011 21:04:33 +0000 Subject: [PATCH] added cricket based on framework --- dart/Dart.pm | 20 +++++++++- dart/dart-cricket.pl | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 2 deletions(-) create mode 100755 dart/dart-cricket.pl diff --git a/dart/Dart.pm b/dart/Dart.pm index 9f5fd3c..bf501cb 100644 --- a/dart/Dart.pm +++ b/dart/Dart.pm @@ -26,7 +26,7 @@ sub new $self->{round}=1; $self->{max_shoots_per_player}=3; $self->{current_shoot_count}=0; - + $self->{callbacks}=$params{callbacks}; $self->callback('init'); return $self; } @@ -105,6 +105,20 @@ sub shout print $fh "$what\n"; } +sub get_current_player +{ + my $self=shift; + return $self->get_player($self->{current_player}); +} + +sub get_player +{ + my $self=shift; + my ($player_idx)=@_; + die if $player_idx < 0 or $player_idx >= $self->{player_count}; + return $self->{player}[$player_idx]; +} + sub next_player { my $self=shift; @@ -112,7 +126,7 @@ sub next_player $self->{current_shoot_count}=0; ($self->{current_player},my $new_round)=get_next_active_player($self->{current_player}); $self->shout("player"); - $self->shout($self->{player}[$self->{current_player}]{name}); + $self->shout($self->get_current_player()->{name}); $self->next_round() if $new_round; return $self->callback('next_player'); } @@ -174,3 +188,5 @@ sub create_player #my $player = {%player_attributes}; #return $player; } + +1; diff --git a/dart/dart-cricket.pl b/dart/dart-cricket.pl new file mode 100755 index 0000000..b026b04 --- /dev/null +++ b/dart/dart-cricket.pl @@ -0,0 +1,107 @@ +#!/usr/bin/perl +# use strict; +use Dart; + + + +$|=1; +my (@player) = @ARGV; + +my $dart = new Dart(player_names=>\@player, + callbacks => { + shoot=>\&shoot, + next_player=>\&next_player, + } + ); +exit $dart->run(STDIN,STDOUT); + +### =============================== + +my $sieb =1; # Spielmodus Zahlensieb +sub gueltig +{ + my ($zahl,$mult) = @_; + return $zahl>1; +} + +sub shoot +{ + my $self=shift; + my ($mult,$zahl)=@_; + $self->get_current_player()->{score} = {} if not $self->get_current_player()->{score}; + my $score=$self->get_current_player()->{score}; + + if (not gueltig($zahl,$mult)) + { + $self->shout("miss"); + return; + } + my ($scho,$scored,$self_scored); + while($mult--) + { + + if ($score->{$zahl}<3) + { + $score->{$zahl}++; + $self_scored++; + if ($sieb && ($score->{$zahl} == 3)) + { + for my $count (2..21) + { + $count = 25 if $count ==21; + if ( ($count % $zahl) == 0) + { + $score->{$count} = 3; + } + } + } + } else { + $scho++; + for my $player_idx (0..($self->{player_count}-1)) + { + next if not $self->get_player($player_idx)->{active}; + if ($self->get_player($player_idx)->{score}->{$zahl}<3) + { + $self->get_player($player_idx)->{score}->{0}+=$zahl; + $scored++; + } + } + } + } + $self->shout_last_shoot() if ($scored || $self_scored); + $self->shout("scored") if $scored; + $self->shout("scho") if $scho && not $scored; + &print_score($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}; + 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}; + } + print STDERR "\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})); + } + print STDERR "\n"; + } + for my $player_idx (0..($self->{player_count}-1)) + { + printf STDERR ("%3d\t", $self->get_player($player_idx)->{score}->{0}); + } +} -- 1.7.10.4