Vier Gewinnt als Perl-Golf
Spielen Sie 4gewinnt gegen Ihren Perl-Interpreter!
- - - - - - - - - - - - - - - - - - - - - - - - X - - - - - O X - - - - - X O O - - 1 2 3 4 5 6 7
In folgendem Skript habe ich den Neg(a)max-Algorithmus verbaut. Als Bewertungsfunktion kommt eine einfache Punktvergabefunktion zum Einsatz. Das Skript spielt überaschend gut und man muss schon einiges an Übung haben, um zu gewinnen.
#!/usr/bin/perl
#4gewinnt,p.krusenotto 2005
@f=(0)x42;$M=9999;@S[1,2,3,5,10,15]=(1,9,99,-1,-9,-99);sub p{for$y(0..5){print{
1=>'O',5=>'X',0=>'-'}->{$f[$y*7+$_]},' 'for(0..6);print"\n";}print
"1 2 3 4 5 6 7\n";}sub d{($p,$c)=@_;$c+=7while($c<42&&!$f[$c]);next if$c<7;$f
[$c-7]=$p;$c-7;}sub e{($o,$d)=@_;$S=0;for(0..3,7..10,14..17,21..24,
28..31,35..38){$Z=$f[$_+3]+$f[$_+2]+$f[$_+1]+$f[$_];return-$M-$d if$Z==4*$o;$S
+=$S[$Z];}for(0..20){$Z=$f[$_]+$f[$_+7]+$f[$_+14]+$f[$_+21];return-$M-$d if$Z==
4*$o;$S+=$S[$Z];}for(0..3,7..10,14..17){$Z=$f[$_]+$f[$_+8]+$f[$_+16]+$f[$_+24];
return-$M-$d if$Z==4*$o;$S+=$S[$Z];}for(3..6,10..13,17..20){$Z=$f[$_]+$f[$_+6]+
$f[$_+12]+$f[$_+18];return-$M-$d if$Z==4*$o;$S+=$S[$Z];}$o!=1?$S:-$S;}sub a{my(
$c,$a,$b,$D)=@_;my$S=e(6-$c,$D);return$S if!$D||abs($S)>999;my$B;for(0..6){next
if$f[$_];my$j=d $c,$_;my($s)=a(6-$c,-$b,-$a,$D-1);$s=-$s;$f[$j]=0;if($s>$a){$a
=$s;$B=$_;}last if$a>=$b;}($a,$B);}while(1){p;last if abs(e 5)>$M/9;$m=<>;d 1
,$m-1;last if abs(e 1)>$M/9;($v,$m)=a 5,-$M,$M,6;d 5,$m;}