Java Processing Schach Klassen?

6 Antworten

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...

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.


credist 
Beitragsersteller
 19.05.2016, 17:41

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. ^^

1

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


credist 
Beitragsersteller
 19.05.2016, 17:24

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

0
Berny96  19.05.2016, 18:40
@credist

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.

0

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 ...


credist 
Beitragsersteller
 19.05.2016, 17:36

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

0
EightSix  19.05.2016, 17:44
@credist

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.

0
credist 
Beitragsersteller
 19.05.2016, 18:22
@EightSix

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....

0

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 … :-)