Announcement

Collapse
No announcement yet.

Figuren auf einem Spielfeld ziehen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Figuren auf einem Spielfeld ziehen

    Hallo,
    vielleicht kann mir jemand helfen.
    Ich möchte eine selbstdefinierte Procedure<BR>
    schreiben ,womit ich figuren auf einem <BR>Schachbrett hin und herziehen kann,<BR>
    Ich bekomm es aber selbst irgendwie nicht hin.<BR>
    Wenn ich z.B. die Figur[2] auf Feld[3] ziehen<BR> will.<BR>
    code:<BR>
    ....<BR>
    var <BR>
    TFigur : array [0..32] of record {Figur 0 ist Null-Figur, für Leere Felder}<BR>
    IsBlack: Boolean;<BR>
    Status: byte; {zb.: Ausgewählt, erobert, steht im Schach,...}
    end;<BR>
    TFeld : array [1..64] of record<BR>
    BlackField: Boolean; <BR>
    Rect: TRect; <BR>

    end;<BR>
    ....<BR>
    procedure TMeinprogramm.Figuren_ziehen( var TFigur;var TFeld);<BR>

    begin

    end;

    Gruß

    Thomas

  • #2
    Hallo Thomas,<BR>
    wenn Du tatsächlich ein Schachspiel implementieren willst, solltest Du das ganze wohl ein bißchen mehr strukturieren. Vor allem die Regelüberprüfung beim Ziehen wird dann durchschaubarer. Vor dem Ziehen sollte also überprüft werden, ob der Zug gültig ist. Das könnte dann so aussehen (s.u.)<BR>
    Außerdem sollte das Spielfeld vielleicht doch als 2D-Array abgespeichert werden.<BR>
    <PRE>
    type TChessFigureType=(null,pawn,rook,bishop,knight,kin g,queen);
    TChessPosition=record row,column:Integer end;
    TChessColor=(black,white);
    TChessState=(active,inCheck,taken);

    TFigure=record
    fType: TChessFigureType;
    fColor: TChessColor;
    fState: TChessState;
    fPosition:TChessPosition
    end;

    TField=Array[1..8,1..8]of TFigure;

    function isValidMove(figure:TFigure; oldPos,newPos:TChessPosition; field:TField):Boolean;
    begin
    result:=false;
    //Regeln für den Zug eines Bauern, Zielfeld leer (gerader Zug)
    if(figure.fType=pawn)and(figure.fColor=black)and(f ield[newPos.row,newPos.column].fType=null)
    and(oldPos.column=newPos.column) //wenn gerade gezogen wird, ist Zielfeld leer und es wird nicht geschlagen;
    and(((oldPos.row=2)and(newPos.row=oldPos.row+2))or (newPos.row=oldPos.row+1)) //schwarzer Bauer darf nur 1 oder 2 Felder in Richtung aufsteigendem Zeilenindex
    then result:=true; //gezogen werden
    if(figure.fType=pawn)and(figure.fColor=white)and(f ield[newPos.row,newPos.column].fType=null)
    and(oldPos.column=newPos.column) //wenn gerade gezogen wird, ist Zielfeld leer und es wird nicht geschlagen;
    and(((oldPos.row=7)and(newPos.row=oldPos.row-2))or(newPos.row=oldPos.row-1)) //weißer Bauer darf nur 1 oder 2 Felder in Richtung absteigendem Zeilenindex
    then result:=true; //gezogen werden
    //Regeln für den Zug eines Bauern, Zielfeld von gegnerischer Farbe besetzt (Schlagen, schräger Zug)
    if(figure.fType=pawn)and(figure.fColor=black)and(f ield[newPos.row,newPos.column].fColor=white)
    and(newPos.row=oldPos.row+1)and(abs(newPos.column-oldPos.column)=1) //schräger Zug Richtung höheren Zeilenindex
    then result:=true;
    if(figure.fType=pawn)and(figure.fColor=white)and(f ield[newPos.row,newPos.column].fColor=black)
    and(newPos.row=oldPos.row-1)and(abs(newPos.column-oldPos.column)=1)
    then result:=true;
    //für die restlichen Spielfiguren and Konstellationen sind ähnliche Regeln zu formulieren
    end;
    </PRE>
    Viele Grüße,<BR>
    Marku

    Comment


    • #3
      Beziehungsweise könnte in isValidMove() der figure-Parameter aus oldPos ausgelesen, und muß nicht übergeben werden:<BR>
      <PRE>
      function isValidMove(oldPos,newPos:TChessPosition; field:TField):Boolean;
      var figure:TFigure;
      begin
      result:=false;
      figure=field[oldPos.row,oldPos.column];
      if figure.fType=null then exit;
      ...
      end;
      </PRE&gt

      Comment


      • #4
        Hallo Markus,
        vielen Dank für die Hilfe.
        Gruß
        Thoma

        Comment


        • #5
          Tach Thomas,

          wenn dein Schachspiel fertig ist, würde mich der quellcode interessieren! bin schachspieler und wollte auch schon mal sowas machen! :
          Herzliche Grüße

          Markus Lemcke
          barrierefreies Webdesign

          Comment

          Working...
          X