Schach Figuren bewegen

Zut

Mitglied
Hallo, ich bin gerade dabei ein Schachspiel zu programmieren. Ich habe bereits das Spielfeld und die Figuren. Nun fehlt aber noch das Bewegen der Figuren, ich habe keine Ahnung wie man das am besten programmiert. Es soll als erstes die Figur angeklickt werden die bewegt werden soll und anschließend soll das Feld gedrückt werden, wo die Figur hin soll. Nun muss geprüft werden ob das Feld besetzt ist, ob der richtige Spieler dran ist, ob die Figur dort überhaupt hinlaufen darf, das keine Figur im Laufweg steht....Das gleiche muss natürlich auch beim schlagen geprüft werden und die Geschlagene Figur soll verschwinden. Am Ende vom Zug soll dann noch die Variable spieler auf Spieler 2 gesetzt werden. Hier gibt es ein Teil des Codes wie ich die Figuren erstellt habe. Bitte macht den Code nicht zu kompliziert, bin noch nicht so lange bei Java dabei😉. Ich programmiere übrigens mit Intellij. Vielen Dank für eure Hilfe!
PS: Der Springer fehlt absichtlich noch.


Java:
    public static void spielfeld() {
chessBoard.setBounds(340, 100, 800, 800); // Position und Größe des Schachbretts festlegen
        chessBoard.setLayout(new GridLayout(8, 8));



        for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
JPanel square = new JPanel();
                if ((i + j) % 2 == 0) {
square.setBackground(Color.WHITE);
                } else {
square.setBackground(Color.GRAY);
                }
chessBoard.add(square);
            }
        }
hintergrund.add(chessBoard);
        Figurenweiss();
        Figurenschwarz();
    } //Ende Funktion Spielfeld


    public static void Figurenweiss() {
ImageIcon rookIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rookImage = rookIcon.getImage();
        Image scaledRookImage = rookImage.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRookIcon = new ImageIcon(scaledRookImage);
        JLabel rookLabel = new JLabel(scaledRookIcon);
        JPanel rookSquare = (JPanel) chessBoard.getComponent(1); // Beispiel: Figur auf das zweite Feld setzen
        rookSquare.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rookLabel.setSize(60, 60); // Größe des JLabels anpassen
        rookSquare.add(rookLabel);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.CENTER;
        rookSquare.add(rookLabel, gbc); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook1Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook1Image = rook1Icon.getImage();
        Image scaledRook1Image = rook1Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook1Icon = new ImageIcon(scaledRook1Image);
        JLabel rook1Label = new JLabel(scaledRook1Icon);
        JPanel rook1Square = (JPanel) chessBoard.getComponent(9);
        rook1Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook1Label.setSize(60, 60); // Größe des JLabels anpassen
        rook1Square.add(rook1Label);
        GridBagConstraints gbc1 = new GridBagConstraints();
        gbc1.anchor = GridBagConstraints.CENTER;
        rook1Square.add(rook1Label, gbc1); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook2Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook2Image = rook2Icon.getImage();
        Image scaledRook2Image = rook2Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook2Icon = new ImageIcon(scaledRook2Image);
        JLabel rook2Label = new JLabel(scaledRook2Icon);
        JPanel rook2Square = (JPanel) chessBoard.getComponent(17);
        rook2Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook2Label.setSize(60, 60); // Größe des JLabels anpassen
        rook2Square.add(rook2Label);
        GridBagConstraints gbc2 = new GridBagConstraints();
        gbc2.anchor = GridBagConstraints.CENTER;
        rook2Square.add(rook2Label, gbc2); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook3Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook3Image = rook3Icon.getImage();
        Image scaledRook3Image = rook3Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook3Icon = new ImageIcon(scaledRook3Image);
        JLabel rook3Label = new JLabel(scaledRook3Icon);
        JPanel rook3Square = (JPanel) chessBoard.getComponent(25);
        rook3Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook3Label.setSize(60, 60); // Größe des JLabels anpassen
        rook3Square.add(rook3Label);
        GridBagConstraints gbc3 = new GridBagConstraints();
        gbc3.anchor = GridBagConstraints.CENTER;
        rook3Square.add(rook3Label, gbc3); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook4Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook4Image = rook4Icon.getImage();
        Image scaledRook4Image = rook4Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook4Icon = new ImageIcon(scaledRook4Image);
        JLabel rook4Label = new JLabel(scaledRook4Icon);
        JPanel rook4Square = (JPanel) chessBoard.getComponent(33);
        rook4Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook4Label.setSize(60, 60); // Größe des JLabels anpassen
        rook4Square.add(rook4Label);
        GridBagConstraints gbc4 = new GridBagConstraints();
        gbc4.anchor = GridBagConstraints.CENTER;
        rook4Square.add(rook4Label, gbc4); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook5Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook5Image = rook5Icon.getImage();
        Image scaledRook5Image = rook5Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook5Icon = new ImageIcon(scaledRook5Image);
        JLabel rook5Label = new JLabel(scaledRook5Icon);
        JPanel rook5Square = (JPanel) chessBoard.getComponent(41);
        rook5Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook5Label.setSize(60, 60); // Größe des JLabels anpassen
        rook5Square.add(rook5Label);
        GridBagConstraints gbc5 = new GridBagConstraints();
        gbc5.anchor = GridBagConstraints.CENTER;
        rook5Square.add(rook5Label, gbc5); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook6Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook6Image = rook6Icon.getImage();
        Image scaledRook6Image = rook6Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook6Icon = new ImageIcon(scaledRook6Image);
        JLabel rook6Label = new JLabel(scaledRook6Icon);
        JPanel rook6Square = (JPanel) chessBoard.getComponent(49);
        rook6Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook6Label.setSize(60, 60); // Größe des JLabels anpassen
        rook6Square.add(rook6Label);
        GridBagConstraints gbc6 = new GridBagConstraints();
        gbc6.anchor = GridBagConstraints.CENTER;
        rook6Square.add(rook6Label, gbc6); // Figur in der Mitte des Feldes platzieren


        ImageIcon rook7Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image rook7Image = rook7Icon.getImage();
        Image scaledRook7Image = rook7Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledRook7Icon = new ImageIcon(scaledRook7Image);
        JLabel rook7Label = new JLabel(scaledRook7Icon);
        JPanel rook7Square = (JPanel) chessBoard.getComponent(57);
        rook7Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        rook7Label.setSize(60, 60); // Größe des JLabels anpassen
        rook7Square.add(rook7Label);
        GridBagConstraints gbc7 = new GridBagConstraints();
        gbc7.anchor = GridBagConstraints.CENTER;
        rook7Square.add(rook7Label, gbc7); // Figur in der Mitte des Feldes platzieren


        //Türme
        ImageIcon turmIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image turmImage = turmIcon.getImage();
        Image scaledturmImage = turmImage.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledturmIcon = new ImageIcon(scaledturmImage);
        JLabel turmLabel = new JLabel(scaledturmIcon);
        JPanel turmSquare = (JPanel) chessBoard.getComponent(0);
        turmSquare.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        turmLabel.setSize(60, 60); // Größe des JLabels anpassen
        turmSquare.add(turmLabel);
        GridBagConstraints gbct = new GridBagConstraints();
        gbct.anchor = GridBagConstraints.CENTER;
        turmSquare.add(turmLabel, gbct); // Figur in der Mitte des Feldes platzieren


        ImageIcon turm1Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image turm1Image = turm1Icon.getImage();
        Image scaledturm1Image = turm1Image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
        ImageIcon scaledturm1Icon = new ImageIcon(scaledturm1Image);
        JLabel turm1Label = new JLabel(scaledturm1Icon);
        JPanel turm1Square = (JPanel) chessBoard.getComponent(56);
        turm1Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        turm1Label.setSize(60, 60); // Größe des JLabels anpassen
        turm1Square.add(turm1Label);
        GridBagConstraints gbct1 = new GridBagConstraints();
        gbct1.anchor = GridBagConstraints.CENTER;
        turm1Square.add(turm1Label, gbct1); // Figur in der Mitte des Feldes platzieren


        //Läufer
        ImageIcon laufIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image laufImage = laufIcon.getImage();
        Image scaledlaufImage = laufImage.getScaledInstance(80, 80, Image.SCALE_SMOOTH);
        ImageIcon scaledlaufIcon = new ImageIcon(scaledlaufImage);
        JLabel laufLabel = new JLabel(scaledlaufIcon);
        JPanel laufSquare = (JPanel) chessBoard.getComponent(16);
        laufSquare.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        laufLabel.setSize(80, 80); // Größe des JLabels anpassen
        laufSquare.add(laufLabel);
        GridBagConstraints gbcl = new GridBagConstraints();
        gbcl.anchor = GridBagConstraints.CENTER;
        laufSquare.add(laufLabel, gbcl); // Figur in der Mitte des Feldes platzieren


        ImageIcon lauf1Icon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image lauf1Image = lauf1Icon.getImage();
        Image scaledlauf1Image = lauf1Image.getScaledInstance(80, 80, Image.SCALE_SMOOTH);
        ImageIcon scaledlauf1Icon = new ImageIcon(scaledlauf1Image);
        JLabel lauf1Label = new JLabel(scaledlauf1Icon);
        JPanel lauf1Square = (JPanel) chessBoard.getComponent(40);
        lauf1Square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        lauf1Label.setSize(80, 80); // Größe des JLabels anpassen
        lauf1Square.add(lauf1Label);
        GridBagConstraints gbcl1 = new GridBagConstraints();
        gbcl1.anchor = GridBagConstraints.CENTER;
        lauf1Square.add(lauf1Label, gbcl1); // Figur in der Mitte des Feldes platzieren


        //Dame
        ImageIcon dameIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image dameImage = dameIcon.getImage();
        Image scaleddameImage = dameImage.getScaledInstance(80, 80, Image.SCALE_SMOOTH);
        ImageIcon scaleddameIcon = new ImageIcon(scaleddameImage);
        JLabel dameLabel = new JLabel(scaleddameIcon);
        JPanel dameSquare = (JPanel) chessBoard.getComponent(24);
        dameSquare.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        dameLabel.setSize(80, 80); // Größe des JLabels anpassen
        dameSquare.add(dameLabel);
        GridBagConstraints gbcd = new GridBagConstraints();
        gbcd.anchor = GridBagConstraints.CENTER;
        dameSquare.add(dameLabel, gbcd); // Figur in der Mitte des Feldes platzieren


        //König
        ImageIcon konigIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
        Image konigImage = konigIcon.getImage();
        Image scaledkonigImage = konigImage.getScaledInstance(80, 80, Image.SCALE_SMOOTH);
        ImageIcon scaledkonigIcon = new ImageIcon(scaledkonigImage);
        JLabel konigLabel = new JLabel(scaledkonigIcon);
        JPanel konigSquare = (JPanel) chessBoard.getComponent(32);
        konigSquare.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
        konigLabel.setSize(80, 80); // Größe des JLabels anpassen
        konigSquare.add(konigLabel);
        GridBagConstraints gbck = new GridBagConstraints();
        gbck.anchor = GridBagConstraints.CENTER;
        konigSquare.add(konigLabel, gbck); // Figur in der Mitte des Feldes platzieren



} // Ende Funktion Figurenweiss
 
Zuletzt bearbeitet von einem Moderator:

temi

Top Contributor
Mal ganz grob, ohne auf deinen Code näher einzugehen:

Es ist sinnvoll die Daten (die Stellung) und die GUI (das gezeichnete Schachbrett) zu trennen. Das ist ein Grundprinzip der Informatik die Trennung in Eingabe - Verarbeitung - Ausgabe (EVA) vorzunehmen.

Letztendlich läuft es darauf hinaus, dass du das Schachbrett neu zeichnen musst, wenn sich etwas am Status ändert. Dazu ist es sinnvoll eine passende Datenstruktur zu schaffen, welche die Stellung der Figuren repräsentiert. Das kann im Prinzip einfach ein Array sein. Abhängig vom Inhalt dieser Datenstruktur wird das Schachbrett gezeichnet. Ändert sich die Stellung wird das Brett wieder neu gezeichnet.

Im Idealfall schreibst du dein Programm objektorientiert, entwirfst also geeignete Klassen, die z. B. das Brett und die Figuren repräsentieren. Du scheinst derzeit noch Imperativ unterwegs zu sein. Da solltest du wenigstens darauf achten den Code in einzelne sinnvolle Methoden (z. B. eine Methode zum Zeichnen einer Figur, mit Parametern für Art der Figur und dem Feld auf dem Brett) aufzuteilen. Wenn du dir deinen Code anschaust, dann wirst du feststellen, dass er sich ständig wiederholt und sich nur wenige Parameter ändern.

Besser wäre es jedoch sich zunächst mit Objektorientierung und den Grundlagen zu beschäftigen, danach die Logik (mit ihren Klassen) und ganz zuletzt die GUI (mit ihren Klassen) zu programmieren.
 
Zuletzt bearbeitet:

temi

Top Contributor
Java:
ImageIcon rookIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
Image rookImage = rookIcon.getImage();
Image scaledRookImage = rookImage.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
ImageIcon scaledRookIcon = new ImageIcon(scaledRookImage);
JLabel rookLabel = new JLabel(scaledRookIcon);
JPanel rookSquare = (JPanel) chessBoard.getComponent(1); // Beispiel: Figur auf das zweite Feld setzen
rookSquare.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
rookLabel.setSize(60, 60); // Größe des JLabels anpassen
rookSquare.add(rookLabel);
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
rookSquare.add(rookLabel, gbc); // Figur in der Mitte des Feldes platzieren

// könnte werden zu

public static void draw(ImageIcon icon, int field) {
    Image image = icon.getImage(); // icon als Parameter übergeben
    Image scaledImage = image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
    ImageIcon scaledIcon = new ImageIcon(scaledImage);
    JLabel label = new JLabel(scaledIcon);
    JPanel square = (JPanel) chessBoard.getComponent(field); // Beispiel: Figur auf das als Parameter übergebene Feld setzen
    square.setLayout(new GridBagLayout()); // Layout-Manager auf GridBagLayout setzen
    label.setSize(60, 60); // Größe des JLabels anpassen
    square.add(label);
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.CENTER;
    square.add(rookLabel, gbc); // Figur in der Mitte des Feldes platzieren
}

// Aufruf mit
ImageIcon rookIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
draw(rookIcon, 1);
// ...
ImageIcon dameIcon = new ImageIcon("...."); // Pfad zur Bilddatei anpassen
draw(dameIcon, 24);

Allerdings würde ich das oben zuletzt geschriebene machen und mich zuerst mit den Grundlagen und OOP beschäftigen.
 

MisterBu

Aktives Mitglied
Uih, das ist gar nicht so einfach. Wenn es Dich interessiert, so gibt es auf github.com/homer65 zwei Repositories namens schachKernel und schachBrett2. Das eine ist die Logik, das Andere die graphische Oberfläche. Vielleicht kannst Du das als Anregung nutzen. Aber wie schon angedeutet, da steckt viel Arbeit drin.
 

MisterBu

Aktives Mitglied
Mal ein Vorschlag: Programmiere die graphische Oberfläche selbst und benutze für die Bewegungsprüfung die schachKernel Bibliothek. Erspart Dir sehr viel Arbeit.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M BlueJ Schach Steuerung programmieren Spiele- und Multimedia-Programmierung 28
B Schach-AI Spiele- und Multimedia-Programmierung 6
P schach programm- wo anfangen? Spiele- und Multimedia-Programmierung 13
R Schach Spiele- und Multimedia-Programmierung 4
N Schach nur mit Bauern Spiele- und Multimedia-Programmierung 4
Taschentuch9 Einfache fertige Schach AI gesucht Spiele- und Multimedia-Programmierung 3
R Schach, Array und GUI Verknüpfung, enum Spiele- und Multimedia-Programmierung 16
C Schach auf der Konsole Spiele- und Multimedia-Programmierung 2
M Suche Schach Images Spiele- und Multimedia-Programmierung 5
F Schach Spiele- und Multimedia-Programmierung 3
L Denkanstösse bei Schach Spiele- und Multimedia-Programmierung 6
K Dummyprogramm, Figuren Kleidung wechseln Spiele- und Multimedia-Programmierung 3
Developer_X Figuren werden nicht angezeigt (Java3D) Spiele- und Multimedia-Programmierung 5
Z Geometrische Figuren mit Füllmuster füllen Spiele- und Multimedia-Programmierung 2
A Lissajous Figuren zeichnen Spiele- und Multimedia-Programmierung 1
B Spieler auf besonderer Bahn bewegen Spiele- und Multimedia-Programmierung 1
M Minecraft Spieler move/run (bewegen) Spiele- und Multimedia-Programmierung 0
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
A Spiel Figur ansprechen und bewegen Spiele- und Multimedia-Programmierung 3
G Auf einem Stick bewegen Spiele- und Multimedia-Programmierung 5
astro151 JButtons mit Mausklicks bewegen Spiele- und Multimedia-Programmierung 2
M bewegen eines Objektes Spiele- und Multimedia-Programmierung 2
L JavaFX Objekte bewegen Spiele- und Multimedia-Programmierung 3
M Kamera "am Rande einer Kugel bewegen" Spiele- und Multimedia-Programmierung 4
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
javampir Lange Hintergrundgrafik einfügen und bewegen Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
R Canvas Circle bewegen? Spiele- und Multimedia-Programmierung 14
K auf Mapraster frei bewegen Spiele- und Multimedia-Programmierung 7
T Android OpenGL Bewegen Spiele- und Multimedia-Programmierung 5
K Zum Ziel bewegen Spiele- und Multimedia-Programmierung 4
Helgon Große Welt bewegen? Spiele- und Multimedia-Programmierung 15
A Wie wird die Person im Game animiert, dass sie ihre Körperteile bewegen? Spiele- und Multimedia-Programmierung 3
G 2D Welt bewegen Spiele- und Multimedia-Programmierung 20
V Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen Spiele- und Multimedia-Programmierung 5
M Figur bewegen Spiele- und Multimedia-Programmierung 7
F RPG - Spielfigur soll sich nicht frei bewegen können. Anregugen wären gerne gesehen^^ Spiele- und Multimedia-Programmierung 13
N Objekt entgegengesetzt bewegen Spiele- und Multimedia-Programmierung 8
D Sprite zur Maus bewegen Spiele- und Multimedia-Programmierung 9
S Mehrere Steine gleichzeitig setzen und bewegen Spiele- und Multimedia-Programmierung 4
V Java3D: automatisches Bewegen der Kamera Spiele- und Multimedia-Programmierung 19
2 Kugel bewegen? Spiele- und Multimedia-Programmierung 17
L Figur soll sich selbständig Bewegen Spiele- und Multimedia-Programmierung 12
G Zeichnung mit der Maus bewegen Spiele- und Multimedia-Programmierung 3
R Teilgraphen bewegen Spiele- und Multimedia-Programmierung 5
H mit Java2D Markierung über JTable zeichnen und diese bewegen Spiele- und Multimedia-Programmierung 2
A Bilder bewegen Spiele- und Multimedia-Programmierung 2
Z Obejkt drehen & vorwärts bewegen Spiele- und Multimedia-Programmierung 9
D nicht 4-eckiges bild auf Hintergrund bewegen Spiele- und Multimedia-Programmierung 2
G Bewegen von Objekten Spiele- und Multimedia-Programmierung 4
B Hilfe gesucht!! (bewegen von grafischen Objekten) Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen


Oben