Einzelnen Beitrag anzeigen

Der_Unwissende

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

Re: Schach:Übertragungsproblem?!

  Alt 20. Mai 2007, 13:37
Zitat von SteffDaChef:
Nochmals vielen Dank
Nichts zu danken, dafür ist die DP gedacht!

Zitat von SteffDaChef:
Doch nun kann doch in TSpielfigur nur eine Figur und eine Farbe gespeichert werden?! Wie/Wo kann ich dann die Figur und die dazugehörige Farbe ( und vllt auch Koordinate )festlegen.
Denn bei der istSchlagbar-Funktion werden ja Koordinate und Farbe zusammen überprüft. Dazu muss man ja erstmal jeder Figur eine feste Farbe geben.
Die Koordinaten gehen eigentlich schon aus dem Spielfeld hervor. Du hast ja schließlich ein Schachbrett, dass ist einfach nur ein Array[1..8, 1..8] of Irgendwas. Wichtig ist, dass Du Dir hier klar machst, dass Du auch mehr als ein Schachbrett verwalten kannst. Ich meine an dieser Stelle nicht das Ding, dass angezeigt wird, sondern eine Art nicht-sichtbares Brett. Darin kannst Du einfach speichern, auf welchem Feld sich welche Figur befindet. Irgendwas kannst Du also für diese interne Verwaltung durch TSpielfigur ersetzen.
Was Du also immer im Speicher hast ist ein Array[1..8, 1..8] of TSpielfigur. Darin speicherst Du einfach ab, welche Figur sich gerade wo befindet. Am Anfang sind die Positionen klar (eben die Startaufstellung). Wird dann ein Zug gemacht, so bestimmt dieser Zug welche Figur wohin bewegt werden soll. Wenn ich Dein Programm richtig verstanden habe passiert eben das über Koordinaten auf dem Schachbrett (also z.B. A8 nach B9). Um zu prüfen ob der Zug gültig ist kannst Du dann einfach auf dieses interne Schachbrett zugreifen und lässt Dir erstmal die TSpielfigur an der Stelle [1,8] ausgeben. Hier kannst Du nun schauen, ob da überhaupt eine Figur steht (sonst ungültiger Zug), ob wenn da eine Figur steht sie die korrekte Farbe hat (sonst ungültiger Zug) und dann natürlich ob die Zielkoordinate erreicht werden kann (geht nur, wenn keine Figuren im Weg stehen und man nicht eine eigene Figur schlagen müsste). Den Fall, dass dort schon eine Figur steht brauchst Du nicht unbedingt berücksichtigen, Du überschreibst einfach die Figur und das entspricht dem entfernen vom Spielfeld. Natürlich musst Du auch die alte Position der gezogenen Figur wieder als frei markieren! Dann war es das auch schon.

Zitat von SteffDaChef:
2.Wie bekommt man dann noch die Figur aus dem Array?
Wie gesagt, Du überschreibst einfach die alte Position mit der neuen Figur. Alles was geschlagen wird wird einfach überschrieben und an die Startkoordinate der Bewegung schreibst Du, dass sie nun leer ist (die Figur wurde ja woanders hinbewegt).
Wenn also jmd. sagt, er möchte von A8 nach B9 ziehen, dann würdest Du etwas machen wie:

Delphi-Quellcode:
begin
  // prüfen ob das Feld belegt ist
  if isEmpty(Spielfeld[A, 8]) then
  begin
    ungültigerZug;
  end;

  // prüfen ob die Farbe ok ist!
  if not Spielfeld[A, 8].Farbe = aktuelleFarbe then
  begin
    ungültigerZug;
  end;

  // prüfen ob Spielfigur im Weg ist
  if not canMove(A, 8, B, 9) then
  begin
    ungültigerZug;
  end;

  // prüfen ob Spielfeld belegt ist
  if not isEmpty(Spielfeld[B,9]) then
  begin
    if Spielfeld[B,9].Farbe = aktuelleFarbe then
    begin
      ungültigerZug;
    end
    else
    begin
      // Schlagen anzeigen
      schlage(B,9);
    end;
  end;

  Spielfeld[B,9] := Spielfeld[A, 8];
  Spielfeld[A, 8] := empty;
end;
Das ganze ist natürlich nur Pseudocode (ok, sehr stark an Delphi angelehnt!). Es soll halt nur eine mögliche Idee zeigen, es wird auch andere Wege geben die funktionieren! An sich würde ich es halt so machen, dass ich mir in einer (globalen) Variable die Farbe merke, die gerade dran ist. Natürlich dürfen nur solche Figuren bewegt werden, die die korrekte Farbe haben und natürlich muss in jedem Zug auch eine Figur bewegt werden. Alle ungültigen Züge rufen hier nur die Funktion ungültierZug auf, wie eine solche Funktion aussieht muss sich jeder selbst überlegen. Wichtig ist, dass wenn ein ungültiger Zug auftritt, Du die restlichen Schritte nicht durchführst (würde hier einfach passieren!). Auch was das Empty angeht, so ist das hier wirklich nur Pseudocode, Du brauchst hier einfach eine bestimmte Markierung für leere Felder (z.B. eine spezielle Spielfigur).


Zitat von SteffDaChef:
Edit:Noch eine Frage. Wenn jetz der Zug funktioniert, wird ja eine Schachfigur auf eine andere verrückt. Die eine Schachfigur wurde dann ja geschalgen und ist weg.
1.Würde die folgende Funktion funktionieren?
case sfBauer1 of
ord(wfBauer1):ImSB1.visible:=false;
ord(wfBauer2):ImSB2.visible:=false;
Nein, diese Funktion würde so nicht funtkionieren. Die Spielfigur sfBauer1 hat zwei Eigenschaften, die kannst Du direkt auf einen bestimmten Wert prüfen, musst aber auch wirklich angeben welche der Eigenschaften Du gerade meinst. Korrekter wäre wohl die Form
Delphi-Quellcode:
  case sfBauer1.Figur of
    wfBauer1 : ...
    wfBauer2 : ...
  end;
 
// oder halt
  case ord(sfBauer1.Figur) of
    ord(wfBauer1) : ...
    ord(wfBauer2) : ...
  end;
Der erste Weg ist natürlich deutlich sinnvoller! Ord würde Dir nur die Zahl hinter so einem Wert zurückgeben, für Dein Schachprogramm wirst Du die aber nie brauchen! Eine Sache aber noch dazu, warum unterscheidest Du denn eigentlich die 8 Bauern als verschiedene Schachfiguren? Ich meine wenn Du die Schachfigur Bauer und seine Farbe hast, dann sollte das doch eigentlich reichen. Du weißt ob man ihn schlagen kann oder nicht, Du weißt wohin Du ihn bewegen kannst, mehr gibt es doch gar nicht, oder? Insbesondere brauchst Du unter TSchachfigur nicht die weißen und schwarzen zu unterscheiden, schließlich verwendest Du später TSpielfigur, dass eben gerade die Eigenschaft Farbe mit bringt. Eine TSpielfigur besteht immer aus sowohl der Farbe als auch der Schachfigur. Das sollte wie gesagt alle Information sein, die Du überhaupt brauchst.
Hier solltest Du Dich einfach stark am realen Spiel orientieren. Hier hat ein Spieler auch nur 8 Bauern, die er kaum einzeln unterscheiden wird. Ich kenne zumindestens keinen, der den gleichen Bauern bewußt immer auf die gleiche Startposition stellt...
  Mit Zitat antworten Zitat