Schachbrett erkennen

H

hüteüberhüte

Gast
Ich versuche gerade, die aktuelle Stellung zu erkennen.

Dabei ist nur bekannt:
- Startaufstellung,
- nach jedem Zug für jedes Feld: schwarze, weiße Figur oder leeres Feld.

Wie soll ich vorgehen?
 

OlliL

Bekanntes Mitglied
Da du doch nacht jedem Zug weisst, welche Felder schwarz, weiss oder leer sind, weisst du doch welche Figuren gesetzt wurden. Dadurch hast du eine "Änderungshistorie" über das ganze Spiel hinweg für jede einzelne Figur indem du die Positionen nach dem vorherigen Zug und dem aktuellen Zug vergleichst.
Das merkst du dir einfach und aktualisierst es nach jedem Zug, und schon hast du zu jedem Zeitpunkt die aktuelle Posi jeder Figur?
 
M

Marcinek

Gast
Vor allem muss man gucken von welchem Feld die Figur verschwunden ist. Dann hat man ja auch die Art der Figur. Weil man die startstellung kennt.
 

pl4gu33

Top Contributor
Und man könnte bei bestimmten Figuren ausschließen, dass sie auf diese Position gelangen könnten. Aber das wäre glaub ich zu kompliziert und unnötig.

Ich denke, es ist schon der richtige Weg zu schauen, wo fehlt eine Figur und wo ist nun eine dazu gekommen. Weiterhin muss man bedenken, dass eine Figur ja auch auf einem Feld sein kann, wo voher eine Figur der anderen Seite stand. Ich denke da wäre es der beste Ansatz 2x 2-Dimensionale Arrays zu haben und diese dann jeweils Feld um Feld zu vergleichen, dann weißt du genau, welche Figur irgendwo hingesetzt wurde und durch die Startaufstellung kannst auch genau bestimmen, welche Figur es ist.
 
Zuletzt bearbeitet:

Pentalon

Bekanntes Mitglied
Vielleicht ist es ja Overkill, aber da würde ich sogar ein 3-Dimensionales Feld machen.
Oder halt ein 2-Dimensionales Feld (12x12 glaube ich :)) und die Arrays in einer List ablegen.
2 Dimemnsionen für das Schachfeld und in die 3-te Dimemsion die vorhergehenden Aufstellungen.
Damit hättest Du eine History. Wie gross die 3te Dimension ist, hängt davon ab, wie sehr die historischen Daten wirklich von interesse sind. Wenn alles mitgespeichert wird, kann der gesamte Spielablauf wiederholt werden.

Vielleicht verstehe ich aber auch die Fragestellung total falsch :)

PS: Sag mal, schreiben unter dem Konto HÜTEÜBERHÜTE mehrere Personen ?

Pentalon
 
H

hüteüberhüte

Gast
Nein, nur ich.

Kompliziert wird es aber, wenn eine Figur geschlagen wird, bei Rochaden, bei en passant und wenn ein Bauer umgewandelt wird.

Habt ihr eine Strategie dafür?
 

OlliL

Bekanntes Mitglied
Lediglich das Bauern umwandeln stelle ich mir schwierig vor wenn du keinerlei Infos über die Figuren hast. Ansonsten lassen sich doch alle Besonderheiten ohne Zweifel feststellen. Sehe das Problem irgendwie nicht?
 

Pentalon

Bekanntes Mitglied
Geschlagen heisst doch nur, dass eine Figur (vom einen Team) den Platz eines anderen (des anderen Teams) einnimmt.
Die andere Figur fliegt raus. Rochade heisst, dass 2 Figuren des selben Team die Plätze tauschen.
Mit umwandern meist Du überspringen ?!?!

Nachtrag: Hab Wikipedia befrag, jetzt weiss ich auch was en passant heisst :))))
Dazu müsste man sich den letzten Zug merken, damit man nacher weiss, ob diese Regel anwendbar ist.

Kannst Du das etwas genauer erklären, was Du machen willst ?

Pentalon
 
Zuletzt bearbeitet:

DrZoidberg

Top Contributor
Hier mal ein Ansatz

Java:
import java.util.ArrayList;

public class Schach {
    final static int LEER = 0;
    final static int WEISS = 0;
    final static int SCHWARZ = 0;
    
    String brett[][] = {
        {"T", "S", "L", "D", "K", "L", "S", "T"},
        {"B", "B", "B", "B", "B", "B", "B", "B"},
        { "",  "",  "",  "",  "",  "",  "",  ""},
        { "",  "",  "",  "",  "",  "",  "",  ""},
        { "",  "",  "",  "",  "",  "",  "",  ""},
        { "",  "",  "",  "",  "",  "",  "",  ""},
        {"B", "B", "B", "B", "B", "B", "B", "B"},
        {"T", "S", "L", "D", "K", "L", "S", "T"}
    };
    
    int[][] alterZustand = {
        {SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ},
        {SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ, SCHWARZ},
        {   LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER},
        {   LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER},
        {   LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER},
        {   LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER,    LEER},
        {  WEISS,   WEISS,   WEISS,   WEISS,   WEISS,   WEISS,   WEISS,   WEISS},
        {  WEISS,   WEISS,   WEISS,   WEISS,   WEISS,   WEISS,   WEISS,   WEISS}
    };
    
    void zug(int[][] neuerZustand) {
        ArrayList<int[]> aenderungen = new ArrayList<int[]>();
        for(int reihe = 0; reihe < 8; reihe++) {
            for(int spalte = 0; spalte < 8; spalte++) {
                if(neuerZustand[reihe][spalte] != alterZustand[reihe][spalte]) {
                    aenderungen.add(new int[] {reihe, spalte});
                }
            }
        }
        if(aenderungen.size() == 2) { // normaler Zug, es ist möglich, dass eine Figur geschlagen wurde
                                      // vielleicht wurde auch ein Bauer umgewandelt
        } else if(aenderungen.size() == 3) { // en passant
        } else if(aenderungen.size() == 4) { // Rochade
        }
        alterZustand = neuerZustand;
    }
    public static void main(String[] args) {
        Schach spiel = new Schach();
        spiel.zug(...);
    }
}
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Erinnert mich an diesen Thread... http://www.java-forum.org/allgemeine-java-themen/144534-schach-designfehler-algorithmenproblem.html

... und auch wieder an meine dort erwähnten Mitschüler, mit ihrer "Geheimsprache". Aus der Grundstellung heraus, sollten alle aktuellen Figurpositionen mittels Feldpaaren (Züge wie z.B. A2-A4) , die man in einer Liste gespeichert hat, ermittelbar sein (selbst Rollbacks funktionieren damit). Sogar wer am Zuge ist, lässt sich feststellen - geade Anzahl an Zügen Weiss, ungerade Anzahl Schwarz. Allerdings ist's ratsam, sich für die Validierung von Zügen stets die veränderten Positionen der Figuren zu merken, beispielsweise in einer Map<Feld, Figur>. Statt Arrays usw. würde ich für die Felder und die Farben nach wie vor Enums verwenden und die Figuren als Klasse eines Typs (ebenfalls ein Enum).
[EDIT]Ich glaube im übrigen kaum, dass sich anhand der aktuellen Figurpositionen der bisherige Zugverlauf ermitteln lässt.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
H

hüteüberhüte

Gast
Ok, ich sehe ein, dass alles bis auf die Bauernumwandlung anhand der Information Schwarz, Weiß oder Leer möglich ist. Es wird aber noch etwas schwieriger: Der zuletzt ausgeführte Zug soll nachgesetzt werden. Dazu muss ich wissen, welche Figur von welchem Feld auf welches gesetzt wurde... Ich kann das später nochmal etwas genauer beschreiben und auch meinen bisherigen Ansatz posten. Irgendwie hatte ich in Erinnerung, dass es dabei Fallstricke gibt...

Edit: Welche Figur ist eigentlich belanglos, es muss nur bekannt sein, von welchem Feld eine Figur auf welches gesetzt wurde. :rtfm:
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Das hat sich meine Wenigkeit überlegt. ;)
Ach so...
Dann ist ja eigentlich alles gesagt.
BZW.
1. Du versuchst die aktuelle Stellung zu erkennen? Das musst du nicht, wenn du die Stellungen Zug für Zug in einer Map<Feld, Figur> hälst. Im Zweifelsfalle evtl. sogar zwei, eine für Weiss und die andere für Schwarz.
2. Um festzustellen wer am Zuge ist und für Rollbackzwecke genügt es, die Züge einer Partie in einer Liste zu speichern. Ist die Anzahl der bisherigen Züge gerade, ist Weiss am Zug, andernfalls Schwarz.
3. Die Regeln. Ob ein Zug gültig ist, oder was passiert, wenn eine Figur eine bestimmte Position erreicht (Bauernumwandlung), kann nach geringfügigen Prechecks nur die Figur selbst feststellen. Bei einem Läufer z.B. müssen Delta X- und Y-Indices der Felder gleich gross sein und jedes Feld zwischen aktuellem und Zielfeld frei sein. Das Zielfeld selbst darf nicht von der Fraktion des Läufers belegt sein. Trifft dies alles zu, kann der Läufer ziehen. Ob dabei eine andere Figur geschlagen wurde, hängt davon ab, ob das Zielfeld belegt war oder nicht.
4. Prechecks sind jene, dass ein Zug z.B. ungültig ist, wenn Weiss am Zuge, das Startfeld des Zuges jedoch leer oder von einer schwarzen Figur belegt ist oder durch einen sonst gültigen Zug, ein zuvor gebotenes Schach nicht aufgehoben wurde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Auf einem Schachbrett bewegen programmieren Java Basics - Anfänger-Themen 2
D Schachbrett (8x8) programmieren Java Basics - Anfänger-Themen 3
B Schachbrett Java Basics - Anfänger-Themen 2
F Best Practice Schachbrett Läufer Java Basics - Anfänger-Themen 11
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
J Matrix für Schachbrett Java Basics - Anfänger-Themen 6
P Das Schachbrett - Reis Problem Java Basics - Anfänger-Themen 21
J Schachbrett mit Hilfe von while-Schleifen Java Basics - Anfänger-Themen 10
J Schachbrett zeichnen Java Basics - Anfänger-Themen 9
E einfaches Schachbrett generieren Java Basics - Anfänger-Themen 9
P Schachbrett Java Basics - Anfänger-Themen 7
P Schachbrett Spiel Nr. 01 Java Basics - Anfänger-Themen 17
P Schachbrett mit N x N Feldern Java Basics - Anfänger-Themen 11
B Schachbrett Java Basics - Anfänger-Themen 17
D Schachbrett frage Teil2 Java Basics - Anfänger-Themen 15
D Schachbrett frage Java Basics - Anfänger-Themen 3
D schachbrett aufbauen Java Basics - Anfänger-Themen 29
I Springer auf Schachbrett Java Basics - Anfänger-Themen 18
M Schachbrett Java Basics - Anfänger-Themen 31
J Schachbrett Java Basics - Anfänger-Themen 6
B [Java] Schachbrett Frage Java Basics - Anfänger-Themen 11
T scanner eingaben erkennen und umtauschen Java Basics - Anfänger-Themen 4
B Zusammenhängende Blöcke bei x-gewinnt erkennen? Java Basics - Anfänger-Themen 14
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
H Logik Fehler erkennen Java Basics - Anfänger-Themen 21
1 Wie dieses Muster am einfachsten erkennen? Java Basics - Anfänger-Themen 32
Yasemin bahar Muster erkennen Java Basics - Anfänger-Themen 13
U Muster in einem Array erkennen Java Basics - Anfänger-Themen 8
N Eingabe erkennen, ob groß oder kleingeschrieben worden ist Java Basics - Anfänger-Themen 22
N palindrom erkennen Java Basics - Anfänger-Themen 3
A Figur erkennen, aber Abweichung falsch Java Basics - Anfänger-Themen 2
C Erkennen ob Frame geschlossen wurde Java Basics - Anfänger-Themen 2
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
P Eigenschaft eines imperativen Algo (Pseudocode) sofort erkennen Java Basics - Anfänger-Themen 1
G Verlassen einer ComboBox erkennen Java Basics - Anfänger-Themen 16
S Java Großbuchstabe erkennen Java Basics - Anfänger-Themen 5
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
B Unterschiede in einer Liste erkennen Java Basics - Anfänger-Themen 1
O String: Befehl und Wert erkennen. Java Basics - Anfänger-Themen 4
S Zeilenumbruch mit Scanner erkennen Java Basics - Anfänger-Themen 9
J Leerzeichen im Pfad automatisch erkennen Java Basics - Anfänger-Themen 30
M Input/Output Zeilenumbrüche erkennen und beibehalten Java Basics - Anfänger-Themen 4
X XML-Eintrag an Attribute erkennen Java Basics - Anfänger-Themen 2
N Erkennen ob Linkshänder Maus Java Basics - Anfänger-Themen 4
L In Javakara Palindrom erkennen. Java Basics - Anfänger-Themen 9
B Tastatureingabe erkennen Java Basics - Anfänger-Themen 8
D Input/Output Buchstaben als bestimmte Zahl erkennen Java Basics - Anfänger-Themen 4
F Blinken oder Dauer ein erkennen Java Basics - Anfänger-Themen 6
F Linien und Kurven erkennen Java Basics - Anfänger-Themen 2
T Richtigen Wert erkennen Java Basics - Anfänger-Themen 9
D Klassenmethode: Befehl erkennen, dann int zurückgeben Java Basics - Anfänger-Themen 2
S Laufzeitfehler erkennen Java Basics - Anfänger-Themen 3
T Erste Schritte Methoden anwenden und erkennen Java Basics - Anfänger-Themen 5
D Erste Schritte Array erkennen Java Basics - Anfänger-Themen 4
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
F Attribute von Feldinhalten erkennen Java Basics - Anfänger-Themen 6
N Erste Schritte Doppelwerte erkennen Java Basics - Anfänger-Themen 5
T Erste Schritte Leerzeile in JAVA erkennen /übergehen Java Basics - Anfänger-Themen 9
S Erkennen ob Zahl durch 500Teilbar ist Java Basics - Anfänger-Themen 21
Java-Insel StringBuilder Zeilenumbrüche erkennen Java Basics - Anfänger-Themen 3
H Datei in kleine Stücke teilen und wieder erkennen Java Basics - Anfänger-Themen 10
T Erkennen ob ein Pfad lokal oder im Netzwerk ist Java Basics - Anfänger-Themen 13
X String Sonderzeichen/Zahlen erkennen Java Basics - Anfänger-Themen 3
P System - Tage erkennen ( System Time ?) Java Basics - Anfänger-Themen 3
M Betriebssystem erkennen? Java Basics - Anfänger-Themen 12
lumo Collections Array - erkennen von positionsänderungen Java Basics - Anfänger-Themen 5
M Muster erkennen. Idee: Fassade. Java Basics - Anfänger-Themen 3
M Java-Prog soll Texte innerhalb Bildern erkennen Java Basics - Anfänger-Themen 2
S Leere Datei erkennen Java Basics - Anfänger-Themen 5
E ActionListener in anderer Klasse erkennen Java Basics - Anfänger-Themen 13
Kukulkan Java-Version (ME, SE) erkennen und darauf reagieren? Java Basics - Anfänger-Themen 35
E Position erkennen und überlappungen feststellen Java Basics - Anfänger-Themen 4
3 Leerzeichen erkennen Java Basics - Anfänger-Themen 3
A Gruppen von Namen erkennen Java Basics - Anfänger-Themen 21
M In Router einloggen und PCs im Netzwerk erkennen Java Basics - Anfänger-Themen 18
M ziffer in zahl erkennen mit boolean Java Basics - Anfänger-Themen 12
D Zahl erkennen Java Basics - Anfänger-Themen 4
T Image Position erkennen Java Basics - Anfänger-Themen 6
S Sonderzeichen in einem String erkennen Java Basics - Anfänger-Themen 20
S Filelock erkennen Java Basics - Anfänger-Themen 6
A Angeschlossenes Gerät am Com Port erkennen Java Basics - Anfänger-Themen 4
L Zeilenwechselsequenz erkennen aus der Datei heraus Java Basics - Anfänger-Themen 2
S Erkennen der Eingabe Java Basics - Anfänger-Themen 13
G eine straße im kartenspiel erkennen (algorithmus) Java Basics - Anfänger-Themen 4
G Bildinformationan auslesen - OCR - Zahlen erkennen Java Basics - Anfänger-Themen 10
B Properties erkennen, auslesen Java Basics - Anfänger-Themen 7
M in Textfile Strukturen erkennen Java Basics - Anfänger-Themen 5
kulturfenster Teilstring erkennen Java Basics - Anfänger-Themen 5
L Laufwerksauswahl / Laufwerke erkennen Java Basics - Anfänger-Themen 3
B Threadende erkennen Java Basics - Anfänger-Themen 6
E Klassen erkennen in einer Aufgabenstellung Java Basics - Anfänger-Themen 6
L path einlesen und erkennen ob es für windows oder linux ist Java Basics - Anfänger-Themen 8
H Zeilenanzahl eines Strings erkennen Java Basics - Anfänger-Themen 2
S Umlaute und Sonderzeichen erkennen Java Basics - Anfänger-Themen 12
C Erkennen einer gedrückten Taste Java Basics - Anfänger-Themen 6
S CD/DVD-Laufwerke erkennen mit Java Java Basics - Anfänger-Themen 3
R erkennen von Wortende Java Basics - Anfänger-Themen 5
N Veränderungen in JTextArea erkennen Java Basics - Anfänger-Themen 5
K Wortpaare in Texten erkennen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben