AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Schach: Überprüfung, ob Zug erlaubt

Schach: Überprüfung, ob Zug erlaubt

Ein Thema von fkerber · begonnen am 3. Jun 2005 · letzter Beitrag vom 2. Aug 2006
Antwort Antwort
Seite 3 von 3     123
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#21

Re: Schach: Überprüfung, ob Zug erlaubt

  Alt 1. Aug 2006, 00:25
Hi!

Lang, lang ists her...
Ich bin mir nicht mehr hundertprozentig sicher, wie ich es gelöst habe, aber sicher bin ich mir, dass keine Winkel mehr darin vorkamen
Ich kann leider jetzt nicht nachschauen, da das Programm auf einer ausgebauten Festplatte im Archiv ruht - aber soweit ich mich erinnere waren es dann doch die if-Abfragen. Meine Hürde war anfangs, dass ich die Befürchtung hatte z.B. bei der Dame nahezu alle Felder überprüfen zu müssen. Durch etwas logisches Nachdenken und zunehmendem Verständnis für rekursive (und andere) Funktionsaufrufe ist damals ein recht schlanker Code entstanden, der auch streng OOP-konform war.


Ciao, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#22

Re: Schach: Überprüfung, ob Zug erlaubt

  Alt 1. Aug 2006, 07:29
Ich würde mal versuchen, einen Zuggenerator zu entwerfen. Er erzeugt für alle Steine einer Farbe alle legalen Züge. Dieser Zuggenerator ist neben der Stellungsbewertung der zentrale Bestandteil eines Schach (oder Brettspiel-) Programmes.

So schwer ist das ja nicht.

Delphi-Quellcode:
Type
  TChessPos = Record
    cpRow, cpCol : Byte;
    End;
  TChessMove = Record
    cmPiece : TChessPiece;
    cmFrom,
    cmTo : TChessPos;
  End;

  TChessMoves : Array Of TChessMove;

Procedure MakeAllMoves (aBoard : TChessBoard; aColor : TChessColor; Var aMoveList : TChessMoves);
Var
  r,c : Integer;

Begin
  For r :=0 to 7 do
    For c := 0 to 7 do
       If aBoard[r,c].Color = aColor then
         Case aBoard[r,c].Piece Of
            ...
         End;
End;
Für jeden Spielstein (Bauer, Turm etc.) müssen dann eben einfach alle möglichen Züge durchprobiert werden. Klar kommt da Einiges zusammen, das ist ja gerade der Grund, warum erst jetzt, mit superparallelen und superschnellen Rechnen, ein Computer besser spielen kann, als ein Mensch.

Schach ist nun mal nicht trivial.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
C_NO_THANKS
(Gast)

n/a Beiträge
 
#23

Re: Schach: Überprüfung, ob Zug erlaubt

  Alt 2. Aug 2006, 21:01
Hi Frederic,

ich versuche mal eine Antwort ohne Code.

Ich würde aus jeder Figur ein Objekt machen. (logische und grafische Implementierung unter einem Dach)
Jedes Objekt wird so programmiert, dass es selber weiss wie es sich bewegen darf. Stösst es im Bewegungsablauf auf ein anderes Objekt oder an die Grenzen des Brettes, dann werden entsprechende Ereignisse ausgelöst.
Logik in der Bewegung:
- Richtung
- Anzahl der Felder in dieser Richtung?
- Grenze erreicht?
- Kollision mit einer anderen Figur?
- Sonderfälle wie beim Bauern 2 Felder vor wenn auf Grundposition, Rochade Turm mit König berücksichtigen... u.v.m.

Trifft die sich virtuell bewegende Figur auf eine andere, tauschen diese dann Informationen über diverse Properties aus.
Z.B. die Identität oder Wertigkeit.
"Bist Du weiss oder schawrz?"
"Wenn schwarz - dann - bist Du nicht der gegnerische König?"
"Wenn wahr dann schlage .... (löse Ereignis "Schlage Figur aus")

Ohne ifs kann ich es mir nicht vorstellen (im richtigen Leben gehts ja auch nicht ohne ifs - nur denken wir nicht drüber nach) Aber Du kannst die ifs auf die Object-Prototypen begrenzen. Dein Schachspiel-Object macht dann nichts anderes, als die geplanten Züge an die entsprechenden Figuren-Objekte zu übergeben und wartet dann auf die Nachricht von der Figur ob Sie das so durchführen könnte.

Die Definition einer Figur im "TSchachspiel"-Object könnte dann folgendermassen lauten:
Pferd_Schwarz_01 : TPferd_Schwarz_01; (Wobei TPferd_Schwarz_01 von TPferd abgeleitet sein sollte)

Man kann die Objekte soweit verfeinern, dass eine Figur sogar seine Ausgangsposition kennt und sich beim Aufruf "Schachspiel:=TSchachspiel.create (self) entsprechend positioniert.

Zur späteren Weiterentwicklung des Programms, könntest Du im ersten Schritt ein Zugwertigkeit implementieren. Das heisst jede Figur kann einen Zug vorschlagen, den sie als am höchstwertigsten erkennt. Als Beispiel wäre das direkte Schlagen einer gegnerischen Figur denkbar.

So kommst Du von der rein mechanischen Anwendung, zur taktisch "mitdenkenden" Schachfigur. Wenn Du die Figuren zu guten Taktikern "ausgebildet" hast, kannst Du Dir über Strategie Gedanken machen. Die Figuren einer Farbe könnten über einen Kommunikationskanal (Broadcast-Messages) zusammen kommunizieren. In einer demokratischen Abstimmung würde dann der nächste Zug beschlossen

Die Demokatie kann man beim Schach auch einfach weglassen. Die Figuren könnten Ihre Vorschläge auch an den König senden, und der trifft dann eine Entscheidung (er ist halt der Boss auf dem Brett).

Meine Anmerkungen lösen zwar nicht Deine Probleme im Detail, aber ich denke es wäre eine interessante Richtung.

Ausserdem finde ich es toll, dass Du so ein komplexes Problem angehst.

Viele Grüsse

C_NO_THANKS
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#24

Re: Schach: Überprüfung, ob Zug erlaubt

  Alt 2. Aug 2006, 21:09
1. Überprüfen, ob Feld belegt.
2. Farbe überprüfen.
3. Überprüfen, ob die Figur überhaupt so ziehen kann.
4. Noch die Überprüfungen: Matt, Patt etc.
5. Sonderzüge.
6. Würde ich diese Überprüfung, wenn jmd. die Figur über einem Feld losgelassen hat durchführen.

Ich wünsche dir noch viel Spaß, denn an zwei Sachen wirst du dich aufhängen: Patt und Matt.
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#25

Re: Schach: Überprüfung, ob Zug erlaubt

  Alt 2. Aug 2006, 23:22
Hi!

Ja, die Situationen Patt und Matt habe ich damals nicht implementiert. Man sollte dazu sagen, dass es wirklich ein Schulprojekt im zweiten Jahr Info war und das solche Worte wie OOP bei anderen Kursteilnehmern nur ein ausgelöst haben !


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz