added schiffe versenken, non working
authorOthmar Gsenger <otti@realraum.at>
Mon, 4 Jul 2011 21:17:47 +0000 (21:17 +0000)
committerOthmar Gsenger <otti@realraum.at>
Mon, 4 Jul 2011 21:17:47 +0000 (21:17 +0000)
dart/dart-schiffe.pl [new file with mode: 0755]

diff --git a/dart/dart-schiffe.pl b/dart/dart-schiffe.pl
new file mode 100755 (executable)
index 0000000..9b72464
--- /dev/null
@@ -0,0 +1,152 @@
+#!/usr/bin/perl
+use strict;
+use Dart;
+
+our @x= qw/ 20 1 18 4 13 6 10 15 2 17 /;
+our @y = qw/ 3 19 7 16 8 11 14 9 12 5 /;
+our %x = array_to_hash(@x);
+our %y = array_to_hash(@y);
+our @schiffe = reverse sort qw/ 3 4 5 /;
+
+$|=1;
+my (@player) = @ARGV;
+
+
+my $dart = new Dart(player_names=>\@player, 
+                    callbacks => {
+                      shoot=>\&shoot,   
+                      before_shoot=>\&print_score,
+                      init=>\&init,
+                    }
+                  );
+exit $dart->run();
+
+sub array_to_hash
+{
+  my @array;
+  my %hash;
+  for my $key (@array)
+  {
+    $hash{$key}=1;
+  }
+  return %hash;
+}
+
+### ===============================
+
+sub init
+{
+  my $self=shift;
+  for my $player_idx (0..($self->{player_count}-1))
+  {
+    $self->get_player($player_idx)->{sel_x}=0;
+    $self->get_player($player_idx)->{sel_y}=0;
+    for my $x (@x)
+    {
+      for my $y (@y)
+      {
+        $self->get_player($player_idx)->{score}->{$x}{$y}=0;
+      }
+    }
+    for my $schiff (@schiffe)
+    {
+      my $valid=0;
+      while(not $valid)
+      {
+        my $x_start_idx = int(rand(scalar @x));
+        my $y_start_idx = int(rand(scalar @y));
+        my $direction = int(rand(2));
+        my $x_stop_idx = $x_start_idx + $schiff * $direction;
+        my $y_stop_idx = $y_start_idx + $schiff * (1-$direction);
+        next if ($x_stop_idx > $#x) or ($y_stop_idx > $#y);
+        for my $x_idx ($x_start_idx..$x_stop_idx)
+        {
+          for my $y_idx ($y_start_idx .. $y_stop_idx)
+          {
+            next if $self->get_player($player_idx)->{score}->{$x[$x_idx]}{$y[$y_idx]};
+          }
+        }
+        for my $x_idx ($x_start_idx..$x_stop_idx)
+        {
+          for my $y_idx ($y_start_idx .. $y_stop_idx)
+          {
+            $self->get_player($player_idx)->{score}->{$x[$x_idx]}{$y[$y_idx]}="s";
+          }
+        }
+        $valid=1;
+      }
+    }
+  }
+}
+
+sub win_condition
+{
+  my ($self) = @_;
+  for my $x (@x)
+  {
+    for my $y (@y)
+    {
+      return if $self->get_current_player()->{score}->{$x}{$y} eq 's';
+    }
+  }
+  return 1;
+}
+
+sub shoot
+{
+  my $self=shift;
+  my ($mult,$zahl)=@_;
+  my $player=$self->get_current_player();
+
+  if ( (not $x{$zahl}) and (not $y{$zahl}) )
+  {
+    $self->shout("miss");
+    return;
+  } elsif ($x{$zahl}) { 
+    $player->{sel_x}=$zahl;
+  } elsif ($y{$zahl}) { 
+    $player->{sel_y}=$zahl;
+  }
+  $self->shout_last_shoot();
+  if ($player->{sel_x} && $player->{sel_y})
+  {
+    my $x = $player->{sel_x};
+    my $y = $player->{sel_y};
+    $player->{sel_x}=0;
+    $player->{sel_y}=0;
+    if ($player->{score}->{$x}{$y} eq 's')
+    {
+      $self->shout("scored");
+      $player->{score}->{$x}{$y} = 'X';
+    } elsif (not $player->{score}->{$x}{$y}) {  
+      $player->{score}->{$x}{$y} = 'o';
+      $self->shout("scho");
+    }
+  }
+  $self->win() if &win_condition($self);
+}
+
+sub print_score
+{
+  my ($self)=@_;
+  printf STDERR "Runde\t%d\n\n",$self->{round};
+  printf STDERR "Player\t%s\n\n",$self->get_current_player()->{name};
+  printf STDERR "x\t%d\n",$self->get_current_player()->{sel_x};
+  printf STDERR "y\t%d\n",$self->get_current_player()->{sel_y};
+
+    for my $x (@x)
+    {
+      for my $y (@y)
+      {
+        my $field = $self->get_current_player()->{score}->{$x}{$y};
+        if ($field eq 'X' or $field eq 'o')
+        {
+          print STDERR $field;
+        } else {
+          print STDERR "?";
+        }
+      }
+      print STDERR "\n";
+    }
+  print STDERR "\n\n";
+}