nicht einsehbarer Fehler im code, kann nicht mehr übersetzten

Ich habe letztens ein paar Änderungen an meinem Programm zu machen und plötzlich kann ich nicht mehr das Programm übersetzen. Der zeigt mir den Fehler auch nicht an, doch ich konnte den Fehler auf die paar, mit // und /** **/ markierten herunterbrechen... Ich benutze btw die sum.kern Bibliotek von bluej...

Java:
package Schachspiel;

import sum.kern.*;

public class Bauer
{
    private final Schach Schachfeld;
    Buntstift bst;
    Maus ms;
    KlickFeld G1;
    KlickFeld G2;
    KlickFeld L;
    KlickFeld R;
    thread thread;
    zeichne zeichne;
    private int color;
    private int team;
    private int vpos;
    private int hpos;
    private int Feld;
    private int c;
    private int b;
    private int h;
    private int f;
    private boolean life = true;
    private boolean istGedrueckt = false;
    private int t;

    // Konstruktor
    public Bauer(int b, int h, int f, int t, Schach Schachfeld)
    {
        this.Bauer = this;
        this.b = b + 20;
        this.h = h + 80;
        this.f = f;
        this.t = t;
        this.Schachfeld = Schachfeld;
        ms = new Maus();
        bst = new Buntstift();
        zeichne = new zeichne();
        zeichne.start();
        Schachfeld.setArray(Feld, color);
        this.Felder();
        thread = new thread();
        thread.start();
    }
  
    // Dienste
    class zeichne extends Thread {
        public void run() {
        // Aktionsteil
        vpos = h - h % 100 ;
        hpos = b - b % 100 ;
      
        bst.bewegeBis(b, h);
        bst.setzeFuellMuster(0);
        color = f;
        team = t;
       if(f==1) {
        bst.setzeFarbe(3);
    }
    else {
        bst.setzeFarbe(6);
    }
        Feld = (hpos/100)+(vpos/100*8);
        System.out.println(Feld);
        if(color != team) {
                c *= -1;
            }
          
        bst.runter();
        bst.bewegeUm(60);
        bst.dreheUm(90);
        bst.bewegeUm(10);
        bst.dreheUm(45);
        bst.bewegeUm(30);
        bst.dreheBis(0);
        bst.bewegeUm(10);
        bst.dreheUm(65);
        bst.bewegeUm(10);
        bst.dreheBis(135);
        bst.bewegeUm(10);
        bst.dreheBis(0);
        bst.bewegeUm(-5);
        bst.hoch();
        bst.bewegeUm(-10);
        bst.dreheUm(90);
        bst.bewegeUm(10);
        bst.dreheBis(0);
        bst.runter();
        bst.zeichneKreis(15);
      
        bst.hoch();
        bst.bewegeBis(b, h);
        bst.runter();
        bst.dreheUm(90);
        bst.bewegeUm(10);
        bst.dreheUm(-45);
        bst.bewegeUm(30);
        bst.dreheBis(0);
        bst.bewegeUm(-10);
        bst.dreheUm(115);
        bst.bewegeUm(10);
        bst.dreheBis(45);
        bst.bewegeUm(10);
        bst.dreheBis(0);
        bst.bewegeUm(5);
        bst.hoch();
      
    }// Aufraeumen
    }
    class thread extends Thread {
        public void run() {
            while(life = true) {
                if(ms.istGedrueckt()) {
                    if(ms.hPosition() >= (hpos+1)) {
                        System.out.println("1");
                        if(ms.hPosition() <= (hpos + 99)) {
                            System.out.println("2");
                            if(ms.vPosition() >= (vpos+1)) {
                                System.out.println("3");
                                if(ms.vPosition() <= (vpos + 99)) {
                                    if(color==team) {
                                        istGedrueckt = true;
                                        System.out.println("Feld " + Feld + " gedrueckt!");
                                        //this.erscheine();
                                    }
                                }
                                else {
                                    istGedrueckt = false;
                                }
                            }
                            else {
                                istGedrueckt = false;
                            }
                        }
                        else {
                            istGedrueckt = false;
                        }
                    }
                    else {
                        istGedrueckt = false;
                    }
                }
                if(istGedrueckt == true) {
                    //System.out.println("Feld " + Feld + " gedrueckt!");
                }
                /**
                if(G1.istGedrueckt() == true) {
                    this.bewegeGerade(1);
                }
                if(G2.istGedrueckt() == true) {
                    this.bewegeGerade(2);
                }
                if(L.istGedrueckt() == true) {
                    this.schlageLinks();
                }
                if(R.istGedrueckt() == true) {
                    this.schlageRechts();
                }
                **/
            }
        }
    }

    public void Felder() {
        G1 = new KlickFeld(hpos, vpos - 100*c, color, team, 0, Schachfeld);
        G1.setzeBauer(this);
        G2 = new KlickFeld(hpos, vpos - 200*c, color, team, 0, Schachfeld);
        G2.setzeBauer(this);
        L = new KlickFeld(hpos - 100, vpos - 100*c, color, team, 1, Schachfeld);
        L.setzeBauer(this);
        R = new KlickFeld(hpos + 100, vpos - 100*c, color, team, 1, Schachfeld);
        R.setzeBauer(this);
    }
    public void erscheine() {
        if(Schachfeld.getArrayColor(Feld - 8*c) == 0) {
            G1.erscheine();
            if(Feld == Schachfeld.getAttackArrayColor(Feld)) {
                if(Schachfeld.getArrayColor(Feld - 16*c) == 0) {
                    G2.erscheine();
                }
            }
        }
        if(Schachfeld.getArrayColor(Feld - 8*c - 1) != team) {
             if(Schachfeld.getArrayColor(Feld - 8*c - 1) != 0) {
                 L.erscheine();
            }
        }
        if(Schachfeld.getArrayColor(Feld - 8*c + 1) != team) {
             if(Schachfeld.getArrayColor(Feld - 8*c + 1) != 0) {
                 R.erscheine();
            }
        }
    }
    public void BewegeGerade(int b) {
          
            vpos -= 100*b*c;
            Schachfeld.Figuren();
    }
    public void SchlageLinks() {
      
            vpos -= 100*c;
            hpos -= 100;
            Schachfeld.Figuren();
    }
    public void SchlageRechts() {
     
            vpos -= 100*c;
            hpos += 100;
            Schachfeld.Figuren();
    }
    public int getVPose() {
        return vpos;
    }
    public int getHPose() {
        return hpos;
    }
    public boolean getLife() {
        return life;
    }
    public void setLife() {
        life = false;
    }
    public int getFeld() {
        return Feld;
    }
    public int getColor() {
        return color;
    }
}
 
Zuletzt bearbeitet von einem Moderator:

LimDul

Top Contributor
Setze deinen Code in Code-Tags dann ist er lesbar.

Und ein wichtiger Tipp - halte dich an die Namenskonventionen: Klassen werden groß geschrieben, Methoden klein

Eine "class thread extends Thread" ist eine ziemlich dumme Idee, die macht den Code extrem unübersichtlich.
 

kneitzel

Top Contributor
Java:
        this.Bauer = this;
Was soll diese Zeile im Bauer Konstruktor machen? Ist so auf jeden Fall Quatsch.

Etwas später im Konstruktor:
Java:
        Schachfeld.setArray(Feld, color);

Feld ist aber im Konstruktor nicht gesetzt worden. Der Thread, den Du startest, der verändert das aber das sieht extrem dubios aus und riecht etwas nach racing conditions.

Die ganze Struktur ist kaum lesbar. Naming Conventions einhalten ist existenziell um Code lesen zu können.
Dann Methoden sauber strukturieren - Dein thread ist extrem unleserlich.

Und wozu die ganzen Threads? Schachspiel und das ist ein Bauer? Und der hat 2 Threads? Wie viele Threads sollen denn da laufen bei 16 Bauern? Das sieht nicht überlegt aus.
 
Ok... das mit dem this.Bauer = this war nur ne Tat, da ich schon fast am verzweifeln war... eigentlich wollte ich die löschen.
bei 16 Bauern hat der immer so lange gebraucht, alle zu malen, dass ich das etwas schneller machen wollte.
Eigentlich hat bis jetzt alles so funktioniert, außer halt das mit den Felder, worauf man klicken kann...
 

kneitzel

Top Contributor
Java:
while(life = true)
a) Du brauchst keinen Vergleich auf true!
b) Du weist true zu statt auf true zu vergleichen!

In der Schleife in dem Thread habe ich jetzt nichts gesehen, das irgendwie pausiert / blockiert -> 100% Last auf einem Core.

Du nutzt Variablen mit mehreren Thread die nicht volatile sind.
 

kneitzel

Top Contributor
Vielleicht macht es Sinn, erst einmal einen Schritt zurück zu gehen um zu überlegen, was Du da überhaupt machen willst. Die vielen Threads sind Quatsch - das habe ich ja schon gesagt.

Du kannst gerne EINEN Thread machen. Der würde dann auf Nutzer-Eingaben warten (So es da kein Framework gibt, das bereits Events liefert). Da prüfst Du dann z.B. wurde die Maus gedrückt? Wenn ja, dann ermittelst Du das Feld und rufst dann ggf. auf dem Feld etwas auf.
 
Java:
        this.Bauer = this;
Was soll diese Zeile im Bauer Konstruktor machen? Ist so auf jeden Fall Quatsch.

Etwas später im Konstruktor:
Java:
        Schachfeld.setArray(Feld, color);

Feld ist aber im Konstruktor nicht gesetzt worden. Der Thread, den Du startest, der verändert das aber das sieht extrem dubios aus und riecht etwas nach racing conditions.

Die ganze Struktur ist kaum lesbar. Naming Conventions einhalten ist existenziell um Code lesen zu können.
Dann Methoden sauber strukturieren - Dein thread ist extrem unleserlich.

Und wozu die ganzen Threads? Schachspiel und das ist ein Bauer? Und der hat 2 Threads? Wie viele Threads sollen denn da laufen bei 16 Bauern? Das sieht nicht überlegt aus.

Ohne die Lib kann ich den Code nicht übersetzen. Dadurch kann ich Dir nicht helfen.

Was meldet denn der Compiler für einen Fehler?
Ist das das, was der mir anzeigt, wenn ich auf übersetzen drücke?
Wenn ja, dann zeigt der mir nichts an und sagt die ganze zeit, dass er das übersetzen würde, es aber nicht tut...
 
Vielleicht macht es Sinn, erst einmal einen Schritt zurück zu gehen um zu überlegen, was Du da überhaupt machen willst. Die vielen Threads sind Quatsch - das habe ich ja schon gesagt.

Du kannst gerne EINEN Thread machen. Der würde dann auf Nutzer-Eingaben warten (So es da kein Framework gibt, das bereits Events liefert). Da prüfst Du dann z.B. wurde die Maus gedrückt? Wenn ja, dann ermittelst Du das Feld und rufst dann ggf. auf dem Feld etwas auf.
Ich bin letztens erst in meine erste Programmiersprache, java, eingestiegen... Wie soll ich das machen, ohne eine Schleife zu machen?
 
gut... ich habe jetzt den noch ein bisschen weiterentwickelt
Java:
package Schachspiel;

import sum.kern.*;

public class Bauer
{
    private final Schach Schachfeld;
    Buntstift bst;
    Maus ms;
    KlickFeld G1;
    KlickFeld G2;
    KlickFeld L;
    KlickFeld R;
    thread thread;
    private int color;
    private int team;
    private int vpos;
    private int hpos;
    private int Feld;
    private int c;
    private int b;
    private int h;
    private int f;
    private boolean life = true;
    private boolean istGedrueckt = false;
    private int t;

    // Konstruktor
    public Bauer(int b, int h, int f, int t, Schach Schachfeld)
    {
        vpos = h;
        hpos = b;
        this.b = b + 20;
        this.h = h + 80;
        this.f = f;
        this.t = t;
        this.Schachfeld = Schachfeld;
        ms = new Maus();
        bst = new Buntstift();
        this.zeichne();
        Schachfeld.setArray(Feld, color);
        this.Felder();
        thread = new thread();
        thread.start();
    }
        public void zeichne() {
        
        bst.bewegeBis(b, h);
        bst.setzeFuellMuster(0);
        color = f;
        team = t;
        if(f==1) {
            bst.setzeFarbe(3);
        }
            else {
                bst.setzeFarbe(6);
            }   
        Feld = (hpos/100)+(vpos/100*8);
        System.out.println(Feld);
        if(color != team) {
                c *= -1;
            }
            
        bst.runter();
        bst.bewegeUm(60);
        bst.dreheUm(90);
        bst.bewegeUm(10);
        bst.dreheUm(45);
        bst.bewegeUm(30);
        bst.dreheBis(0);
        bst.bewegeUm(10);
        bst.dreheUm(65);
        bst.bewegeUm(10);
        bst.dreheBis(135);
        bst.bewegeUm(10);
        bst.dreheBis(0);
        bst.bewegeUm(-5);
        bst.hoch();
        bst.bewegeUm(-10);
        bst.dreheUm(90);
        bst.bewegeUm(10);
        bst.dreheBis(0);
        bst.runter();
        bst.zeichneKreis(15);
        
        bst.hoch();
        bst.bewegeBis(b, h);
        bst.runter();
        bst.dreheUm(90);
        bst.bewegeUm(10);
        bst.dreheUm(-45);
        bst.bewegeUm(30);
        bst.dreheBis(0);
        bst.bewegeUm(-10);
        bst.dreheUm(115);
        bst.bewegeUm(10);
        bst.dreheBis(45);
        bst.bewegeUm(10);
        bst.dreheBis(0);
        bst.bewegeUm(5);
        bst.hoch();
        
    }
    class thread extends Thread {
        public void run() {
            while(life == true) {
                if(ms.istGedrueckt()) {
                    if(ms.hPosition() >= (hpos+1)) {
                        System.out.println("1");
                        if(ms.hPosition() <= (hpos + 99)) {
                            System.out.println("2");
                            if(ms.vPosition() >= (vpos+1)) {
                                System.out.println("3");
                                if(ms.vPosition() <= (vpos + 99)) {
                                    if(color==team) {
                                        istGedrueckt = true;
                                        System.out.println("Feld " + Feld + " gedrueckt!");
                                        //this.erscheine();
                                    }
                                }
                                else {
                                    istGedrueckt = false;
                                }
                            }
                            else {
                                istGedrueckt = false;
                            }
                        }
                        else {
                            istGedrueckt = false;
                        }
                    }
                    else {
                        istGedrueckt = false;
                    }
                }
                if(istGedrueckt == true) {
                    //System.out.println("Feld " + Feld + " gedrueckt!");
                }
                /**
                if(G1.istGedrueckt() == true) {
                    this.bewegeGerade(1);
                }
                if(G2.istGedrueckt() == true) {
                    this.bewegeGerade(2);
                }
                if(L.istGedrueckt() == true) {
                    this.schlageLinks();
                }
                if(R.istGedrueckt() == true) {
                    this.schlageRechts();
                }
                **/
            }
        }
    }
    
    public void Felder() {
        
        G1 = new KlickFeld(hpos, vpos - 100*c, color, team, 0, Schachfeld);
        G1.setzeBauer(this);
        G2 = new KlickFeld(hpos, vpos - 200*c, color, team, 0, Schachfeld);
        G2.setzeBauer(this);
        L = new KlickFeld(hpos - 100, vpos - 100*c, color, team, 1, Schachfeld);
        L.setzeBauer(this);
        R = new KlickFeld(hpos + 100, vpos - 100*c, color, team, 1, Schachfeld);
        R.setzeBauer(this);
    }
    public void erscheine() {
        if(Schachfeld.getArrayColor(Feld - 8*c) == 0) {
            G1.erscheine();
                if(Schachfeld.getArrayColor(Feld - 16*c) == 0) {
                    G2.erscheine();
            }
        }
        if(Schachfeld.getArrayColor(Feld - 8*c - 1) != team) {
             if(Schachfeld.getArrayColor(Feld - 8*c - 1) != 0) {
                 L.erscheine();
            }
        }
        if(Schachfeld.getArrayColor(Feld - 8*c + 1) != team) {
             if(Schachfeld.getArrayColor(Feld - 8*c + 1) != 0) {
                 R.erscheine();
            }
        }
    }
    public void BewegeGerade(int b) {
            
            vpos -= 100*b*c;
            Schachfeld.Figuren();
    }
    public void SchlageLinks() {
        
            vpos -= 100*c;
            hpos -= 100;
            Schachfeld.Figuren();
    }
    public void SchlageRechts() {
      
            vpos -= 100*c;
            hpos += 100;
            Schachfeld.Figuren();
    }
    public int getVPose() {
        return vpos;
    }
    public int getHPose() {
        return hpos;
    }
    public boolean getLife() {
        return life;
    }
    public void setLife() {
        life = false;
    }
    public int getFeld() {
        return Feld;
    }
    public int getColor() {
        return color;
    }
}
 

Jw456

Top Contributor
Wiso eigentlich vor jedem Methoden Aufruf das this?
Du bist in einem Thread und wohin zeigt jetzt das this?

Wenn dann den kompletten Namen der Klasse.
 

Jw456

Top Contributor
Du bist in einer inneren Klasse im einem Thread nicht in der außen Klassen.
Willst aber etwas aus der außen Klasse aufrufen. Da ist this falsch.

PS. Das this zeigt in dem Moment wenn maximal auf deine innere Klasse.
 
Zuletzt bearbeitet:

kneitzel

Top Contributor
Also nur um den Punkt noch einmal deutlich zu machen, den @Jw456 angesprochen hat:

Du hast eine äußere und eine innere Klasse. Wenn die innere Klasse nicht static ist, dann hat die einen direkten Bezug zur äußeren Klasse und kann Methoden aufrufen. this verweist aber auf die Instanz der äußeren Klasse. Wenn man explizit die äußere Instanz haben will, dann kann man den KlassenNamen.this schreiben.

Konkretes Beispiel

Java:
public class OuterClass {

    class InnerClass {
        public void doSomethingInInnerClass() {
            this.innerClassMethod();
            OuterClass.this.outerClassMethod();

            innerClassMethod();
            outerClassMethod();
        }

        public void innerClassMethod() {
            System.out.println("innerClassMathod!");
        }
    }

    public void outerClassMethod() {
        System.out.println("outerClassMathod!");
    }

    public static void main(String[] args) {
        new OuterClass().doSomethingInOuterClass();
    }

    public void doSomethingInOuterClass() {
        InnerClass innerClass = new InnerClass();
        innerClass.doSomethingInInnerClass();
    }
}

Was kann man hier alles sehen?
a) OuterClass hat eine InnerClass.
b) Um von InnerClass eine Instanz zu erzeugen muss man in einer Instanzmethode sein. Eine Klassenmethode funktioniert nicht (Der Code aus doSomethingInOuterClass kann also nicht innerhalb der main ausgeführt werden!)
c) Zugriff auf Methoden innerhalb der inneren Klasse: Man kann in doSomethingInInnerClass zwei mal die gleichen Aufrufe sehen: Einmal mit this und einmal ohne this. Beides funktioniert.

Tipps für das Vorgehen:
a) Gerade am Anfang würde ich sagen: Das Nutzen von inneren Klassen ist zu 99% aller Fälle ein Zeichen für ein schlechtes Design. Gerade am Anfang sollte man sich dazu zwingen, auf innere Klassen zu verzichten. (Selbst auf die Anonymen Inneren Klassen!)
b) this würde ich generell nur sehr spärlich verwenden. Das kommt in der Regel bei mir nur in Settern zum Einsatz. Das macht den Code deutlich lesbarer.
 

kneitzel

Top Contributor
Also Schleife ist prinzipiell ok - das Problem ist aber eher, dass Du da für jede Spielfigur Threads erstellst und diese dann massiv CPU fressen.

So eine Schleife sollte eigentlich blockieren, wenn nichts zu tun ist. Dann wird keine CPU verballert und das Betriebssystem triggert das dann von außen und weckt den Thread auf.
Wenn so ein blockieren nicht geht, dann sollte so ein Thread von Zeit zu Zeit etwas schlafen. Wenn nichts zu tun ist, dann mach ein Thread.sleep(100) um 1/10 Sekunde zu schlafen. Sowas merkt der Anwender nicht und das ist schon viel aus Sicht der CPU.

Aber wichtig ist mein Hinweis das anders zu strukturieren.
Die Kontrolle sollte also zentral sein. Dann hättest Du einen Thread, der prüft, ob Eingaben vorhanden sind.
Auch beim Zeichen: Das macht ein Thread und der geht das Spielfeld durch und malt das Spielfeld. Und das kann auch durchaus der Thread sein, der die Eingaben verwaltet. Es wird dann nur gemalt, wenn es notwendig ist, also z.B. der Anwender die Maus gedrückt hat oder so.
 

Jw456

Top Contributor
Du solltest nicht schlafen wenn eine Aktion gerade läuft also wenn ein Klick erfolgt ist. Wenn nichts passiert am Ende der while kannst kurtz schlafen.
 

Jw456

Top Contributor
ah, also sollte ich einfach eine Schleife machen, die immer wieder sleept und dann, wenn ich geklickt habe, die andere Funktion ausführt?
Wie bekommst du denn überhaupt mit das geklickt wurde?
Du machst es so wie es ausschaut nicht event listener gesteuert. Sieht mir mehr nach ständigen polling aus.

Deshalb wurde wohl auch das kurze Schlafen am ende einer Aktion empfohlen.
 

Jw456

Top Contributor
Du prüft bei jeden while schleifen für Durchgang ob gekickt wurde. Also ein polling.
Wenn nicht geklickt wurde kasst du kurtz schlafen.
 

Jw456

Top Contributor
Polling ein ständiges wider holen, eine endlos Schleife die immer wider prüft ob eine Änderung eingetreten ist.
Wenn das ohne ein Warten gemacht wird ist die CPU nur mit deiner Schleife beschäftigt und hat keine Zeit für andrer Aufgaben. Genau wie dei dir.
 

Jw456

Top Contributor
Gehe doch mal zu einer Version zurück die funktionierte und baue dort in den Thread bei dem prüfen auf geklickt im Else Zweig ein kutzes warten ein.
Schaue ob dein Spiel besser läuft.
 

kneitzel

Top Contributor
Versuch immer eine Sache nach dem Anderen zu machen. Du scheinst Dich derzeit mit mehreren Dingen gleichzeitig herum zu schlagen und das ist nie wirklich gut.

Also vergiss die Prüfung, ob ein Mausklick funktioniert. Sieh erst einmal zu, dass Du die Felder richtig darstellen kannst. Das ist eine Grundvoraussetzung für alles Weitere!

Wenn Du es schaffst, alle Felder richtig darzustellen, dann wirst du hoffentlich genau wissen, von wo bis wo welches Feld geht. Denn das brauchst Du dann ja, um zu ermitteln, auf welches Feld geklickt wurde.

Aber halt ganz wichtig: Du brauchst ein vernünftiges Model - was für Klassen brauchst Du? Wie arbeiten die Instanzen der einzelnen Klassen zusammen? Was für ein Zustand muss welches Objekt haben können und was für Ein Verhalten muss es haben? Das ist existenziell, damit eben nicht Dinge an falsche Stellen gepackt werden. Diese Struktur muss man sich (zumindest in den Teilen, die man implementieren will) immer vor der ersten Zeile Code überlegen!
 
Ich habe auch mal einfach für alle die Klickfelder erstellt, doch nur eins ist erschienen...
Der ganze Bauer Code nochmal:
package Schachspiel;

import sum.kern.*;

public class Bauer
{
    private final Schach Schachfeld;
    Buntstift bst;
    Maus ms;
    private KlickFeld G1;
    private KlickFeld G2;
    private KlickFeld L;
    private KlickFeld R;
    zeichne zeichne;
    private int color;
    private int team;
    private int vpos;
    private int hpos;
    private int Feld;
    private int c;
    private int b;
    private int h;
    private int f;
    private boolean life = true;
    private boolean istGedrueckt = false;
    private int t;

    // Konstruktor
    public Bauer(int b, int h, int f, int t, Schach Schachfeld)
    {
        this.b = b + 20;
        this.h = h + 80;
        this.f = f;
        this.t = t;
        c = 1;
        this.Schachfeld = Schachfeld;
        ms = new Maus();
        bst = new Buntstift();
        zeichne = new zeichne();
        zeichne.start();
        Schachfeld.setArray(Feld, color);
        Felder();
    }

    // Dienste
    class zeichne extends Thread {
        public void run() {
            // Aktionsteil
            vpos = h - h % 100 ;
            hpos = b - b % 100 ;

            bst.bewegeBis(b, h);
            bst.setzeFuellMuster(0);
            color = f;
            team = t;
            if(f==1) {
                bst.setzeFarbe(3);
            }
            else {
                bst.setzeFarbe(6);
            }
            Feld = (hpos/100)+(vpos/100*8);
            System.out.println(Feld);
            if(color != team) {
                c *= -1;
            }

            bst.runter();
            bst.bewegeUm(60);
            bst.dreheUm(90);
            bst.bewegeUm(10);
            bst.dreheUm(45);
            bst.bewegeUm(30);
            bst.dreheBis(0);
            bst.bewegeUm(10);
            bst.dreheUm(65);
            bst.bewegeUm(10);
            bst.dreheBis(135);
            bst.bewegeUm(10);
            bst.dreheBis(0);
            bst.bewegeUm(-5);
            bst.hoch();
            bst.bewegeUm(-10);
            bst.dreheUm(90);
            bst.bewegeUm(10);
            bst.dreheBis(0);
            bst.runter();
            bst.zeichneKreis(15);

            bst.hoch();
            bst.bewegeBis(b, h);
            bst.runter();
            bst.dreheUm(90);
            bst.bewegeUm(10);
            bst.dreheUm(-45);
            bst.bewegeUm(30);
            bst.dreheBis(0);
            bst.bewegeUm(-10);
            bst.dreheUm(115);
            bst.bewegeUm(10);
            bst.dreheBis(45);
            bst.bewegeUm(10);
            bst.dreheBis(0);
            bst.bewegeUm(5);
            bst.hoch();
            
            while(life == true) {
                if(ms.istGedrueckt()) {
                    click();
                }
                else try {
                    Thread.sleep(100);
                }
                catch(InterruptedException e){       
                }
            }
        }
    }
    public void click() {
        if(ms.hPosition() >= (hpos+1)) {
            if(ms.hPosition() <= (hpos + 99)) {
                if(ms.vPosition() >= (vpos+1)) {
                    if(ms.vPosition() <= (vpos + 99)) {
                        if(color==team) {
                            istGedrueckt = true;
                            System.out.println("Feld " + Feld + " gedrueckt!");
                            erscheine();
                        }
                    }
                    else {
                        istGedrueckt = false;
                    }
                }
                else {
                    istGedrueckt = false;
                }
            }
            else {
                istGedrueckt = false;
            }
        }
        else {
            istGedrueckt = false;
        }
        if(istGedrueckt == true) {
          
        }
        if(G1.istGedrueckt() == true) {
            System.out.println("G1 Gedrueckte!");
            BewegeGerade(1);
            G1.nichtGedrueckt();
        }
        if(G2.istGedrueckt() == true) {
            System.out.println("G2 Gedrueckte!");
            BewegeGerade(2);
            G2.nichtGedrueckt();
        }
        if(L.istGedrueckt() == true) {
            System.out.println("L Gedrueckte!");
            SchlageLinks();
            L.nichtGedrueckt();
        }
        if(R.istGedrueckt() == true) {
            System.out.println("G1 Gedrueckte!");
            SchlageRechts();
            R.nichtGedrueckt();
        }
    }
    public void Felder() {
        G1 = new KlickFeld(hpos, vpos - 100*c, color, team, 0, Schachfeld);
        G1.setzeBauer(this);
        G2 = new KlickFeld(hpos, vpos - 200*c, color, team, 0, Schachfeld);
        G2.setzeBauer(this);
        L = new KlickFeld(hpos - 100, vpos - 100*c, color, team, 1, Schachfeld);
        L.setzeBauer(this);
        R = new KlickFeld(hpos + 100, vpos - 100*c, color, team, 1, Schachfeld);
        R.setzeBauer(this);
        erscheine();
    }
    public void erscheine() {
        System.out.println(Feld + " und " + (Feld - 8*c) + " = " + Schachfeld.getArrayColor(Feld - 8*c));
        if(Schachfeld.getArrayColor(Feld - 8*c) == 0) {
            G1.erscheine();
            System.out.println("erscheine!");
            if(Schachfeld.getStartPosFig(Feld) == 1) {
                if(Schachfeld.getArrayColor(Feld - 16*c) == 0) {
                    G2.erscheine();
                }
            }
        }
        if(Schachfeld.getArrayColor(Feld - 8*c - 1) != team) {
            if(Schachfeld.getArrayColor(Feld - 8*c - 1) != 0) {
                L.erscheine();
            }
            if(Schachfeld.getArrayColor(Feld - 8*c + 1) != 0) {
                R.erscheine();
            }
        }
    }
    public void BewegeGerade(int b) {
        vpos -= 100*b*c;
        Schachfeld.Figuren();
    }
    public void SchlageLinks() {

        vpos -= 100*c;
        hpos -= 100;
        Schachfeld.Figuren();
    }
    public void SchlageRechts() {

        vpos -= 100*c;
        hpos += 100;
        Schachfeld.Figuren();
    }
    public int getVPose() {
        return vpos;
    }
    public int getHPose() {
        return hpos;
    }
    public boolean getLife() {
        return life;
    }
    public void setLife() {
        life = false;
    }
    public int getFeld() {
        return Feld;
    }
    public int getColor() {
        return color;
    }
}
KlickFeld:
package Schachspiel;
import sum.kern.*;

public class KlickFeld
{
    private final Schach Schachfeld;
    Buntstift bst;
    Maus ms;
    thread thread;
    private int color;
    private int team;
    private int vpos;
    private int hpos;
    private int Feld;
    private boolean life = true;
    private boolean istGedrueckt = false;
    private boolean zeichne;
    private int T;
    private int b;
    private int h;
    private int f;
    private int t;
    private int a;
    private Bauer Bauer;
    private Laeufer Laeufer;
    private Springer Springer;
    private Turm Turm;
    private Koenig Koenig;
    private Dame Dame;

    // Konstruktor
    public KlickFeld(int B, int H, int F, int T, int a, Schach Schachfeld)
    {
        b = B+50;
        h = H+50;
        f = F;
        t = T;
        this.a = a;
        this.Schachfeld = Schachfeld;
        ms = new Maus();
        bst = new Buntstift();
        Schachfeld.setAttackArray(Feld, color);
    }
    public void erscheine() {
        this.zeichne();
        Schachfeld.setAttackArray(Feld, color);
        thread = new thread();
        thread.start();
    }
    public void setzeBauer(Bauer Figur){
        Bauer = Figur;
    }
    public void setzeTurm(Turm Figur){
        Turm = Figur;
    }
    public void setzeLauefer(Laeufer Figur){
        Laeufer = Figur;
    }
    public void setzeSpringer(Springer Figur){
        Springer = Figur;
    }
    public void setzeKoenig(Koenig Figur){
        Koenig = Figur;
    }
    public void setzeDame(Dame Figur){
        Dame = Figur;
    }
    public void zeichne()
    {
        // Aktionsteil
        
        vpos = h - h % 100 ;
        hpos = b - b % 100 ;
        
        bst.bewegeBis(b, h);
        bst.setzeFuellMuster(2);
        color = f;
        team = t;
        Feld = (hpos/100)+(vpos/100*8);
       if(Schachfeld.getArrayColor(Feld) == 0) {
           bst.setzeFarbe(5);
        }
        else if(Schachfeld.getArrayColor(Feld) == color) {
            zeichne = false;
        }
        else {
            bst.setzeFarbe(10);
        }
        
        System.out.println("Klickfeld + " + Feld);
        
        bst.zeichneKreis(30);
        
        // Aufraeumen
    }
    class thread extends Thread {
        public void run() {
            while(life = true) {
                if(ms.istGedrueckt()) {
                    if(ms.hPosition() >= (hpos+1)) {
                        if(ms.hPosition() <= (hpos + 99)) {
                            if(ms.vPosition() >= (vpos+1)) {
                                if(ms.vPosition() <= (vpos + 99)) {
                                    if(color==team) {
                                        istGedrueckt = true;
                                        System.out.println("Feld " + Feld + " gedrueckt!");
                                    }
                                }
                                else {
                                    istGedrueckt = false;
                                }
                            }
                            else {
                                istGedrueckt = false;
                            }
                        }
                        else {
                            istGedrueckt = false;
                        }
                    }
                    else {
                        istGedrueckt = false;
                    }
                }
                
                if(istGedrueckt == true) {
                    //System.out.println("Feld " + Feld + " gedrueckt!");
                }
            }
        }
    }
    public boolean istGedrueckt() {
        return istGedrueckt;
    }
    public void nichtGedrueckt() {
        istGedrueckt = false;
    }
    public int getVPose() {
        return vpos;
    }
    public int getHPose() {
        return hpos;
    }
    public boolean getLife() {
        return life;
    }
    public void setLife() {
        life = false;
    }
    public int getFeld() {
        return Feld;
    }
    public int getColor() {
        return color;
    }
}
 

Jw456

Top Contributor
Ich weiß nicht ob das was du hier machen willst zum ziel führen wird.
Du willst so etwas sie Schach machen.

Was brauchst und hast du da ein Brett mit Feldern wo die Figuren drauf stehen.
Also eine Klasse mir Felder. Und Figuren.
Etwas was die Kontrolle übernimmt ob und wo geklickt wurde.
Etwas was die konntrolle über das die Spielregeln übernimmt.
Natürlich auch die zwei Spieler.
......


Das sind einpaar wenige ansetze für das Spiel.

Vielleicht erst mal Brett erstellen und die Auswertung welches Feld geblickt wurde.

Was du machst ist keine gute Auswertung denn du machst in jedem Feld eine eigene Polling abfrage der Maus ob geklickt wurde .
 
naja... ich besitze alle Figuren, ein Brett, kann die Figuren Bewegen...doch das ist ne gute Idee... ich gucke, in welchem Feld die Maus ist, dann brauche ich in der Schleife weniger
 

Jw456

Top Contributor
In deinen Code ist die Figur mit dem Feld verwachsen. Du scheinst die Figur mit dem Feld zu bewegen.

Nicht die Figur auf dem Board auf ein neues Feld zusetzen. So wie es beim realen Spiel auch ist das Board verändert sich ja nicht nur ein Feld ist mit einer Figur besetzt oder auch nicht.

In deinem Code scheint das anders zu sein.
 

kneitzel

Top Contributor
Du hast ein Spielfeld. Die Felder bleiben da, wo sie sind. Und du hast Spielfiguren. Die sind auf irgend welchen Feldern.

Das Klassendiagram sollte dies dann auch so abdecken meine ich. Und vor allem: Ich würde es komplett von der UI getrennt halten.

Das Spielfeld hat also die 8x8 Felder.
Jedes Feld kann eine oder keine Spielfigur beinhalten.
Jede Spielfigur gehört zu einem Spieler / hat eine Farbe (WEISS / SCHWARZ)
Jede Spielfigur im Spiel steht auf einem Feld /hat Koordinaten.
Jede Spielfigur hat einen Typ (Bauer, Turm, Springer, Läufer, Dame, König)
Jeder SpielfigurenTyp hat eine bestimmte Art sich zu bewegen.

Damit kann man sich schon das eigentliche Schachspiel aufbauen. Man hat noch keine Oberfläche oder so, aber man kann alles z.B. mit Unittests austesten.

Die Oberfläche selbst kommt erst jetzt ins Spiel. Das Feld muss irgendwie dargestellt werden können. Dabei werden auch die Figuren auf den Feldern gemalt. Und irgend eine Eingabe wird entgegen genommen um dann darauf irgendwie zu reagieren.

Als Schachschule kann man z.B. überlegen: Wenn ein Feld angeklickt wird, dann werden alle Figuren rot umrandet, die auf dieses Feld ziehen könnten (so sie dran wären) und wenn auf dem Feld eine Figur steht, werden alle Zielfelder dieser Figur Grün umrandet.
(Nur um einfach ein mögliches Feature zu nennen).

Aber wichtig ist halt generell eine saubere Aufteilung in sinnvolle Pakete. Halt das, was Du auch in der Realität hast. Die Erstellung von universellen Modulen, die dann zusammen arbeiten.

Und hier stelle ich mir gerade die Frage, ob Du noch auf einem sinnvollen Weg bist, der Dich weiter bringt und der Dir hilft voran zu kommen. Ich kenne die Möglichkeiten von BlueJ nicht, aber dieses "ich male auf komplexe Art und Weise eine Figur, indem ich einen "Bleistift" bewege" und ggf ein "Ich baue mir eine Main Loop, in der ich dann Rohdaten umwandle in Events" nicht wirklich für zielführend. Ich sehe hier eine gewisse Grenze erreicht in der ich sage: Ja, das ist eine tolle Übung um irgendwelche Grundlagen zu vertiefen.
Ich mag der Entwicklungsumgebung BlueJ jetzt Unrecht antun, aber so eine Übung sähe ich eher mit einer IDE und dann mit Swing oder so umgesetzt. Ggf. bei/nach einem Lesen des Buches "Entwurfsmuster von Kopf bis Fuß".
Hintergrund ist, dass Du jetzt zu dem Bereich vordringst, wie gewisse Dinge strukturiert werden können um sauberen, wartbaren Code zu bekommen. Da gibt es super Bücher zu und sprengt leider den Umfang eines Forums.
 

Neumi5694

Top Contributor
Ich habe das so gelernt, dass this. heißt, dass es in der gleichen Klasse ist...
Nur als kleine Anmerkung: "this" beschreibt nicht die gleiche Klasse, sondern die selbe Instanz. Das ist ein kleiner aber feiner Unterschied.

Wenn du nichts vor einen Methoden- oder Variablenaufruf schreibst, wird immer "this" davor gesetzt, es sei denn, es gibt z.B. eine lokale Variable, welche die Klassenvariable verdeckt.

Manchmal ist es tatsächlich angenehmer, im Code "this" stehen zu haben, wenn man z.B. mit 2 verschiedenen Objekten des selben Typs arbeitet (Musterbeispiel equals(...)). Aber notwendig ist "this" im Normalfall nicht.
 

EinNickname9

Bekanntes Mitglied
Eigentlich ist thus an Stellen, an denen es nicht notwendig ist, ein Anti-Pattern. ;)
Ob die Lesbarkeit erhöht wird durch die Länge und das einheitliche Muster, ist etwas fragwürdig.
 

Oneixee5

Top Contributor
Codestyles und Anti-Pattern ist ein riesiger Unterschied. In Unternehmen spielt sowas eine untergeordnete Rolle, da Codestyles meist automatisch durchgesetzt werden bzw. bei Abweichungen landet der Code einfach nicht in einem höherwertigen Zweig des Repos. Anti-Pattern, sind Codeteile die möglicherweise Fehler verursachen oder anderweitig für Probleme sorgen können. Darunter zählt ein überflüssiges this ganz bestimmt nicht.
Obwohl es manchmal ganz erstaunlich ist, was man manchmal so an Code(style) zu sehen bekommt o_O
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
NicoDeluxe RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
M Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
L Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
L Direktes return eines Array geht nicht Allgemeine Java-Themen 20
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
R Threads Clip loop loopt nicht Allgemeine Java-Themen 2
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
NicoDeluxe JMS Messages nicht abgeholt Allgemeine Java-Themen 0
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
W Javac nicht bei Installation installiert Allgemeine Java-Themen 9
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Java.exe exestiert, aber irgendwie auch nicht Allgemeine Java-Themen 11
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
Drachenbauer Division mit Int funktioniert nicht Allgemeine Java-Themen 3
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
I Vererbung Nicht erklärliche NullPointerException Allgemeine Java-Themen 7
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
O docx-Datei erzeugung mit DocXStamper funktioniert nicht Allgemeine Java-Themen 2
B Java Mail: Prüfen, ob Email hat ein Anhang oder nicht Allgemeine Java-Themen 2
F Scrollbar wird nicht angezeigt Allgemeine Java-Themen 0
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
F URI mit Parameter klappt nicht Allgemeine Java-Themen 1
B Mail: Nicht vorhandener Empfänger ermitteln Allgemeine Java-Themen 4
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
J JTextField nicht editierbar Allgemeine Java-Themen 5
X Files.walkFileTree zählt nicht richtig Allgemeine Java-Themen 2
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
X Eclipse Kann fann/j nicht in Eclipse linken... Allgemeine Java-Themen 6
A Eclipse Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 7
T JSoup findet input Feld nicht?! Wie kann ich das Feld finden? Allgemeine Java-Themen 3
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
Trèfle Excel-Datei nicht speicherbar, da von Java zum Bearbeiten gesperrt. Allgemeine Java-Themen 3
L Tesseract-OCR 4.0 unter Linux funktioniert nicht Allgemeine Java-Themen 3
G JPanel lädt nicht?! Allgemeine Java-Themen 20
A Variablen Funktion übergibt den Wert nicht Allgemeine Java-Themen 13
coolian lwjgl GLContextCurrent existiert nicht? Allgemeine Java-Themen 2
D Compiler-Fehler JavaFX - Bekomme Fehlermeldungen nicht weg Allgemeine Java-Themen 31
coolian Methoden warum funktonirt das nicht? Allgemeine Java-Themen 8
A Finde den Fehler nicht. Allgemeine Java-Themen 7
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
J Neuronales Netz funktioniert mal und mal nicht. Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
I Modelio kann nicht geöffnet werden Allgemeine Java-Themen 3
E Socket Java Socket Antwortet nicht. Allgemeine Java-Themen 2
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
P Erste Schritte HauptFrame geht nicht Allgemeine Java-Themen 7
N Programm startet nicht, nur per cmd Allgemeine Java-Themen 5
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
K Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
A Methodenaufruf funktioniert nicht richtig Allgemeine Java-Themen 5
H .jar Datei startet nicht richtig bei Doppelklick Allgemeine Java-Themen 11
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben