Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Schach:Übertragungsproblem?!

  Alt 19. Mai 2007, 14:04
Hi und erstmal Herzlich Willkommen in der DP

Zitat von SteffDaChef:
Ich weiß, ein Noob sollte kein Schach programmieren.
Sagt jetzt wer? Du wirst nur (vielleicht) mehr Zeit brauchen und wahrscheinlich auch etwas mehr Lernen als ein "nicht-Noob", aber das ist ja nicht das Schlimmste!

Zitat von SteffDaChef:
Bei einer Abfrage, ob der schwarze Bauer1 auf ein Feld springen darf, wollte ich kontrollieren, dass er nicht auf Felder geht, auf denen schon schwarze Figuren stehen. Und bei diser Kontrolle läuft was falsch. Er liefert nur eine Message (Ungültiger Zug) für x=A-H und y=7, obwohl die schwarzen Figuren auf x=A-H und y=1-2 stehen. Ich habe mal mein Programm hochgeladen, dass ihr euch einen Überblick verschaffen könnt.
An sich ist das nicht gerade der schönste Weg! Das hier ist nur ein Forum, dass Dir Hilfestellungen gibt, gerade wenn Du wenig Zeit hast, solltest Du lieber so viel Informationen mitgeben, wie Du kannst, denn sonst weiß keiner, wo genau er helfen soll/kann. Eine fertige Lösung wirst Du kaum bekommen (das verbieten ja schon die Forenregeln).
Jedenfalls ist es selten gern gesehen, das man nur Code postet und sagt "schaut mal". Schöner ist es wenn
  1. Der Code überhaupt kommentiert ist
  2. Du ein wenig zu dem Code sagst (ggf. den relevanten Ausschnitt postest)
  3. Du erläuterst was Du schon probiert hast / warum wie machst und woran Du gescheitert bist

Wie gesagt, Dein Code ist leider gar nicht kommentiert. An sich führt man übrigens Konstanten ein, damit Du eben nicht irgendwelche Zahlen verwenden musst. Wenn Du 112 schreibst, wird keiner Wissen, dass Du hier einen weißen Bauern meinst! Schreibst Du aber BAUER_WEIß (was eine Konstante mit dem Wert 112 ist), wird man doch eher wissen was Du machen möchtest. An sich kannst Du auch gänzlich auf Zahlen verzichten, sowas macht Delphi für Dich automatisch, wenn Du Aufzählungstypen verwendest. Diese werden einfach mit dem Schlüsselwort type erstellt und haben die Form:
Delphi-Quellcode:
type
  TSchachfigur = (sfBauer, sfSpringer, sfLaeufer, sfTurm, sfDame, sfKoenig);
Jetzt kannst Du diesen Datentyp wie andere Variablentypen verwenden. Delphi speichert die intern dann zwar auch als Zahlen ab, aber für Dich bleibt das Transparent, Du kannst also schreiben:

Delphi-Quellcode:
var figur: TSchachfigur;
begin
  figur := sfDame;
Ist viel leichter lesbar als das mit den Zahlen. Jetzt hast Du natürlich das Problem, dass es 8 Bauern, je 2 Türme, Springer, Läufer, 1 Koenig und 1 Dame pro Farbe gibt. Mit einer Variable ist es also nicht getan. Das was Du als erstes als Zusatzinformation brauchst ist die Farbe. Auch hier kannst Du einfach einen Aufzählungstypen erstellen:
  TFarbe = (weiss, schwarz); Jetzt brauchst Du noch einen Datentypen, der diese Information (Schachfigur und Farbe) in einem Typen zusammenfässt. Hier verwendet man Verbundtypen, die über das Schlüsselwort record eingeleitet werden. Diese setzen sich aus mehreren Datentypen zusammen und werden mit einem end; beendet. In diesem Fall hätte der Typ die Form
Delphi-Quellcode:
  TSpielfigur = record
    figur: TSchachfigur;
    farbe: TFarbe;
  end;
Ich gehe einfach mal davon aus, dass ihr die schon verwendet habt und gehe nicht näher auf den Typen ein. Wie bereits gesagt, gibt es jetzt mehr als eine Figur. Du kannst jetzt also 16 Variablen pro Farbe anlegen und für jede Figur Speichern auf welchem Feld sie sich befindet. Oder Du überlegst, ob es eine gute Alternative gibt. Da Du ohnehin ein Spielfeld hast, kannst Du natürlich auch einfach das machen, was Du schon mit Deinen Zahlen gemacht hast, Du speicherst im Spielfeld, was für eine Figur sich auf welcher Position befindet. Statt einem Array[1..8, 1..8] of Byte hast Du dann ein Array[1..8, 1..8] of TSpielfigur. Das belegst Du entsprechend wie gehabt (nur besser lesbar).
Möchtest Du nun eine Figur von einem Feld (x,y) auf ein anderes (x', y') bewegen, so besteht die Gültigkeitsprüfung aus zwei Dingen. Das erste ist, dass Du schauen musst, ob dieser Zug für die Figur überhaupt erlaubt ist. So kann ein Turm natürlich nicht über eine Figur springen, die zwischen ihm und der Zielposition ist oder sich gar diagonal bewegen. Auch kann ein Bauer sich nur im ersten Zug über zwei Felder nach vorne bewegen, danach jedoch nur noch um ein Feld vor oder eben diagonal schlagen. Hast Du also geprüft, ob das Zielfeld überhaupt für die Figur erreichbar ist, musst Du dann noch schauen, ob wenn das Feld belegt ist, die Figur die das Feld belegt schlagbar ist (Dein eigentliches Problem). Dazu musst Du natürlich nur schauen, ob es sich um die andere Farbe handelt, kurz also:
Delphi-Quellcode:
function istSchlagbar(StartX, StartY, ZielX, ZielY: Integer): Boolean;
begin
  result := Spielfeld[StartX, StartY].farbe <> Spielfeld[ZielX, ZielY].farbe;
end;
Gruß Der Unwissende
  Mit Zitat antworten Zitat