Benutzer:Rorkhete/Spielzeug

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Schachdiagramme maschinell erzeugen

[Bearbeiten | Quelltext bearbeiten]

Womit man sich das unten sparen kann ;)

Version vom 5. Juni 2006

[Bearbeiten | Quelltext bearbeiten]

Ein Perl-Skript, das aus der Forsyth-Edwards-Notation (FEN) die hiesigen Schachdiagramme (siehe auch Vorlage:Schachbrett/Doku) erzeugt.

  • Die Freeware-Programme Scid oder xboard speichern Positionen in FEN.
  • Die Grundstellung im Schach in FEN:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 
  • Es wird nur die "1. Gruppe" (siehe FEN) verarbeitet.
  • Getestet unter Unix/Linux, müsste auch unter Windows laufen (dazu in die erste Zeile des Codes den Pfad zu "perl.exe" anpassen). Eingabe auf der Kommandozeile:
perl 'Perl-Datei' 'FEN-Datei' oder unter Windows C:\"Pfad_zu_perl.exe"\perl.exe 'Perl-Datei' 'FEN-Datei'

Wobei der Quellcode in der 'Perl-Datei' steht, und eine beliebige Anzahl von FEN-Positionen in der 'FEN-Datei', zeilenweise voneinander abgetrennt. Die Diagramme werden auf die Standardausgabe geschrieben, gewünschte Umlenkung durch " > Dateiname " möglich.

Wichtig: Nutzung auf eigene Gefahr. Vor dem Kopieren evtl. Versionen/Autoren checken, falls Spitzbuben am Werk (= Skriptcode) waren.

#!/usr/bin/perl

# Für Windows: erste Zeile ersetzen durch z.B. #!C:\"Pfad_zu_perl.exe"\perl.exe

use strict;

my $chess2_header = "{{Schachbrett|=\n| tright\n|\n|=\n";
my $chess2_empty = '  |';
my $chess2_footer = "   a  b  c  d  e  f  g  h\n\n|\n}}\n";

my $chess1_line = '(?:[rnbqkp1-8]{1,8})';

# read input files containing positions linewise
while (<>) {
	if (m@^((?:$chess1_line/){7,7}$chess1_line)@i) {
	
		my $chess1_pos = $1;
		print &translate ($chess1_pos);
	}
}

# translate
sub translate {
	
	my ($pos1) = @_;
	my $pos2 = $chess2_header;
	my $line_no = 8;	
	$pos1 .= '/';
	while ($pos1 =~ s@^([^/]*)/@@) {
		my $line = $1;
		$pos2 .= " $line_no |";
		$line_no--;
		my $field_no = 0;
		while ($line =~ s@(.)@@){
			my $field = $1;
			if ($field =~ m@\d@) {
				$field_no += $field;
				$pos2 .= ${chess2_empty}x$field;
			}
			elsif ($field =~ m@[PRNBQK]@)	{
				$field_no++;
				$field =~ tr@A-Z@a-z@;
				$field .= 'l';
				$pos2 .= "$field|";
			}
			elsif ($field =~ m@[prnbqk]@)	{
				$field_no++;
				$field .= 'd';
				$pos2 .= "$field|";
			}
			else {
				print STDERR "undefined char $field\n";
			}
		}
		if ($field_no == 8) {
			$pos2 .= "=\n";
		} else {
			print STDERR "wrong number of fields\n";
			return 0;
		}
	}
	if ($line_no == 0) {
		$pos2 .= $chess2_footer;
		return $pos2;
	} else {
		print STDERR "wrong number of lines\n";
		return 0;
	}
}