BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren)

Hallo, ich suche Tipps:

a) wie kann ich das Pacman (Gif) automatisch in Sichtrichtung des Pacmans bewegen lassen kann (stehen bleibt wenn vor ihm Wand)(ohne Taste gedrückt),
-> ich könnte es wenn er die Wand schneiden würde, was er aber nicht tun sollte.

b) wie ich machen kann, dass der Pacman sich nur dreht wenn man 1. Pfeiltaste drückt UND 2. in dieser Richtung keine Wand ist.(Rechtecke)

c) wie ich einen Geist mache, der den Pacman automatisch verfolgt




Es wäre nett, wenn mir dies jemand zeigen würde.
A meinst sicherlich den Geist nicht den pacman.
Der pacman macht das doch. Du gibst in am Anfang die Richtung rechts und da ist eine Wand. Also wartet er.
 
A meinst sicherlich den Geist nicht den pacman.
Der pacman macht das doch. Du gibst in am Anfang die Richtung rechts und da ist eine Wand. Also wartet er.
Das ist #1 von diesem Thema. Das habe ich denke ich mit Konrad schon geklärt gehabt. Da hast du dich anscheinend verschaut.
Dann ändere die fester Größe in der Klasse Spiel.
Ah okay, mache ich.

Jedoch habe ich immer noch ein Problem: bei RandomMoves (GEIST): Der Geist dreht sich komisch und geht tendenziell immer in die selbe Richtung. Genauso wie Geist2. Ich will jedoch, dass er sich so bewegt wie Pacman, halt nur ohne Pfeiltasten (Quasi dass statt den Pfeiltasten eine Randomzahl=). Außerdem wollte ich noch eine Methode, die den Geist Pacman verfolgen lassen soll. Ich habe mir schon einige Gedanken gemacht, jedoch weiß ich nicht wie ich das umsetzen kann. Ich habe schon überlegt mit der Methode berechneAbstand() der Klasse BILD.
 
Java:
 //Methode in KLASSE GEIST (neuste Version): Soll prüfen ob pacman einen bestimmten GEIST (geist1, geist2) schneidet.
public void GeistWirdGefressen(GEIST geist){
        for(PACMAN r: pacman.pacman){ //<-- Hier Fehler
            if(Schneidet(r)){  //<-- Hier Fehler
                if(this.pacman.nenneVerwundbarkeit() == true){
                    this.geist1.setzeMittelpunkt(400, 300);  //<-- hier Fehler
                }
                else {
                    this.pacman.pacman.setzeMittelpunkt(315, 285);
                }
            }
        }
   }
 
Das ist #1 von diesem Thema. Das habe ich denke ich mit Konrad schon geklärt gehabt. Da hast du dich anscheinend verschaut.

Ah okay, mache ich.

Jedoch habe ich immer noch ein Problem: bei RandomMoves (GEIST): Der Geist dreht sich komisch und geht tendenziell immer in die selbe Richtung. Genauso wie Geist2. Ich will jedoch, dass er sich so bewegt wie Pacman, halt nur ohne Pfeiltasten (Quasi dass statt den Pfeiltasten eine Randomzahl=). Außerdem wollte ich noch eine Methode, die den Geist Pacman verfolgen lassen soll. Ich habe mir schon einige Gedanken gemacht, jedoch weiß ich nicht wie ich das umsetzen kann. Ich habe schon überlegt mit der Methode berechneAbstand() der Klasse BILD.
Das habe ich auch gesagt wenn du in der Geist Klasse prüfen willst ob der pacman den Geist berührt brauchst du die Instanz des Pacman in der Geist Klasse. Die du nicht hast.

Teste das in der labyrinth Klasse da hast du beide Instanzen Geist und pacman.
 
Zuletzt bearbeitet:
Das habe ich auch gesagt wenn du in der Geist Klasse prüfen willst ob der pacman den Geist berührt brauchst du die Instanz des Pacman in der Geist Klasse. Die du nicht hast.

Teste das in der labyrinth Klasse da hast du beide Instanzen Geist und pacman.
Ah sorry, da habe ich einen Fehler gemacht. Obriges ist schon in Klasse LABYRINTH. Trotzdem treten diese Fehler auf. (Jetzt nurnoch bei Schneidet und PACMAN: r)
 
In der labyrinth Klasse musst du das scheiden des pacman auch so prüfen wie mit deinem Rechteck.
Du brauchst dazu aber vom Geist das Raum Objekt (Bild) da du das privat hast musst du einen getter dafür machen. In der Geist Klasse.

Tipp eine for Schleife brauchst du hier nicht. Deine Geister sind ja nicht in einem Array oder Liste.
 
Diesen getter habe ich doch schon in der Klasse Geist:
Java:
public boolean Schneidet(Raum raum){
        return this.geist.beruehrt(raum);
    }

Java:
 public void GeistWirdGefressen(BILD geist){
        for (PACMAN r: pacman){   //<-- Fehler bei "pacman"
            if(geist1.Schneidet(r)){  //<-- bei "r" Fehlermeldung: incompatible types: PACMAN cannot be converted to ae.raum
                if(this.pacman.nenneVerwundbarkeit() == true){
                    this.geist1.setzeMittelpunkt(400, 300);
                }
                else {
                    this.pacman.pacman.setzeMittelpunkt(315, 285);
                }
            }
        }
   }
 
Zuletzt bearbeitet:
Nein ich bin am Handy coden hier nein.

Java:
if(packman.Schneidet(geist1.und hier der getter vom Geist )){ //<-
 
Java:
public class GEIST
 
 
{
 
 
    private BILD geist;

// ist ja nicht puplic also getter machen oder auf puplic ändern.

Dein pacman ist ja puplic.
 
Diesen getter habe ich doch schon in der Klasse Geist:
Java:
public boolean Schneidet(Raum raum){
        return this.geist.beruehrt(raum);
    }

Java:
 public void GeistWirdGefressen(BILD geist){
        for (PACMAN r: pacman){   //<-- Fehler bei "pacman"
            if(geist1.Schneidet(r)){  //<-- bei "r" Fehlermeldung: incompatible types: PACMAN cannot be converted to ae.raum
                if(this.pacman.nenneVerwundbarkeit() == true){
                    this.geist1.setzeMittelpunkt(400, 300);
                }
                else {
                    this.pacman.pacman.setzeMittelpunkt(315, 285);
                }
            }
        }
   }
Nein hast du nicht.
 
Java:
 @Override
    public void tick(){
        this.PacmanVerschieben();
        this.geist1.RandomMoves();
        this.geist2.RandomMoves();

        // TEST
        if (links) {
            System.out.println("Richtung: " + Richtung);
            System.out.println("neu: links");
        } else if (rechts) {
            System.out.println("Richtung: " + Richtung);
            System.out.println("neu: rechts");
        } else if (oben) {
            System.out.println("Richtung: " + Richtung);
            System.out.println("neu: oben");
        } else if (unten) {
            System.out.println("Richtung: " + Richtung);
            System.out.println("neu: unten");
        }
    
        if(GeistWirdGefressen(geist1) || GeistWirdGefressen(geist2)){
            // Game Over
        
        }
        

    }

  public void GeistWirdGefressen(GEIST geist){
     // wenn du das hier mit einer For prüfen willst musst du die Geister in  ein Attay oder Liste packen
                                  
            if(pacman.Schneidet(geist.getGeist())){
                if(this.pacman.nenneVerwundbarkeit() == true){
                    geist.setzeMittelpunkt(400, 300);
                    return true; // Du musst wissen was hier richtig ist True oder False
                }
                else {
                    this.pacman.pacman.sesetzeMittelpunkt(315, 285);
                    return false;  // Du musst wissen was hier richtig ist True oder False
                }
            }
    
   }
Klasse Geist

Java:
import ea.*;
/**
 * Beschreiben Sie hier die Klasse GEIST.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */
public class GEIST
{
    private BILD geist;
    private String Richtung;
    //Benötigt für Prüfung der Schneidungen
    private LEVEL Levelprüfung;
    private PACMAN pacmanprüfung;

    //Legt die zukünftige gewollte Richtung vom Geist fest.
    private boolean rechts;
    private boolean links;
    private boolean oben;
    private boolean unten;

    public GEIST(){
        this.geist = new BILD(285,225,"GEIST.gif");
        this.Levelprüfung = new LEVEL();  // falsch das ist nicht das Objekt was in LABYRINTH erstellt wurde.
        this.pacmanprüfung = new PACMAN();  // falsch das ist ein neues Objekt nicht der Pacman der in LABYRINTH erstellt wurde.
        this.pacmanprüfung.SetzeSichtbar(false); 

    
        // Gibt dem Geist eine Random Anfangsrichtung
        int Zahl1 = this.RandomZahl(4);
        if (Zahl1 == 1){
            this.Richtung = "rechts";
        }
        else if (Zahl1 == 2){
            this.Richtung = "links";
        }
        else if (Zahl1 == 3){
            this.Richtung = "oben";
        }
        else if (Zahl1 == 4){
            this.Richtung = "unten";
        }
    }

// getter da dein Bild private ist, dein Pacman in der Klasse Pacman ist public deshalb getter.
public Bild getGeist(){     
    return geist;
}
 
Zuletzt bearbeitet:
Java:
    Klaus123456789 hat gesagt.:
    Diesen getter habe ich doch schon in der Klasse Geist:
    Java:

public boolean Schneidet(Raum raum){
        return this.geist.beruehrt(raum);
    }


Java:

 public void GeistWirdGefressen(BILD geist){
        for (PACMAN r: pacman){   //was soll das du hast nur einen Pacman
            if(geist1.Schneidet(r)){  //r ist kein Raum objekt das ist dein Bild in der Klasse Pacman.
                   //r.pacman  ist das Raumobjekt aus der Klasse.
                   // da es public ist kannst du ohne getter darauf zugreifen.
               
                this.geist1.setzeMittelpunkt(400, 300);
                }
                else {
                    this.pacman.pacman.setzeMittelpunkt(315, 285);
                }
            }
        }
   }
 
Zuletzt bearbeitet:
Tipp am Rande gewöhne dir mal an Klassen am Anfang groß und Variablen klein zuschreiben.
Auch Methoden werden klein geschrieben . Damit weiss mann gleich was eine Klasse ist.
 
Hallo habe deine Geiste mal angepasst so sollten sie sich sinnvoller bewegen.

Nicht wie bei dir immer den Weg nach oben zum Rand suchen . Warum das so bei dir so solltest du selber erkennen .
Denn wenn eine Wand in Laufrichtung erkannt wurde, wurde immer als erster aufweicht der Weg nach oben genommen.

Dem Konstruktor der Klasse musst du jetzt auch das Layout was in der LABYRINTH Klasse erstellt wird mitgeben. Somit hat der Geist auch die richtige Labyrinth Instanz und keine neue.

Java:
import ea.*;

/**
 * Beschreiben Sie hier die Klasse GEIST.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */
public class GEIST {
    private BILD geist;
    private LEVEL Levelprüfung;
    private String Richtung;
    //Benötigt für Prüfung der Schneidungen


    int tickSteps = 0;

    public BILD getGeist() {
        return geist;
    }


    public GEIST(LEVEL level) {
        this.geist = new BILD(285, 225, "GEIST.gif");
        this.Levelprüfung = level;

        // Gibt dem Geist eine Random Anfangsrichtung
        setRandomRichtung();

    }

    public int RandomZahl(int maxZahl) {

        int zahl = (int) ((Math.random()) * maxZahl + 1);
        return zahl;
    }

    public void setRandomRichtung() {
        int Zahl1 = this.RandomZahl(4);
        if (Zahl1 == 1) {
            this.Richtung = "rechts";
        } else if (Zahl1 == 2) {
            this.Richtung = "links";
        } else if (Zahl1 == 3) {
            this.Richtung = "oben";
        } else if (Zahl1 == 4) {
            this.Richtung = "unten";
        }
    }

    public void DrehenAuf(int Winkel) {
        this.geist.setzeDrehwinkel(Winkel);
    }

    public void RandomMoves() {

        if (tickSteps > 30) {
            setRandomRichtung();
            tickSteps = 0;
        }
        tickSteps++;


        if (Richtung == "oben") {
            DrehenAuf(90);
            geist.verschiebenUm(0, -3);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(0, +3);

                geist.verschiebenUm(4, 0);
                if (testSchneiden(geist) == false) {
                    Richtung = "rechts";
                    geist.verschiebenUm(-4, 0);
                } else {
                    geist.verschiebenUm(-4, 0);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "links";
                        geist.verschiebenUm(4, 0);
                    } else {
                        DrehenAuf(270);
                        geist.verschiebenUm(0, 3);
                        Richtung = "unten";
                    }
                }
            }
        }

        if (Richtung == "unten") {
            DrehenAuf(270);
            geist.verschiebenUm(0, 3);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(0, -3);

                geist.verschiebenUm(4, 0);
                if (testSchneiden(geist) == false) {
                    Richtung = "rechts";
                    geist.verschiebenUm(-4, 0);
                } else {
                    geist.verschiebenUm(-4, 0);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "links";
                        geist.verschiebenUm(4, 0);
                    } else {
                        DrehenAuf(90);
                        geist.verschiebenUm(0, -3);
                        Richtung = "unten";
                    }
                }
            }
        }

        if (Richtung == "rechts") {
            DrehenAuf(270);
            geist.verschiebenUm(3, 0);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(-3, 0);

                geist.verschiebenUm(0, 4);
                if (testSchneiden(geist) == false) {
                    Richtung = "unten";
                    geist.verschiebenUm(0, -4);
                } else {
                    geist.verschiebenUm(0, -4);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "oben";
                        geist.verschiebenUm(0, 4);
                    } else {
                        DrehenAuf(90);
                        geist.verschiebenUm(-3, 0);
                        Richtung = "links";
                    }
                }
            }
        }


        if (Richtung == "links") {
            DrehenAuf(180);
            geist.verschiebenUm(-3, 0);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(3, 0);

                geist.verschiebenUm(0, 4);
                if (testSchneiden(geist) == false) {
                    Richtung = "unten";
                    geist.verschiebenUm(0, -4);
                } else {
                    geist.verschiebenUm(0, -4);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "oben";
                        geist.verschiebenUm(0, 4);
                    } else {
                        DrehenAuf(90);
                        geist.verschiebenUm(3, 0);
                        Richtung = "rechts";
                    }
                }
            }
        }

    }

    public boolean Schneidet(Raum raum) {
        return this.geist.beruehrt(raum);
    }

    public boolean testSchneiden(BILD geist) {
        //alle Rechtecke aus LEVEL werden geprüft
        for (RECHTECK r : Levelprüfung.wandstück) {
            //If Schleife: Geist-Schneidet Raum methode
            if (Schneidet(r)) {
                return true;
            }

        }
        return false;
    }


}

Tipp: halte dich an die Names Convention von Java . Das habe ich nicht angepasst.

 
Java:
    public GEIST(){
        this.geist = new BILD(285,225,"GEIST.gif");
        this.Levelprüfung = new LEVEL();  // falsch das ist nicht das Objekt was in LABYRINTH erstellt wurde.
        this.pacmanprüfung = new PACMAN();  // falsch das ist ein neues Objekt nicht der Pacman der in LABYRINTH erstellt wurde.
        this.pacmanprüfung.SetzeSichtbar(false);
Wie kann ich dies dann lösen? Zeile 3,4
 
Hallo habe deine Geiste mal angepasst so sollten sie sich sinnvoller bewegen.

Nicht wie bei dir immer den Weg nach oben zum Rand suchen . Warum das so bei dir so solltest du selber erkennen .
Denn wenn eine Wand in Laufrichtung erkannt wurde, wurde immer als erster aufweicht der Weg nach oben genommen.

Dem Konstruktor der Klasse musst du jetzt auch das Layout was in der LABYRINTH Klasse erstellt wird mitgeben. Somit hat der Geist auch die richtige Labyrinth Instanz und keine neue.

Java:
import ea.*;

/**
 * Beschreiben Sie hier die Klasse GEIST.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */
public class GEIST {
    private BILD geist;
    private LEVEL Levelprüfung;
    private String Richtung;
    //Benötigt für Prüfung der Schneidungen


    int tickSteps = 0;

    public BILD getGeist() {
        return geist;
    }


    public GEIST(LEVEL level) {
        this.geist = new BILD(285, 225, "GEIST.gif");
        this.Levelprüfung = level;

        // Gibt dem Geist eine Random Anfangsrichtung
        setRandomRichtung();

    }

    public int RandomZahl(int maxZahl) {

        int zahl = (int) ((Math.random()) * maxZahl + 1);
        return zahl;
    }

    public void setRandomRichtung() {
        int Zahl1 = this.RandomZahl(4);
        if (Zahl1 == 1) {
            this.Richtung = "rechts";
        } else if (Zahl1 == 2) {
            this.Richtung = "links";
        } else if (Zahl1 == 3) {
            this.Richtung = "oben";
        } else if (Zahl1 == 4) {
            this.Richtung = "unten";
        }
    }

    public void DrehenAuf(int Winkel) {
        this.geist.setzeDrehwinkel(Winkel);
    }

    public void RandomMoves() {

        if (tickSteps > 30) {
            setRandomRichtung();
            tickSteps = 0;
        }
        tickSteps++;


        if (Richtung == "oben") {
            DrehenAuf(90);
            geist.verschiebenUm(0, -3);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(0, +3);

                geist.verschiebenUm(4, 0);
                if (testSchneiden(geist) == false) {
                    Richtung = "rechts";
                    geist.verschiebenUm(-4, 0);
                } else {
                    geist.verschiebenUm(-4, 0);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "links";
                        geist.verschiebenUm(4, 0);
                    } else {
                        DrehenAuf(270);
                        geist.verschiebenUm(0, 3);
                        Richtung = "unten";
                    }
                }
            }
        }

        if (Richtung == "unten") {
            DrehenAuf(270);
            geist.verschiebenUm(0, 3);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(0, -3);

                geist.verschiebenUm(4, 0);
                if (testSchneiden(geist) == false) {
                    Richtung = "rechts";
                    geist.verschiebenUm(-4, 0);
                } else {
                    geist.verschiebenUm(-4, 0);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "links";
                        geist.verschiebenUm(4, 0);
                    } else {
                        DrehenAuf(90);
                        geist.verschiebenUm(0, -3);
                        Richtung = "unten";
                    }
                }
            }
        }

        if (Richtung == "rechts") {
            DrehenAuf(270);
            geist.verschiebenUm(3, 0);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(-3, 0);

                geist.verschiebenUm(0, 4);
                if (testSchneiden(geist) == false) {
                    Richtung = "unten";
                    geist.verschiebenUm(0, -4);
                } else {
                    geist.verschiebenUm(0, -4);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "oben";
                        geist.verschiebenUm(0, 4);
                    } else {
                        DrehenAuf(90);
                        geist.verschiebenUm(-3, 0);
                        Richtung = "links";
                    }
                }
            }
        }


        if (Richtung == "links") {
            DrehenAuf(180);
            geist.verschiebenUm(-3, 0);
            if (testSchneiden(geist)) {
                geist.verschiebenUm(3, 0);

                geist.verschiebenUm(0, 4);
                if (testSchneiden(geist) == false) {
                    Richtung = "unten";
                    geist.verschiebenUm(0, -4);
                } else {
                    geist.verschiebenUm(0, -4);
                    if (this.testSchneiden(geist) == false) {
                        Richtung = "oben";
                        geist.verschiebenUm(0, 4);
                    } else {
                        DrehenAuf(90);
                        geist.verschiebenUm(3, 0);
                        Richtung = "rechts";
                    }
                }
            }
        }

    }

    public boolean Schneidet(Raum raum) {
        return this.geist.beruehrt(raum);
    }

    public boolean testSchneiden(BILD geist) {
        //alle Rechtecke aus LEVEL werden geprüft
        for (RECHTECK r : Levelprüfung.wandstück) {
            //If Schleife: Geist-Schneidet Raum methode
            if (Schneidet(r)) {
                return true;
            }

        }
        return false;
    }


}

Tipp: halte dich an die Names Convention von Java . Das habe ich nicht angepasst.

Vielen, Vielen Dank, das ist mir eine sehr große Hilfe, ich werde demnächst deine Vorschläge umsetzen und austesten. Es ist mir wirklich eine sehr große Hilfe, vor allem weil ich erst seit kurzem mit Java angefangen habe.
 
Java:
    Klaus123456789 hat gesagt.:
    Diesen getter habe ich doch schon in der Klasse Geist:
    Java:

public boolean Schneidet(Raum raum){
        return this.geist.beruehrt(raum);
    }


Java:

 public void GeistWirdGefressen(BILD geist){
        for (PACMAN r: pacman){   //was soll das du hast nur einen Pacman
            if(geist1.Schneidet(r)){  //r ist kein Raum objekt das ist dein Bild in der Klasse Pacman.
                   //r.pacman  ist das Raumobjekt aus der Klasse.
                   // da es public ist kannst du ohne getter darauf zugreifen.
              
                this.geist1.setzeMittelpunkt(400, 300);
                }
                else {
                    this.pacman.pacman.setzeMittelpunkt(315, 285);
                }
            }
        }
   }
Ich verstehe dass mit Raum nicht. Das habe ich noch nicht gelernt. Wie mache ich dann diese Klasse GeistWirdGefressen?
 
Du hast doch schon eine lösung von mir in Post #65.

Pacam ist ein einzelnes Objekt und kein Array oder Liste die for schleife brauchst du nicht dafür.
Und deine zwei Geister sind auch nur einzelne Objekte kein n Array oder Liste.


Zum Test auf schneiden brauchst du immer ein Raum Objekt. So nun schaue dir die Doku zu deiner Lib Alpha an wer alles von Raum erbst. Zb dein Objekt Bild was dein Geist ist.

https://engine-alpha.org/wiki/Tutorials/Einführung

Genau dieses Objekt brauchst du zum Prüfen ob sich der Pacman mit dem Geist(Bild) schneidet.
So und wie kommst du nun das das Bild Objekt in der Klasse Geist. Denn das ist ja private also außerhalb der Klasse Geist nicht sichtbar.
Erstelle einen Getter der dir das Objekt zurück gibt oder mache das Bild Objekt Public so wie das Bild von Pacman (in Klasse Pacman) auch Public ist.
Noch mal was du hast ist kein Getter. Grundlagen Java Getter Setter nochmal widerholen.

 
Da du in beiden Klassen Pacman und Geist die Methode "Schneidet" hast könntest du es auch andersrum machen.
Test ob Geist den Pacman berührt. Dein Pacman Bild ist ja public.

Java:
boolean testGeistPacman (GEIST geist){

    return geist.Schneidet(pacman.pacman);  //"pacman" ist die Instanz der Kasse
                                            // und  "pacman" heist auch das Atrtribut  "Bild" in der Klasse.
                                            // deshalb pacman.pacman
                                            // "Bild" ist ja das Objekt was von Raum extendet also dein RaumObjekt.


}


Ps. Deine Steuerung des Pacman ist auch nicht gut lasse ihn doch mal oben oder unten an eine Wand laufen und versuche zurück zugehen nicht rechts oder links.
 
Zuletzt bearbeitet:
Habe jetzt einiges geändert bzw. verbessert.
Jetz sollte normalerweise alles so funktionieren. (Außer die dicken Punkte die den Pacman für kurze zeit unverwundbar machen)
Ich habe Texte hinzugefügt, die jedoch nicht so sind wie ich es mir vorgestellt habe.

KAnnst du bitte die Klasse Labyrinth anschauen, vorallem bei tick was da nicht stimmt? Wenn ich das spiel starte, kommt die ganze zeit Level 2 und der Countdown als text obwohl ich nichtmal alle punkte gegessen habe (5 punkte testweise oben links)

Zum starten musst du ein Objekt der Klasse Labyrinth erzeugen und dann die Methode SpielStarten() aufrufen.

Neustes Projekt im Anhang
 

Anhänge

in welcher Klasse soll die Methode sein .

Ich arbeite nicht mit BlueJ sondern mit IntelliJ und starte den Labyrint Konstruktor
 
Deine Punkte sind nicht sichtbar deshalb bleibst du in deiner Ticker Methode hängen.
das if ist immer True

Java:
// ist immer true
 if (this.level.nenneAnzahlKleinePunkte() == 0){
            this.tickerStoppen();
            this.PacmanStartposition();
            this.GeistStartposition(geist1);
            this.GeistStartposition(geist2);
            //this.nächstesLevel(); oder übergangsweise:
            this.level.level2();
            this.NeuesLevel.setzeSichtbar(true);
            this.CountdownVon3();
            this.NeuesLevel.setzeSichtbar(false);
            this.tickerNeuStarten(30);
            
            
        }
 
Deine Punkte sind nicht sichtbar deshalb bleibst du in deiner Ticker Methode hängen.
das if ist immer True

Java:
// ist immer true
 if (this.level.nenneAnzahlKleinePunkte() == 0){
            this.tickerStoppen();
            this.PacmanStartposition();
            this.GeistStartposition(geist1);
            this.GeistStartposition(geist2);
            //this.nächstesLevel(); oder übergangsweise:
            this.level.level2();
            this.NeuesLevel.setzeSichtbar(true);
            this.CountdownVon3();
            this.NeuesLevel.setzeSichtbar(false);
            this.tickerNeuStarten(30);
           
           
        }
Sind schon sichtbar. Werden im Konstruktor in der Klasse LEVEL sichtbar gemacht.
 
das mag sein ein sinnvolles setzen machst du nicht.
schaue mit dem Debugger der counter wird nicht hoch gezählt.

Code:
 public int nenneAnzahlKleinePunkte(){
        int counter = 0;//5- AnzahlPunkte insgesamt
        for(int i=0; i<5;i++){
            if (this.kleinepunkte[i].nenneSichtbar() == true){
                counter++;
            }
        }
        return counter;
    }

diese Methode wird nicht benutzt nie aufgrerufen
Code:
  public void PunkteSetzen() {
        for(int i= 1; i>=567;i++){
            for(int e=1; e>=19;e++){
                this.Punktsetzen(i,e+1,2);
               
            }
           
        }
       
    }
 
das mag sein ein sinnvolles setzen machst du nicht.
schaue mit dem Debugger der counter wird nicht hoch gezählt. //Warum wird der counter nicht hochgezählt, müsste doch eigentlich funktionieren.

Code:
 public int nenneAnzahlKleinePunkte(){
        int counter = 0;//5- AnzahlPunkte insgesamt
        for(int i=0; i<5;i++){
            if (this.kleinepunkte[i].nenneSichtbar() == true){
                counter++;
            }
        }
        return counter;
    }

diese Methode wird nicht benutzt nie aufgrerufen //Diese geht auch noch nicht, hat ein Freund versucht.
Code:
  public void PunkteSetzen() {
        for(int i= 1; i>=567;i++){ 
            for(int e=1; e>=19;e++){
                this.Punktsetzen(i,e+1,2);
              
            }
          
        }
      
    }
 
Aber so wie ich es gemacht habe müsste es doch auch funktionieren. habe nur noch kleine Fehler wie die kleinen punkte. ansonsten ist das spiel eh fertig. Ich brauch nur noch weitere level oder? Und eigentlich wäre eine Methode noch schön, die die Geister den Pacman verfolgen lässt.
 
Java:
public void PacmanSchneidetPunktPrüfung() {
        //5 = AnzahlKleinePunkte
        for (int i = 0; i < 5; i++) {
          
            if (this.pacman.Schneidet(level.kleinepunkte[i]) || this.level.kleinepunkte[i].nenneSichtbar() == true) {
                this.level.kleinepunkte[i].setzeSichtbar(false);
                this.Punktefresssound.play();
                this.punkte++;
            }
        }

hier scheint dein Problem zu sein. Du setzt die Punkte auf unsichtbar.
überlege ob das oder hier richtig ist.
 
Mal eine Frage das Word Debugger ist dir hoffentlich nicht fremd.

BlueJ wird auch einen Debugger haben und du wirst BreakPoints setzen können.
Denn da hättest du gesehen das deine Punkte nicht sichtbar sind.
 
Zuletzt bearbeitet:
Java:
public void PacmanSchneidetPunktPrüfung() {
        //5 = AnzahlKleinePunkte
        for (int i = 0; i < 5; i++) {
         
            if (this.pacman.Schneidet(level.kleinepunkte[i]) || this.level.kleinepunkte[i].nenneSichtbar() == true) {
                this.level.kleinepunkte[i].setzeSichtbar(false);
                this.Punktefresssound.play();
                this.punkte++;
            }
        }

hier scheint dein Problem zu sein. Du setzt die Punkte auf unsichtbar.
überlege ob das oder hier richtig ist.
Ich setzte die ja nur aus unsichtbar wennn sie vom pacman gefressen werden. Und das gehört ja so. Ich finde den fehler nicht
 
Ein einfaches primitves verfolgen etwa so.
Java:
//-----------------------
    void pursuePacman(PACMAN pacman) {
        int xGoast = geist.berechneAbstandX(pacman.pacman);
        int yGoast = geist.berechneAbstandY(pacman.pacman);

        if (Math.abs(xGoast) < 30 || Math.abs(yGoast) < 30) {

            if (Math.abs(xGoast) > Math.abs(yGoast)) {
                Richtung = xGoast <= 0 ? "rechts" : "links";
                moveGost();
            } else {
                Richtung = yGoast <= 0 ? "unten" : "oben";
                moveGost();
            }
        } else {
            RandomMoves();
        }
    }
    //--------------------
    public void RandomMoves() {
        if (this.tickSteps > 30) {
            this.setRandomRichtung();
            this.tickSteps = 0;
        }
        this.tickSteps++;
        moveGost();
    }
    //--------------------
    void moveGost() {
        if (this.Richtung == "oben") {
            this.geist.verschiebenUm(0, -3);
            if (this.testSchneiden(geist)) {
                this.geist.verschiebenUm(0, +3);

                this.geist.verschiebenUm(4, 0);
                if (this.testSchneiden(geist) == false) {
                    this.Richtung = "rechts";
                    this.geist.verschiebenUm(-4, 0);
                } else {
                    this.geist.verschiebenUm(-4, 0);
              ....
 
Ein einfaches primitves verfolgen etwa so.
Java:
//-----------------------
    void pursuePacman(PACMAN pacman) {
        int xGoast = geist.berechneAbstandX(pacman.pacman);
        int yGoast = geist.berechneAbstandY(pacman.pacman);

        if (Math.abs(xGoast) < 30 || Math.abs(yGoast) < 30) {

            if (Math.abs(xGoast) > Math.abs(yGoast)) {
                Richtung = xGoast <= 0 ? "rechts" : "links";
                moveGost();
            } else {
                Richtung = yGoast <= 0 ? "unten" : "oben";
                moveGost();
            }
        } else {
            RandomMoves();
        }
    }
    //--------------------
    public void RandomMoves() {
        if (this.tickSteps > 30) {
            this.setRandomRichtung();
            this.tickSteps = 0;
        }
        this.tickSteps++;
        moveGost();
    }
    //--------------------
    void moveGost() {
        if (this.Richtung == "oben") {
            this.geist.verschiebenUm(0, -3);
            if (this.testSchneiden(geist)) {
                this.geist.verschiebenUm(0, +3);

                this.geist.verschiebenUm(4, 0);
                if (this.testSchneiden(geist) == false) {
                    this.Richtung = "rechts";
                    this.geist.verschiebenUm(-4, 0);
                } else {
                    this.geist.verschiebenUm(-4, 0);
              ....
Java:
//Warum funktioniert folgendes nicht? Ich will dass  wenn man diese Methode aufruft man true bekommt, wenn der Kleinepunkt ein Wandstück schneidet
//In klasse LEVEL


public boolean Schneidet(Raum raum){
        return beruehrt(raum);
    }
    public boolean SchneidetKleinerPunktWand(LEVEL kleinepunkte){
        for(RECHTECK r: this.wandstück){
            if(kleinepunkte.Schneidet(r)){
                return true;
            }
        }
    }
 
Interessant wäre erstmal zu wissen ob du das problem mit den Punkten gelöst hast. Auch ob das Problem mit dem pacman oben oder unten an der Wand und der user Tipp einfach nur in umgekehrter Richtung nicht rechts oder links.
 
Interessant wäre erstmal zu wissen ob du das problem mit den Punkten gelöst hast. Auch ob das Problem mit dem pacman oben oder unten an der Wand und der user Tipp einfach nur in umgekehrter Richtung nicht rechts oder links.
Mit dem Hängenbleiben in der tick schleife gelöst ja.. statt oder || musste und && geschrieben werden.
Das Problem mit dem pacman oben und unten an dem Rand habe ich noch nicht angeschaut, muss ich dann machen wenn ich das aktuelle Projekt wieder bekomme. Ein freund baut gerade die Level.
 

Zurück
Oben