# fen2diag.pl - FEN chess position to 8x8 chess diagram # # DrDave chessnut at blueyonder.co.uk # # V2 10x10 grid suitable for Alpine fonts Linares/Hastings/Zurich # sub Reset { @ranks = ""; # $fenfile = ""; # $fenstring = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; $fenstring = ""; $fenchar = ""; # $targetfile = ""; $ranks[0]="cuuuuuuuuC\n"; $ranks[1]="(wdwdwdwd}\n"; $ranks[2]="7dwdwdwdw}\n"; $ranks[3]="6wdwdwdwd}\n"; $ranks[4]="5dwdwdwdw}\n"; $ranks[5]="&wdwdwdwd}\n"; $ranks[6]="3dwdwdwdw}\n"; $ranks[7]="2wdwdwdwd}\n"; $ranks[8]="%dwdwdwdw}\n"; $ranks[9]="v,./9EFJMV\n"; $colour = ""; $coloured = ""; $fileno = 1; $rankno = 1; $line = ""; # print "Target FEN string=$fenstring\n"; $messages = 0; $char = ""; # print "1st: " . substr($ranks[$rankno], $fileno, 1) ; } sub Message { if ($messages == 1) { my (@message) = @_ ; print "I say: @message\n"; } } sub LetMeOutOfHere { my @lastgasp = @_ ; print "Quitting programme: @lastgasp \n"; die ; } sub FlipSquareColour { Message ("sub: FlipSquareColour"); Message("Square before = $colour"); $coloured = $colour ; if ($coloured =~ "w") { $colour = "d"; } if ($coloured =~ "d") { $colour = "w"; } Message("Square after = $colour"); } sub FlipPieceColour { Message("sub: FlipPieceColour"); Message ("Piece before: $piece") ; if ($piece =~ "w") { $piece = "d" ; } if ($piece =~ "p") { $piece = "0" ; } if ($piece =~ "r") { $piece = "4" ; } if ($piece =~ "n") { $piece = "h" ; } if ($piece =~ "b") { $piece = "g" ; } if ($piece =~ "q") { $piece = "1" ; } if ($piece =~ "k") { $piece = "i" ; } if ($piece =~ "P") { $piece = ")" ; } if ($piece =~ "R") { $piece = "\$" ; } if ($piece =~ "N") { $piece = "H" ; } if ($piece =~ "B") { $piece = "G" ; } if ($piece =~ "Q") { $piece = "\!" ; } if ($piece =~ "K") { $piece = "I" ; } Message ("Piece after: $piece") ; } sub PrintDiagram { Message("sub:PrintDiagram"); print "Diagram:\n"; print (@ranks) ; # for ($ranknos=0 ; $ranknos < 9 ; $ranknos++ ) { # print "$ranks[$rankno]\n"; # } return; } #sub ReadFile; # Message("sub:ReadFile"); # read $fenfile; # split ($line, \",99); # @Field = split(' ', $line, 99); # $key = substr($Field[4], 6, 4); # $fenstring = $line[1]; # open (FD1, $datafile); # open (FD2, "> pcg$target.dat"); sub Piece { Message("rankno=$rankno, fileno=$fileno, FENchar2=$fenchar"); $colour = "w"; $piece=$colour; if ( $fenchar > 0 ) { $fileno = $fileno+$fenchar-1 ; } else { $piece="$fenchar" ; } if (($rankno + $fileno) % 2 == 0) { $colour = "w" ; } else { $colour="d"; } if ( $colour =~ "d" ) { FlipPieceColour ; } # print "$rankno\t$fileno\tBefore: " . substr($ranks[$rankno], $fileno, 1) . "\t"; substr($ranks[$rankno], $fileno, 1) = "$piece" ; # print "After: " . substr($ranks[$rankno], $fileno, 1) . "\n"; } sub MakeGrid { Message("sub:MakeGrid"); for ($char = 0 ; $char < length($fenstring) ; $char++ ) { $fenchar = substr($fenstring, $char, 1); Message("FENchar=$fenchar"); if ( $fenchar =~ "/" ) { $rankno++ ; $fileno = 0 ; } else { Piece; } $fileno++; if ($fenchar =~ " ") { Message ("Hit a space! Adding side-to-move"); substr($ranks[8], 9, 1) = "}"; $char++; $fenchar = substr($fenstring, $char, 1); if ($fenchar =~ "w") { substr($ranks[8], 9, 3) = "}a\n"; return; } if ($fenchar =~ "b") { substr($ranks[1], 9, 3) = "}e\n"; return; } } } } sub Work { Message("Making Grid..."); MakeGrid; Message("Printing Diagram..."); PrintDiagram; } sub GetFEN { print "FEN string? ="; chop ($fenstring = ); Message("Checking for quit"); Message("FEN string = $fenstring"); if ($fenstring eq 'N' || $fenstring eq 'n') { LetMeOutOfHere ("Ended at user's request."); } Message("Very good, carry on"); } print "\n"; print "FEN2DIAG chess position converter\n"; print "=================================\n"; print "N.B. To proceed, type or paste in FEN; to quit, press N or n\n"; print "\n"; for ($i = 0; $i < 1000 ; $i++ ) { Reset; GetFEN; Work; }