Frage von credist, 86

Java Processing Schach Klassen?

Hallo,

ich habe angefangen ein Schachspiel zu schreiben und habe nun mit einem zweidimensionalen Array ein Schachbrett erstellt. Nun gibt es ja verschiedene Figuren die alle etwas verschiedenes können. Ich hatte nun vor ein Oberklasse zu erstellen und dies aufzuteilen in die Unterklassen Schwarz und Weiß und diese wiederum in die verschiedenen Figuren, sodass ich nur noch diese Klassen den Arrays zuweisen muss. Nun müsste ich wissen wie man Unterklassen erstellt und wie man am besten in den einzelnen Unterklassen den Figuren diese Eigenschaften gibt, sprich, dass der Bauer nur immer einen nach vorne gehen kann und keinen zurück....... es wäre sehr nett wenn mir jemand dies bezogen ein paar Tipps geben könnte.

Danke schon mal im Voraus.

Mfg Credist

Antwort
von eleteroj, 39

du hast dir ja mächtig was vorgenommen - das Programmieren von Schach- und Gospielen steht nicht am Anfang, sondern eher am Höhepunkt der Programmiererausbildung.

Wenn du nur zwei menschliche Spieler im Sinn hast, und das in Java, dann schau mal da in diese Seite, da gibts jede Menge Futter:

http://www.java-forum.org/thema/schach-array-und-gui-verknuepfung-enum.116294/

wenn du Mensch:Computer Spieler im Sinn hast, musst du dich mit KI, Backtracking und Regel-Algorithmen firm machen, da gibts keine Gutefrage-Gute Antworten. Leider. Spieleprogrammierung ist ein Lernberuf, ein hartes Brot.

Kommentar von credist ,

danke für den link. Ya ich hatte vor es auf ein 2 spieler spiel auszurichten, weil um eine KI zu programmieren fehlt mir noch einiges.....ich hab grad erst vor ein paar monaten in der 10.  mit informatik angefangen. ^^

Antwort
von AnonYmus19941, 40

Du könntest beispielsweise eine Oberklasse "Figur" erstellen, in die du alle Attribute und Methoden schreibst, die jede Figur haben soll (z. B. das Attribut "Farbe", in diesem Fall dargestellt durch den bool'schen Wert "schwarz", oder die Methode "ziehen()").

public abstract class Figur {
private boolean schwarz;
private int pos_x, pos_y;
public Figur(boolean farbe_neu, int pos_x_neu, int pos_y_neu) {
schwarz = farbe_neu;
pos_x = pos_x_neu;
pos_y = pos_y_neu;
}
private boolean ziehen(int x, int y);
}

Dann brauchst du für jede Figurenklasse eine Unterklasse, in diesem Beispiel für die Figur des Bauers (ich bin mir nicht ganz sicher, ob man die Attribute nochmal hinschreiben muss ...)

public class Bauer extends Figur {
//evtl. private boolean schwarz; ...
public Bauer(boolean schwarz_neu, int pos_x_neu, int pos_y_neu) {
super(schwarz_neu); //sollte so funktionieren ...
}
public boolean ziehen(int x, int y) {
if (x > 0 && x < 3 && y < 2 && y > -2) { //nicht vollstaendig
pos_x = pos_x + x;
pos_y = pos_y + y;
return true;
} else {
return false;
}
}

In der Hauptklasse legst du dann für jede Figur ein Objekt der jeweiligen Figur an (Beispiel Bauer:

Bauer bauer_w_1 = new Bauer(false, 2, 1); //1. weisser Bauer

). Diese kannst du dann auch in einem Array speichern:

Figur[] figuren = new Figur[32];
figuren[0] = new Bauer(false, 2, 1); //theoretisch sollte es so funktionieren ...

Du musst vielleicht noch ein bisschen rumprobieren, ich habe es jetzt nicht getestet, aber im Prinzip sollte es so funktionieren ...

Kommentar von credist ,

Danke ich werde es mal probieren. Aber was meint die public und privat class in deinem code?

Kommentar von AnonYmus19941 ,

Das kannst du ignorieren, ist vermutlich sogar besser so. Aber wenn es dich interessiert:

https://de.wikipedia.org/wiki/Java-Syntax#Reservierte_W.C3.B6rter

https://de.wikipedia.org/wiki/Zugriffsmodifikator

Kommentar von EightSix ,

Du willst ein Schachspiel programmieren und hast nicht einmal ein Anfängertutorial für OOP gemacht?

Kapselung/Polymorphie/Vererbung/Abstraktion muss man kennen und können um irgendwas zu machen.

Und die Zugriffsmodifikatoren public/protected/private sind nichtmal OOP sondern elementares Basiswissen.

Kommentar von credist ,

ya sry eightsix.....ich habe informatik mit processing seit circa 5monaten da ich gerade in der 10.klasse bin und wir haben uns nur mit dem anfängerzeugs beschäftigt....

Antwort
von wolfgang1956, 14

Dir ist schon klar, dass du dir damit ein wirklich hartes Stück Arbeit vorgenommen hast?

Wie man Unterklassen erzeugt, steht im Ullenboom und 100.000 anderen Java-Lehrbüchern.

Über diesem „Klassen-Gedöns“ steht das berühmte Entwurfsmuster „MVC“ – Modell(klassen), View(klassen) und Control(klassen)!

Zur Programmlogik gehören nicht nur der Aufbau des Brettes, Figurenfarben und Figurenzüge, sondern insbesondere Bewertungsfunktionen und dazugehörige Berechnungsfunktionen, damit das Programm auch eine „Spielstärke“ entwickeln kann.

Bei aller Sympathie zum Schachspiel und Programmieren. Du solltest erst mal kleinere Brötchen backen … :-)

Antwort
von Berny96, 40

Ich denke du suchst nach Vererbung. Du willst eine Basisklasse die "Figur" heisst. Dann zwei weitere die davon erben die "FigurWeiß" und "FigurSchwarz" heißen oder?

http://www.java-tutorial.org/vererbung.html

Kommentar von credist ,

Ya danke, das passt perfekt wenn die unterklassen so auch die eigenschaften der oberklasse erben.

Kommentar von Berny96 ,

Genau darum geht es ja bei der Vererbung! Wiederverwendung von gleichen Eigenschaften so dass man nur noch die Speziellen der erbenden Klasse hinzufügen muss.

Antwort
von MalNachgedacht, 13

Zunächst solltest Du Dir überlegen welche Eigenschaften/Fähigkeiten Schachfiguren haben bzw. welche Eigenschaften/Fähigkeiten sie für eine Zwecke haben müssen

Da Du das Schachbrett vemutlich visuell darstellen willst sollte jede Schachfigur auch die Fähigkeit haben sich selbst zu "zeichnen" - im einfachsten Fall durch Ausgabe eines entsprechenden Buchstaben in der Konsole wobei Großbuchstaben für weisse Figuren und Kleinbuchstaben für schwarze Figuren stehen.

Womit wir dann schon eine weitere Eigenschaft jeder Schachfigur hätten  - nämlich die Farbe schwarz oder weiß

Bei manchen Zügen (z.B. Rochade) ist es wichtig zu wissen, ob eine bestimmte Figur bereits gezogen wurde oder seit Spielbeginn unverändert auf ihrer Startposition steht.

Eine boolean Variable "wasMoved" in jeder Figur die auf True gesetzt wird sobald die entsprechende Figur gezogen wird wäre eine Lösung

Und natürlich hat jede Figur (anhängig von ihrer eigenen Position und anderen Figuren auf dem Schachbrett) zu jedem Zeitpunkt eine bestimmte Anzahl von möglichen Zügen die sie ausführen kann - wobei da Rochade und En-Passant-Schlagen Sonderfälle sind weil bei der Rochade zwei Figuren auf einmal bewegt werden und beim En-Passant-Schlagen die weggenommene Figur nicht auf dem Feld stand auf das die eigene Figur gezogen ist.

Schöner ist es, wenn jede Figur auf dem Brett auf Anfrage eine Liste aller Stellungen liefert die möglich sind wenn sie gezogen wird.

Eine Schachfigur könnte/sollte also folgende Methoden haben

getPosition()

getColor()

drawSymbol()

getListOfLegalPositionsAfterMove()

Statt einem zweidimensionalen 8 x 8 Array ist es übriges einfacher ein 12 x 12 Feld zu benutzen bei dem das eigentliche Schachbrett in der Mitte sitzt und aussenherum ein zwei Felder breiter Rand verläuft bei dem ein spezieller Wert anzeigt dass sie nicht bespielbar sind.

Auf diese Weise ist es wesentlich leichter und schneller zu prüfen ob eine Figur (z.B. ein Springer) durch einen Zug "vom Brett fallen" würde und der Zug daher unzulässig ist.

statt einem zweidimensionalen 12 x 12 Feld kannst Du auch ein eindimensionales Feld mit 144 Elementen verwenden.

Statt mit zwei Koordinaten x,y hast Du es dann nur noch mit einem offset zu tun

aktuelle Position + 12  rückt eine weiße Figur um ein Feld gerade aus nach vorne

Ein Springer kann entsprechend Felder anspringen die +23 , + 25 . -23, -25 , +10 + 14 , -10 , - 14 von der aktuellen Position entfernt sind - vorausgesetzt das Zielfeld hat keinen Wert der auf ein eigene Figur oder auf ein nicht betretbares Randfeld hinweist.

Das ist deutlich schneller als mit zwei getrennten Koordinaten zu hantieren und letztlich auch einfacher zu programmieren...

Antwort
von Quietmgs, 38

http://stackoverflow.com/questions/4439595/how-to-create-a-sub-array-from-anothe...

Hilft das? Leider ist es schon etwas her dass ich mich mit Java beschäftig habe, aber die Methode .copyOfRange() müsste das sein wonach du suchst.

Kommentar von Berny96 ,

Ich denke er sucht eher nach Vererbung oder?

Kommentar von credist ,

Danke es hat mir geholfen. Jetzt weiß ich wie ich Unterklassen erstelle. Mir stellt sich ab immet noch die Frage wie ich den einzelnen Figuren am besten ihre Eigenschaften zuweise (siehe oben)

Kommentar von Quietmgs ,

Dann schau mal unter Vererbung nach, wie Benny96 geschrieben hat. Weiter weiß ich dann auch nicht mehr. Ich habe erst nächstes Semester wieder Java :) Ich hoffe ich konnte trotzdem helfen. Viel Glück bei deinem Vorhaben. 

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten