Ersten Zug bestimmen

Herbert69420

Mitglied
Hi,

ich arbeite gerade an einer Methode für einen Bauer in Schach, die die möglichen Felder zurückgiebt, auf denen man sich bewegen kann.
Damit das mit dem Doppelzug klappt muss ich wissen wann die Methode für einen bestimmten Bauern zum ersten mal aufgerufen wird.
Habe es zuerst mit ner boolean variable versucht die zuerst auf true ist und am ende der Methode auf false gesetzt wird aber dann wird sie ja bei jedem neuen Aufruf wieder auf true gesetzt.
Ich wüsste eine Möglichkeit, die wäre aber extrem aufwendig (Anfangsposition mit jeder Startposition jedes Bauers vergleichen für jede Farbe). Habe irgendwie im gefühl dass das einfacher gehen muss. Gibt es da irgend ne elegante Möglichkeit?

Grüße
Herbert
 

Meniskusschaden

Top Contributor
Damit das mit dem Doppelzug klappt muss ich wissen wann die Methode für einen bestimmten Bauern zum ersten mal aufgerufen wird.
Es ergibt sich ja schon aus der Position des Bauern, ob er bereits gezogen hat. Wenn ein weißer Bauer auf der 2. Reihe steht bzw. ein schwarzer auf der siebten, wurde er noch nicht gezogen. Wenn Position und Farbe bekannt sind braucht man also keine zusätzliche Variable.
 

vorn6658

Mitglied
  • Der Bauer kann als einziger Spielstein en passant schlagen. Hat ein gegnerischer Bauer im unmittelbar vorausgehenden gegnerischen Halbzug einen Doppelschritt gemacht und steht ein eigener Bauer so, dass er das dabei übersprungene Feld angreift, kann er den gegnerischen Bauern so schlagen, als ob dieser nur ein Feld aus der Ausgangsstellung vorgerückt wäre.

Das geht leider nicht... ohne die bisherige Historie der Partie zu kennen...
 

Meniskusschaden

Top Contributor
Habe es zuerst mit ner boolean variable versucht die zuerst auf true ist und am ende der Methode auf false gesetzt wird aber dann wird sie ja bei jedem neuen Aufruf wieder auf true gesetzt.
Dein Ansatz mit der boolean-Variablen ist schon sinnvoll. Die Funktionalität wird ja nicht nur beim Bauern, sondern auch bei Turm und König gebraucht. Wenn die Variable eine Instanzvariable deines Figur-Objekts ist, kannst du sie bei der Objekterzeugung auf true setzen und beim Methodenaufruf auf false.
 
K

kneitzel

Gast
Das geht leider nicht... ohne die bisherige Historie der Partie zu kennen...
Dazu wird aber nicht die ganze Historie sondern nur der letzte Zug des Gegners benötigt. Und es hat absolut nichts mit der Problematik des TE zu tun, in der es erst einmal rein um den Doppelzug ging.

Und die Nachfrage von @Der Wissende ist wohl auch mit darauf zurück zu führen, dass man beim Zitieren die Quelle mit angeben sollte.
 

M.L.

Top Contributor
Und für später ist noch zu kontrollieren, ob der jeweilige Bauernzug legal ist. Sprich: prüfen ob er ein Schachgebot (weiterhin) ermöglicht / verhindert.
 
K

kneitzel

Gast
So ein Schach Programm ist diesbezüglich ein sehr interessantes Projekt. Ich habe mich da auch schon einmal heran gewagt.

Das war hier noch nicht Thema und ich hoffe, dass ich da noch nicht zu sehr vorgreife:
Was der TE derzeit macht ist erst einmal eine Analyse von möglichen Zügen:
- Jede Figur kann von ihrer Position gewisse Schritte gehen. Hier gibt es neben den "üblichen" Zügen (a.la. Bauer zieht ein Feld vor) dann noch die unüblichen ("Bauer kann beim ersten Mal zwei Felder vorziehen", "Bauer schlägt nicht gerade aus", "bauer schlägt schräg", "bauer kann en passant schlagen", "König und Turm können eine Rochade machen") ...
- Es gibt Kriterien für ungültige Züge:
Üblich ist hier z.B. Ziel-Feld ist durch eigene Figur belegt. Aber es gibt dann auch sehr schnell Spezialfälle, denn beim Bauen gilt z.B. dass beim gerade aus ziehen keine gegnerische Figur da stehen darf, beim schräg ziehen muss eine gegnerische Figur da stehen. Bei der Rochade dürfen König und Turm nicht bewegt worden sein, die Felder dazwischen müssen leer sein, die Felder dürfen nicht bedroht werden.
Generell gilt immer das Kriterium: Nach dem Zug darf der eigene König nicht bedroht sein, es sei denn, der Zug schlägt den gegnerischen König.

Ich fand, dass man dies sehr schön objektorientiert darstellen konnte. Ich habe damals den Ansatz gewählt, dass ich halt die Figuren entsprechend modelliert hatte und dann ganz viele Klassen hatte. Das ging recht gut, aber mir gefiel nicht ganz so gut, dass ich dann in der Figur selbst ein Verhalten hatte, das ich dann in überschriebenen Klassen wieder durch überschreiben entfernt hatte. Da wäre heute mein veränderter Ansatz, dass man das Strategy Pattern verwendet, d.h. das Verhalten ist in einer eigenen Klassenstruktur gekapselt. Vermutlich wird man dann auch keine eigenen Klassen mehr für König, Dame u.s.w. brauchen, denn alles sind nur Figuren mit einem Verhalten und dieses Verhalten ist halt in Klassen gekapselt....

Aber egal. Worauf ich eigentlich nur etwas hinaus wollte, war dann halt meine Lösung damals:
Alle Schritte, die möglich waren, wurden definiert mit Gültigkeitsregeln:
Bauer hatte also als Optionen: ein Schritt vor, zwei Schritt vor, Schritt nach rechts vorne, Schritt nach links vorne. Und es gab halt eine Bewertung, ob der Schritt erlaubt ist: Ein Schritt geradeaus: Feld muss leer sein. Zwei Schritt geradeaus: Feld vor dem Bauen und das Zielfeld müssen leer sein, Bauer muss auf seine Grundposition stehen, Schritt schräg: Feindliche Figur muss auf dem Feld stehen oder letzter Zug des Gegners setzte einen Bauen zwei Felder vor neben den Bauern.

Was dann halt nur an weiteren Bereichen kommt:
a) Zug Durchführung: Wenn ein Zug durchgeführt wird, dann gibt es Aktionen, z.B. das Entfernen einer gegnerischen Figur.
b) Stellungsbewertung: So man einen Computerspieler haben will, dann muss man da etwas bewerten.
c) Um b zu verbessern: Bibliotheken: Eröffnung ist trivial (Da bewegt man sich einfach in einem Baum bis ein Zug kommt, der nicht im Baum enthalten ist) und Endspiel wird schwerer: Sowohl Bauernendspiel: Wie bekomme ich gezielt einen Bauen durch? als auch dass Schachmatt setzen: König + x (+y) gegen König. Es wäre schade, wenn man ein Patt hat, nur weil der Computer nicht mit König und Dame den König schachmatt setzen kann.

Und gewisse Flags (Figur schon bewegt) hatte ich nicht. Es werden ja die Züge erfasst und dann ist das eine einfache Suche. Es geht ja in der Regel nur um eine zweistellige Anzahl an Zügen: Die Züge sind dann im Speicher und sind schnell durchsuchbar um zu sehen, ob Turm oder König bereits bewegt wurden.
 

M.L.

Top Contributor
z.B. dass beim gerade aus ziehen keine gegnerische Figur da stehen darf,
--> oder eine eigene
Bei der Rochade (..) werden.
--> und der Rochade-willige König darf auch in der Ausgangsstellung nicht im Schach stehen
es sei denn, der Zug schlägt den gegnerischen König.
--> dann wäre der gegnerische Zug -unter FIDE-Regeln- aber selbst illegal.
Feindliche Figur muss auf dem Feld stehen
--> oder der Bauernzug gibt Schach
 

Meniskusschaden

Top Contributor
Bei der Rochade dürfen König und Turm nicht bewegt worden sein, die Felder dazwischen müssen leer sein, die Felder dürfen nicht bedroht werden.
Da muss man allerdings ein wenig aufpassen, dass man nicht versehentlich die Vertikalrochade zulässt.;)
es sei denn, der Zug schlägt den gegnerischen König.
Das kann ja eigentlich nicht passieren, denn dazu müsste der vorhergehende gegnerische Zug regelwidrig gewesen sein.

EDIT: Link zur Vertikalrochade war falsch. Hier ist der richtige: Pam-Krabbé-Rochade
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Ersten Index von Array bestimmen Java Basics - Anfänger-Themen 14
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
M Stream mit den ersten n natürlichen Zahlen Java Basics - Anfänger-Themen 4
H Erste Schritte Warum misslingt die Auswertung des ersten Aufrufparameters? Java Basics - Anfänger-Themen 4
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
KogoroMori21 Vorbereitung auf die Programmieren Klausur vom ersten Semester Java Basics - Anfänger-Themen 4
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
Java The Hutt Primzahlen - die ersten 100 Java Basics - Anfänger-Themen 17
M JComboBox ersten Eintrag leerlassen bzw. Platzhalter Java Basics - Anfänger-Themen 1
J Erste Schritte Feedback zum ersten Anfängerprogramm Java Basics - Anfänger-Themen 6
Z Ersten Buchstaben eines Elements eines String-Arrays auslesen Java Basics - Anfänger-Themen 5
M Methoden while liefert nur den ersten Datensatz Java Basics - Anfänger-Themen 12
C Entfernen des ersten String-Elements Java Basics - Anfänger-Themen 6
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
K Frage zu meinem ersten Programm Java Basics - Anfänger-Themen 5
K OOP Die ersten Schritte bei der Programierung Java Basics - Anfänger-Themen 1
S Die ersten vier perfekte Zahlen. Java Basics - Anfänger-Themen 30
Z Meine ersten Gehversuche Java Basics - Anfänger-Themen 11
D Problem mit meinem ersten JOptionPane - Fatal exception occurred. Program will exit. Java Basics - Anfänger-Themen 6
M Ausführen des ersten Java Programms Java Basics - Anfänger-Themen 2
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
T gebe mir den ersten eltern knoten Java Basics - Anfänger-Themen 3
C ArrayIndexOutOfBoundsException bei meinem ersten objektiorientierten Programm Java Basics - Anfänger-Themen 4
X SAX die ersten Schritte Java Basics - Anfänger-Themen 5
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
Semox Ersten Wert eines Intervalls bei Berechnung einschließen Java Basics - Anfänger-Themen 8
B Ersten Eintrag aus einer Map bekommen Java Basics - Anfänger-Themen 11
A Die Werte der ersten beiden markierten Check-Boxen registrieren Java Basics - Anfänger-Themen 11
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
D Suche in JList nach dem ersten Buchstaben Java Basics - Anfänger-Themen 2
T zweiter thread killt den ersten Java Basics - Anfänger-Themen 2
T Ersten Buchstaben in einem Wort groß schreiben. Java Basics - Anfänger-Themen 6
L beim ersten compilen schon erste probleme Java Basics - Anfänger-Themen 8
K Programmieren von den ersten 70 Fibonacci-Zahlen Java Basics - Anfänger-Themen 2
S Tomcat Error mit meiner ersten JSF Seite Java Basics - Anfänger-Themen 17
M Problem beim Löschen des ersten Eintrags einer TreeSet Java Basics - Anfänger-Themen 3
G die ersten Zeichen eines Strings Vergleichen mit String Java Basics - Anfänger-Themen 6
G ersten Tag des Monats ermitteln Java Basics - Anfänger-Themen 3
N die ersten drei buchstaben eines Strings ausgeben Java Basics - Anfänger-Themen 2
J Überprüfung ersten Zeichens Java Basics - Anfänger-Themen 7
L Probleme beim ersten JavaProgramm! Java Basics - Anfänger-Themen 4
M meine ersten versuche Java Basics - Anfänger-Themen 8
N Kleines Problem mit meiner ersten Klasse Java Basics - Anfänger-Themen 5
S ersten schritte in Java lernen! Java Basics - Anfänger-Themen 3
thE_29 Vor dem ersten Posten bitte lesen! Java Basics - Anfänger-Themen 1
L Kompletter Neuling: Hilfe beim ersten Java Versuchen Java Basics - Anfänger-Themen 12
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
M Radius von einer ellipse bestimmen Java Basics - Anfänger-Themen 7
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
rosima26 Java SubSum bestimmen Java Basics - Anfänger-Themen 76
C Kollision zweier Rechtecke, Schnittpunkte bestimmen Java Basics - Anfänger-Themen 25
C Boolesche Formel, Belegungen bestimmen Java Basics - Anfänger-Themen 8
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
H Den Wert einer rekursiven Funktion bestimmen Java Basics - Anfänger-Themen 5
L Partitionierungsgruppen bestimmen Java Basics - Anfänger-Themen 22
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
H Minimum in einem Array bestimmen Java Basics - Anfänger-Themen 7
Kawastori Größe eines Arrays bestimmen Java Basics - Anfänger-Themen 13
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
M Array Summe bestimmen? Java Basics - Anfänger-Themen 14
N Bereich Zufallszahl bestimmen (50 und 100 / 80 und 90) Java Basics - Anfänger-Themen 2
J Y-Koordinate von GUI-Objekt bestimmen Java Basics - Anfänger-Themen 2
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
L Anzahl der Aufrufe von Schleifen bestimmen Java Basics - Anfänger-Themen 1
F Summe in einem Array bestimmen Java Basics - Anfänger-Themen 3
O Suchbaum Elternknoten finden Level eines Knoten bestimmen Java Basics - Anfänger-Themen 24
C Kleinsten Kreis einer Punktmenge bestimmen Java Basics - Anfänger-Themen 4
CptK Methoden Koordinaten relativ zur Rotation eines Bildes bestimmen Java Basics - Anfänger-Themen 8
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
E Maximalwert im Array bestimmen Java Basics - Anfänger-Themen 8
L Datentypen Date API - diese Woche bestimmen Java Basics - Anfänger-Themen 1
Y Rekursionsgleichung bestimmen Java Basics - Anfänger-Themen 3
Y Teile und Herrsche, längstes absteigendes Teilarray bestimmen Java Basics - Anfänger-Themen 12
T Min und Max einer Zahlenfolge bestimmen Java Basics - Anfänger-Themen 7
V Klassen Bestimmen Sie die erste und letzte Position an der ein 'c' steht? Java Basics - Anfänger-Themen 3
M Bestimmen, wie oft ein Char in einem Array vorkommt Java Basics - Anfänger-Themen 2
P Rückgabewert bestimmen Java Basics - Anfänger-Themen 17
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
T Anzahl bestimmter Werte eines arrays bestimmen Java Basics - Anfänger-Themen 4
G Datentypen Tipps, Ratschläge erwünscht bzgl. Datentyp bestimmen über Wertebereich Java Basics - Anfänger-Themen 5
E Summe der "Nachbarn" eines Wertes in einem Array bestimmen Java Basics - Anfänger-Themen 8
H Quotient durch Subtraktion bestimmen Java Basics - Anfänger-Themen 12
1 Größe einer zirkulären Liste bestimmen .. ? Java Basics - Anfänger-Themen 2
1 Minimum aller Elemente in einem Array bestimmen Java Basics - Anfänger-Themen 10
D Wochentag für eingegebenes Datum bestimmen anhand von Formel Java Basics - Anfänger-Themen 2
C Werteraum für Variable bestimmen Java Basics - Anfänger-Themen 5
S Vererbung exaktes "Objekt" der Unterklasse bestimmen Java Basics - Anfänger-Themen 5
Screen Wie geringste Absolutdifferenz zum Median bestimmen? Java Basics - Anfänger-Themen 8
V Aufrufendes Objekt bestimmen (nicht die Klasse) Java Basics - Anfänger-Themen 3
J Note bestimmen Java Basics - Anfänger-Themen 13
P BitSet- Objekt- Anzahl der Elemente bestimmen Java Basics - Anfänger-Themen 2
T Minimumsnorm bestimmen Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben