Ich habe mich mal dran gemacht und eine erste Version des Programmes in Pascal geschrieben.
Das Programm ist jedoch noch nicht voll funktionsfähig und nicht optimiert: Erstens findet er nur einen Weg zum Ziel, nicht den kürzesten und zweitens kann es passieren, dass er in einer Endlosschleife von Zügen verbleibt.
Code:
Code:
program Springer;
uses crt;
type pos=array[1..2] of byte;
var start,tmp,ziel:pos;
eingabe_ok:boolean;
i:longint;
function move(position:pos):pos; { Bewegen des Springers }
var new_pos:pos;
begin
{ Zug 01 : 2 hoch, 1 links}
if (position[1]>1) and (position[2]<7) then begin new_pos[1]:=position[1]-1; new_pos[2]:=position[2]+2; end;
{ Zug 02 : 2 hoch, 1 rechts}
if (position[1]<8) and (position[2]<7) then begin new_pos[1]:=position[1]+1; new_pos[2]:=position[2]+2; end;
{ Zug 03 : 1 hoch, 2 rechts }
if (position[1]<7) and (position[2]<8) then begin new_pos[1]:=position[1]+2; new_pos[2]:=position[2]+1; end;
{ Zug 04 : 1 runter, 2 rechts }
if (position[1]<7) and (position[2]>1) then begin new_pos[1]:=position[1]+2; new_pos[2]:=position[2]-1; end;
{ Zug 05 : 2 runter, 1 rechts }
if (position[1]<8) and (position[2]>2) then begin new_pos[1]:=position[1]+1; new_pos[2]:=position[2]-2; end;
{ Zug 06 : 2 runter, 1 links }
if (position[1]>1) and (position[2]>2) then begin new_pos[1]:=position[1]-1; new_pos[2]:=position[2]-2; end;
{ Zug 07 : 1 runter, 2 links }
if (position[1]>2) and (position[2]>1) then begin new_pos[1]:=position[1]-2; new_pos[2]:=position[2]-1; end;
{ Zug 08 : 1 hoch, 2 links }
if (position[1]>2) and (position[2]<8) then begin new_pos[1]:=position[1]-2; new_pos[2]:=position[2]+1; end;
move:=new_pos;
end;
begin { Hauptprogramm }
clrscr;
start[1]:=0;
start[2]:=0;
ziel[1]:=0;
ziel[2]:=0;
repeat
{ Annehmen, dass die folgenden Eingaben g?ltig sind }
eingabe_ok:=TRUE;
{ Eingabe der Startposition des Springers }
write('Startposition (horizontal): '); readln(start[1]);
write('Startposition (vertikal): '); readln(start[2]);
{ Eingabe der Zielposition des Springers }
write('Zielposition (horizontal): '); readln(ziel[1]);
write('Zielposition (vertikal): '); readln(ziel[2]);
{ P?fen, ob Eingabe m?glich und ggf. Fehlermeldung}
if (start[1]<1) or (start[1]>8) then begin writeln('Passen Sie die horiz. Startpos. an!'); eingabe_ok:=FALSE; end;
if (start[2]<1) or (start[2]>8) then begin writeln('Passen Sie die vert. Startpos. an!'); eingabe_ok:=FALSE; end;
if (ziel[1]<1) or (ziel[1]>8) then begin writeln('Passen Sie die horiz. Zielpos. an!'); eingabe_ok:=FALSE; end;
if (ziel[2]<1) or (ziel[1]>8) then begin writeln('Passen Sie die vert. Zielpos. an!'); eingabe_ok:=FALSE; end;
if eingabe_ok=FALSE then writeln('Die Positionen m?ssen Werte zwischen 1 und 8 annehmen.');
until eingabe_ok=TRUE;
{ Bewegen }
i:=0;
tmp:=start;
repeat
tmp:=move(tmp);
i:=i+1;
writeln('Zug nach: H: ',tmp[1],' V: ',tmp[2],' Zug Nr.: ',i);
until (tmp[1]=ziel[1]) and (tmp[2]=ziel[2]);
writeln('Ziel in ',i,' Z?gen erreicht!');
end.
http://cxmedia.ath.cx/div/springer.pas
Binary:
http://cxmedia.ath.cx/div/springer.exe
Erklärung:
0. Prinzip
Das Schachbrett wird durch ein Array der Dimension 2 dargestellt, also quasi zwei Werte pro Variable. Die erste steht für die horizontale Position des Springers, die zweite für die vertikale.
Zum Bewegen wird eine Funktion move aufgerufen, die unter Beachtung der Grenzen des Brettes und den für einen Springer zulässigen Zugmöglichkeiten (genau acht bei "freier Bahn") die neue Position der Figur ausgibt.
Das Problem ist im Moment noch das, dass die Funktion move einfach der Reihe nach die verschiedenen Zugrichtungen durchprobiert, und immer die erst mögliche nimmt. Somit ist das ganze eher ein irres Auf-Dem-Brett-Rumlaufen mit der Hoffnung, irgendwann das Ziel zu treffen, wobei dabei eine Endlosschleife entstehen kann.
Wenn man Start 2,3 und Ziel 4,2 wählt gibt es einen sinnvollen Programverlauf.
1. Eingabe
Das Programm fragt nach der Start- und Zielposition und überprüft die Gültigkeit (Die Werte dürfen nur einen Wert zwischen 1 und 8 annehmen, da die Figur sonst ausserhalb des Brettes stehen würde
).
2. Bewegen
Mittels der Funktion move wird der Springer verschoben. Die neue Position wird immer in der Variablen tmp gespeicht, die zu Beginn mit den Werten von start (der Startposition) gefüttert wird.
Das passiert in einer Schleife, sodass immer weiter gezogen wird.
Die Schleife wird dann verlassen, wenn tmp=ziel ist, also die Figur sich am Ziel befindet.