Schach-Programm (Anfangs-tipps)
-
Vielleicht könnte mir jemand, der mit den Schachregeln besser vertraut ist, folgende Frage beantworten:
- - - - - - - - 8 | | | | | | | | | - - - - - - - - 7 | | | | | | | | | - - - - - - - - 6 | | | | | | | | | - - - - - - - - 5 | | | | |r| | | | - - - - - - - - 4 | |k| | |Q| | | | - - - - - - - - 3 | | | | |K| | | | - - - - - - - - 2 | | | | | | | | | - - - - - - - - 1 | | | | | | | | | - - - - - - - - A B C D E F G H
(r = schwarzer Turm, k = schwarzer König, K = weißer König, Q = weiße Königin)
Befindet sich der schwarze König im Schach oder nicht?
Die Queen könnte ihn ja nicht schlagen, ohne ihren König selbst ins Schach zu stellen.
-
Ja, er befindet sich im Schach.
-
Wenn ein König gefressen würde, wäre das Spiel sofort aus.
-
Finde nur am Wochenende Zeit daran zu arbeiten. Diesmal eine, vorläufige, GUI:
http://img834.imageshack.us/img834/9555/chessk.png
EDIT: Der GUI-Code ist ein Schlachtfeld. Ich hasse GUIs
-
Wie hast du es denn geschafft diese Stellung zu produzieren, die sieht ja abenteuerlich aus
-
KPC schrieb:
Wie hast du es denn geschafft diese Stellung zu produzieren, die sieht ja abenteuerlich aus
Die Models haben sich einzig und allein für einen hübschen Screenshot in Stellung gebracht
-
KPC schrieb:
Wie hast du es denn geschafft diese Stellung zu produzieren, die sieht ja abenteuerlich aus
Steht sogar im Log.
@µ Geile Figuren.
-
cooky451 schrieb:
@µ Geile Figuren.
Jeder der mir hübschere Grafiken liefern möchte, fühle sich hiermit angesprochen
-
Das Command Pattern bietet sich für eine History ganz gut an, damit lassen sich Funktionen wie undo() / redo() sehr gut realisieren. Gerade in diesem Fall ist es trivial zu implementieren, z.B.
CommandMovePiece { Position OldPosition_; Position NewPosition_; Piece* Piece_; Board* Board_; public: CommandMovePiece( Board* Board, Piece* Piece, const Position& op, const Position& np ) : Board_( Board ), Piece_( Piece ), OldPosition_( op ), NewPosition_( np ) { assert( Board ); assert( Piece ); } void execute() { // normale Aktion ist identisch mit redo() redo(); } void undo() { // Figur von neuer Position an alte zurückstellen assert( Board_->at( NewPosition ) == Piece_ ); move_piece( Piece_, Board_, NewPosition_, OldPosition_ ); } void redo() { // Figur von alter Position an neue stellen assert( Board_->at( OldPosition ) == Piece_ ); move_piece( Piece_, Board_, OldPosition_, NewPosition_ ); } }
So kannt du die komplette Zughistorie in einem std::vector halten und jede beliebige Stellung wiederherstellen. Das ist ganz brauchbar, wenn man verschiedene Stellungen bewerten will.
Ein Sonderfall ist natürlich, wenn man zu einer Stellung zurückgeht und ab da weiterspielt, da muss man Teile der Historie verwerfen.Im übrigen würde ich keine verschachtelten Arrays zur Boarddarstellung benutzen, beim Schach kann man davon ausgehen, dass das Board immer 8x8 Felder groß ist. Ein statisches 2D Array tut´s genauso gut.
-
(Auch wenn ich das Schach-Programm vorerst "aufgeben" musste
) Wenn du eine Figur schlägst, dann ist dieser Zug eigentlich zwei (also der "schlag"-Zug und der Zug der geschlagenen Figur vom Brett woanders hin (z.B. In einen graveyard-Bereich)?
-
Das sind Spezialfälle, die natürlich bedacht werden müssen. Eine Rochade kannst du damit auch nicht durchführen. Jeder Zug sollte atomar sein, d.h. wenn ich ihn zurücknehme sollen alle Folgen ebenfalls rückgängig gemacht werden. Vielleicht macht Polymorphismus da Sinn, mit einem MoveCommand, CaptureCommand, CaptureEnPassantCommand und CastlingCommand.
-
µ schrieb:
cooky451 schrieb:
@µ Geile Figuren.
Jeder der mir hübschere Grafiken liefern möchte, fühle sich hiermit angesprochen
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖
-
Anonymous schrieb:
Ich werde zuerst das Klassen-interface fertigmachen (dazu gehört einfach die Hierarchie der Figuren und ihre can_move/move Funktionen).
Das mit der Klassenhierarchie klingt irgendwie over-engineered. Was es da für Spielfiguren gibt, ist dem Alpha-Beta-Algorithmus auch egal. Hauptsache er kann sich anhand eines Spielzustandes irgendwie mögliche Züge generieren und Spielzustände bewerten lassen.
-
krümelkacker schrieb:
Hauptsache er kann sich anhand eines Spielzustandes irgendwie mögliche Züge generieren und Spielzustände bewerten lassen.
Ich hab zwar alles vergessen, aber "mögliche Züge generieren" geht doch nur mit einer Liste aller möglichen Züge (für die entsprechenden Figuren), nicht?
-
Zu einem Schachprogramm habe ich auch nochmal eine Frage:
Wie setzt am besten die Zugregeln der Figuren, z.B . von einem Springer um?
Kann man die Zugregel so umsetzen wie sie tatsächlich gespielt wird oder muss
da eher mit Bruteforce rangehen?
-
Schachspieler schrieb:
Wie setzt am besten die Zugregeln der Figuren, z.B . von einem Springer um?
Kann man die Zugregel so umsetzen wie sie tatsächlich gespielt wird oder muss
da eher mit Bruteforce rangehen?Ein Springer hat maximal 8 mögliche Züge und die lassen sich einfach in einem Array speichern. Z.B. repräsentiert (2,1) den Zug "zwei nach vorne, eins nach rechts". Jeder dieser 8 Züge muss beim durchprobieren und suchen nach dem besten Zug noch auf seine Gültigkeit geprüft werdne. D.h.: Der Springer darf nicht über den Rand des Brettes gehen, darf keine eigene Figur schlagen und er darf die Deckung des eigenen Königs nicht aufheben s.d. dieser im Schach steht. Eine Schachsituation zu finden ist rechenaufwändig. Also hatte ich mich dazu entschieden eine Liste von guten Zügen zu bestimmen und erst am Ende zu prüfen ob diese entsprechend gültig sind.
Beim Läufer, Turm oder der Königin ermittelt man die aktuelle möglichen Züge einfach mit einer kleinen Schleife. Dabei sollte man frühzeitig abbrechen (Eine solche Figur kann z.B. nicht über eine andere Figur springen, also muss man nicht "dahinter" weitersuchen).