Schachspiel

Hallo,
und zwar habe ich ein Schachspiel, ich muss es in mögliche Angriffsfelder und Bewegungsfelder unterteilen
die Bewegungsfelder sind an sich kein Problem.
Beim Bauern frage ich beispielsweise die Farbe ab um zu wissen ob er im Array bei z.B. 1:1 steht
oder an 1:6 .
Wenn er an 1:1 steht wir auf auf die y Koordinate +2 oder +1 gerechnet,
wenn Y nicht mehr 1 entspricht nur +1

Bei Schwarz wäre es in die negative Richtung.

Nun muss ich aber bei den Angriffs Feldern überprüfen ob sich eine Gegnerische Figur auf dem zu bewegenden Feld steht.

man muss beachten dann der Bauer schräg rechts oder schräg links gehen kann und diese Felder überprüft werden müssen ob dort eine gegnerische Figur steht.
Wenn ich weiß spiele soll logischer weise bei einer Weißen Figur nichts passieren, das selbe bei schwarz

Meine Frage ist nun wie ich eine bestimmte x, y Koordinate auf eine Gegnerische Figur überprüfe
 

AndiE

Top Contributor
Erstmal wäre ein treffenderer Titel gut.

Zum Problem selbst wäre erst einmal die Frage, wie modellierst du das Schachfeld mit den Figuren darauf. Hast du da schon einen Ansatz? Danach richtet sich die Antwort, wie man dann weitermacht.
 

insanezulu

Mitglied
Ich lese hier gar nicht, wo das Problem etwas mit der Modellierung zu tun haben soll? Er hat doch eine eindeutige Frage gestellt, oder bin ich neben der Spur?
 
K

kneitzel

Gast
Wenn die Frage eindeutig ist und Du alle notwendigen Details kennst, dann beantworte einfach die Frage.

Ich selbst kann nicht sagen, wie er "eine bestimmte x, y Koordinate auf eine Gegnerische Figur überprüfe"n kann, wenn ich nicht weiß, wie er das Spielfeld und die Figuren modelliert hat.

Schon beim Spielfeld fallen mir viele unterschiedliche Möglichkeiten ein. Er scheint eine Art von zweidimensionalem Array zu verwenden, aber da er das nicht klar definiert, ist kaum eine Aussage möglich. Im anderen Thread habe ich das auch etwas beschrieben, denn ich habe dort zum einen umrissen, wie ich das damals implementiert habe und auch umschrieben, wie ich es heute anders machen würde. Das kann helfen, muss aber nicht.

Ich habe z.B. nie zwischen Angriffs- und Bewegungsfeldern unterschieden. Es gab für mich immer nur mögliche Züge für eine Figur. Also habe ich bei Zügen immer nur zwischen erlaubt und nicht erlaubt unterschieden.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich lese hier gar nicht, wo das Problem etwas mit der Modellierung zu tun haben soll? Er hat doch eine eindeutige Frage gestellt, oder bin ich neben der Spur?
Weil das ganze ein Modellierungsproblem ist :)

Passend modelliert ist das völlig trivial, unpassend modellier steht man halt vor solchen Problemen und weiß nicht wie man's machen soll.
 
K

kneitzel

Gast
Das Schach Spiel ist genau wie in dem geposteten Beitrag aufgebaut.
Also wir bräuchten schon mehr Details. In dem anderen Thread ist auch nicht viel über die Modellierung geschrieben worden außer eben in meiner Antwort. Und in der habe ich - wenn auch nicht bis ins Detail - zwei Varianten bezüglich Modellierung der Figuren geschrieben - Modellierung des Spielfeldes ist da nicht behandelt worden.

Und wenn da schon erster Code vorhanden ist, dann kann der doch geteilt werden. Dann sieht man direkt, wie es aufgebaut wurde und kann dann Wege aufzeigen, wie das eine oder andere ermittelt werden kann.

Ich selbst war damals der Meinung, dass da Spielfeld lediglich eine visuelle Darstellung für Menschen darstellt. Ein Spielfeld als solches gab es bei mir nicht außerhalb der GUI - es gab lediglich Figuren. Diese hatten unter anderem eine Position bestehend aus x und y Koordinate und bei Bewegungen wurden da halt Grenzen gesetzt (jeweils Werte 1-8, also auch das a-h gab es da nicht, da dies auch nur visuell für Menschen ist.)
Die Figuren waren in einer Klasse gespeichert und diese hatte dann auch eine Methode Figur get(byte x, byte y), welche entweder die Figur auf dem gegebenen Feld oder null zurück gegeben hat.

(Wie die Figuren intern gespeichert werden, ist von außen irrelevant. Da hier aber x und y Werte von 1-8 sind, lief es intern später aus Gründen Performance doch wieder auf ein zweidimensionales Array heraus - aber das ist erst als Bedarf aufgeschlagen, als im Rahmen der KI und der Bewertung eben sehr viele Abfragen in sehr kurzer Zeit notwendig waren. Ein erster Ansatz ist hier - ein z.B. bei einem TDD Ansatz - durchaus eine List<Figur> zur Speicherung und dann eben ein foreach oder Nutzung von Streams mit filter.)

Damit hätte ich eine Möglichkeit ganz grob umrissen - aber ohne die Modellierung zu kennen, ist keine Aussage zu treffen.
 
Hey,
Das Spiel wird mit Karel World erstellt. Für das Schachbrett nutze ich ein zweidimensionales Array mit Größe [8][8] und die Figuren werden in einer eigenen Klasse mit int x, int y und Color Farbe als Parameter erstellt. Da ich mir alle Entitäten über einen schon zuvor erstellten Befehl aufgeben lassen kann und in einem Array speichern ist mein momentanes Problem ein etwas anderes. Und zwar rufe ich in meinem Hauptprogramm eine Methode auf mit welcher ich mir die möglichen Felder anzeigen lasse auf welche ich mit der erstellten Figur gehen kann. Die Figuren selbst habe alle eine eigene Klasse und führen alle den gleichen Befehl aus. Da die Spielregeln für jede Figur anders sind, ist das Feld welches ich zurückgeben muss immer ein anderes. Ich möchte jetzt also testen ob eine Figur auf dem Feld ist auf welches ich ziehen möchte. Dafür durchsuche ich das Array der Figuren und gleiche es mit den Feldern ab auf welche ich gehen möchte. Der Wert den ich zurückgebe hängt wie gesagt davon ab ob auf diesen Feldern eine meiner eigenen Figuren steht. Falls da keine Figur steht soll mein Array eigentlich nichts ausgeben. Wenn ich ein Array mit Größe 2 erstelle erwartet er jedoch immer zwei Felder. Wie schaffe ich es also ein leeres Array zu returnen ohne dass mein Programm mir eine Fehlermeldung zeigt?
 

MisterBu

Aktives Mitglied
Habe mal ein Schach Programm geschrieben, das solche Prüfungen macht.
Das Repository findest du auf Github:
https://github.com/homer65/schachKernel
Das sind Hilfsklassen für Schachprogramme.
Unter anderem gibt es die Klasse SimpleRegeln mit der Methode istHalbZugGueltig(Partie partie,Zug zug) .
Dort werden genau diese Prüfungen gemacht.
 

Ähnliche Java Themen

Neue Themen


Oben