#!/usr/bin/perl use strict; use 5.010; use warnings; do "fun_sub.pl"; die $@ if $@; # ****************** Initialisierung *************** # das Spielfeld my $aa=[ [qw /28 22 15 6 33 1/], [qw / 7 10 32 27 11 14/], [qw /23 18 5 31 9 30/], [qw / 4 36 29 20 16 24/], [qw /13 25 17 3 35 19/], [qw /34 2 26 12 21 8/], ]; # Feldwertigkeit, Prioritaet absteigend my $best = [qw /5 31 20 29 32 27 9 16 3 17 36 18 10 11 35 25 15 6 30 24 12 26 4 23 22 33 14 19 21 2 13 7 28 1 8 34/]; # die Karten my @karten=((1..12)x4,13..19); # feldhash erzeugen my %felder; for (1..36) { $felder{$_} = $_; } #Karten mischen for(@karten) { my $p=int(rand(scalar @karten)); my $k=$_; $_=$karten[$p]; $karten[$p]=$k; } # Kartenpositionen anlegen my $position=&pos; # Karten geben my @chand=splice(@karten,0,4); # Karten Computer my @shand=splice(@karten,0,4); # Karten Spieler # Stand der Gewinnlinien erzeugen our $linien=&aoa($aa,\%felder); # **************** Ende Initialisierung ************* #&testfelder(\%felder); # aus "fun_sub.pl" # ******* Hier beginnt die Spielschleife ******** my $runden=20; my $sieg=''; while ($runden > 0 && !$sieg) { &computer; # computer spielt $linien=&aoa($aa,\%felder); # Sieglinie suchen my $sp='C'; my $za=4; my $li=&sieger($linien,$sp,$za,$best); if (@$li) { $sieg = 'S'; print "Sieg COMPUTER\n" if @$li; } unless ($sieg) { &spieler; # spieler spielt # Stand der Gewinnlinien erzeugen $linien=&aoa($aa,\%felder); # Sieglinie suchen $sp='M'; # $za=4; $li=&sieger($linien,$sp,$za,$best); if (@$li) { $sieg = 'S'; print "Sieg SPIELER\n" if @$li; } } $runden--; print "*** Noch $runden Runden ***\n\n" } &spielfeld($aa,\%felder);print "\n"; # *********** Hier endet das Spiel ************** sub computer { # computer spielt my (@prio,$fr,$li,$sp,$za,$su); # @prio erhaelt Prioritaeten des Setzens # freie 3C-Felder (Sieg möglich!) auflisten $sp=qr/C/; $za=3; $li=&felder($linien,$sp,$za); $su = qr/\d+$/; $fr=&listen($su,$li,$best); #print "Frei 3-C: @$fr\n"; push @prio, @$fr; # alle 3M-Felder (Sieg Gegner möglich!) auflisten $sp=qr/M/; $za=3; $li=&felder($linien,$sp,$za); push @prio, @$li; # freie 2C-Felder auflisten $sp=qr/C/; $za=2; $li=&felder($linien,$sp,$za); #$su = qr/\d+$/; $fr=&listen($su,$li,$best); #print "Frei 2-C: @$fr\n"; push @prio, @$fr; # freie 1C-Felder auflisten $za=1; # $sp=qr/C/; $li=&felder($linien,$sp,$za); #$su = qr/\d+$/; $fr=&listen($su,$li,$best); #print "Frei 1-C: @$fr\n"; push @prio, @$fr; # mit C belegte 3C-Felder auflisten $za=3; # $sp=qr/C/; $li=&felder($linien,$sp,$za); $su = qr/C/; $fr=&listen($su,$li,$best); #print "Belegt 3-C: @$fr\n"; push @prio, @$fr; # mit C belegte 2C-Felder auflisten $za=2; # $sp=qr/C/; $li=&felder($linien,$sp,$za); # $su = qr/C/; $fr=&listen($su,$li,$best); #print "Belegt 2-C: @$fr\n"; push @prio, @$fr; # +++ Prioliste aufbereiten +++ # Markierungen entfernen (M,C,G) for (@prio) {s/[C,G,M]+//} # @best an @prio anhaengen, # um alle 36 Felder zu erfassen push @prio, @$best; # Doubletten entfernen @prio=@{&double(@prio)}; # jetzt setzen my $compchance=&chancen($position,\@chand,\%felder); print "Computer spielt mit @chand\n"; #print "Computer hat @$compchance\n"; #print "Best ist @$best\n"; #print "Computer hat Prio @prio\n"; # setzfeld holen my $um; @prio=reverse @prio; for (@prio) { for my $u (@$compchance) { $um=$_ if ($_==$u) } } print "COMPUTER setzt auf $felder{$um}\n"; # jetzt setzen im Hash &setzenall($um,\%felder,'C'); # Karten ablegen und aufnehmen &newcard($position,\@chand,$um,\@karten); } # end sub computer sub spieler { # spieler spielt &spielfeld($aa,\%felder); print "\n"; my $spchance=&chancen($position,\@shand,\%felder); # setzfeld holen my $erg=&setz($spchance,\@shand); print "SPIELER setzt auf $erg\n"; # jetzt setzen im Hash &setzenall($erg,\%felder,'M'); print "\n"; #print "Spieler hatte Karten @shand ...\n"; # Karten ablegen und aufnehmen &newcard($position,\@shand,$erg,\@karten); } # end sub spieler