From 0e5aa9dd0b200a8bd5d9b886debfd9b44c451b0f Mon Sep 17 00:00:00 2001 From: realraum Date: Fri, 11 Nov 2011 21:17:29 +0000 Subject: [PATCH] added rot/blau dart --- dart/Dart.pm | 12 ++++++++ dart/dart-red-101.pl | 1 + dart/dart-red-x01.pl | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 120000 dart/dart-red-101.pl create mode 100755 dart/dart-red-x01.pl diff --git a/dart/Dart.pm b/dart/Dart.pm index cb654bd..d9b3795 100644 --- a/dart/Dart.pm +++ b/dart/Dart.pm @@ -25,6 +25,18 @@ sub new } +sub get_color +{ + my $self=shift; + my ($mul,$zahl)=@_; + my @zahlen = qw/20 1 18 4 13 6 10 15 2 17 3 19 7 16 8 11 14 9 12 5/; + my $counter=0; + $counter++ while($zahl != shift @zahlen and @zahlen); + $mul=0 if $mul >1; + my $result = ($counter+$mul )%2; + return $result; +} + sub init { my $self=shift; diff --git a/dart/dart-red-101.pl b/dart/dart-red-101.pl new file mode 120000 index 0000000..eb00505 --- /dev/null +++ b/dart/dart-red-101.pl @@ -0,0 +1 @@ +dart-red-x01.pl \ No newline at end of file diff --git a/dart/dart-red-x01.pl b/dart/dart-red-x01.pl new file mode 100755 index 0000000..56b4cb2 --- /dev/null +++ b/dart/dart-red-x01.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl +use strict; +use Dart; + +$|=1; +my $maxScore = $0; +$maxScore =~ s/.*\-(\d+).pl$/\1/; +my (@player) = @ARGV; + +my $dart = new Dart(player_names=>\@player, + callbacks => { + shoot=>\&shoot, + next_player=>\&next_player, + before_shoot=>\&print_score, + init=>\&init, + } + ); +exit $dart->run(); + +### =============================== + +sub init +{ + my $self=shift; + + for my $player_idx (0..($self->{player_count}-1)) + { + $self->get_player($player_idx)->{score} = $maxScore; + } +} + +sub win_condition +{ + my ($self) = @_; + return $self->get_current_player()->{score} == 0; +} + +sub shoot +{ + my $self=shift; + my ($mult,$zahl)=@_; + my $color = $self->get_color($mult,$zahl)?1:-1; + if ($self->get_current_player()->{score} >= $mult * $zahl) + { + $self->get_current_player()->{score} -= $color *$mult * $zahl; + $self->shout_last_shoot(); + $self->win() if &win_condition($self); + } + else + { + $self->shout("miss"); + $self->get_current_player()->{score} = $self->get_current_player()->{last_score}; + $self->finish_player_round(); + } +} + +sub next_player +{ + my $self=shift; + $self->get_current_player()->{last_score} = $self->get_current_player()->{score}; +} + +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 $player_idx (0..($self->{player_count}-1)) + { + printf STDERR "%s\t", $self->get_player($player_idx)->{score}; + } + print STDERR "\n"; +} -- 1.7.10.4