nicht einsehbarer Fehler im code, kann nicht mehr übersetzten

NicoHatProbleme2

Bekanntes Mitglied
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.
 
K

kneitzel

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

NicoHatProbleme2

Bekanntes Mitglied
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...
 
K

kneitzel

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

kneitzel

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

NicoHatProbleme2

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

NicoHatProbleme2

Bekanntes Mitglied
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?
 

NicoHatProbleme2

Bekanntes Mitglied
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
Java:
this.bewegeGerade(1)
Wird aus einem Thread heraus nicht die Methode aufrufen.
Entweder nur bewegeGerade(1)
Oder davor der Klassenname.
 

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:
K

kneitzel

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

kneitzel

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

NicoHatProbleme2

Bekanntes Mitglied
Java:
if(ms.istGedrueckt()) {
                    click();
                }
                try{
                    Thread.sleep(10);
                }
                catch(InterruptedException e){       
                }

Aber ich glaube nicht, dass es dadurch kommt
 

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

kneitzel

Gast
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!
 

NicoHatProbleme2

Bekanntes Mitglied
Ich habe auch mal einfach für alle die Klickfelder erstellt, doch nur eins ist erschienen...
[CODE lang="java" title="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;
}
}[/CODE]
[CODE lang="java" title="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;
}
}[/CODE]
 

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 .
 

NicoHatProbleme2

Bekanntes Mitglied
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.
 
K

kneitzel

Gast
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
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand 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
MiMa Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
LimDul 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
LimDul 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
OnDemand 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

Ähnliche Java Themen

Neue Themen


Oben