BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren)

Jw456

Top Contributor
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.
 

Klaus123456789

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

Klaus123456789

Aktives Mitglied
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);
                }
            }
        }
   }
 

Jw456

Top Contributor
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:

Klaus123456789

Aktives Mitglied
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)
 

Jw456

Top Contributor
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.
 

Klaus123456789

Aktives Mitglied
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:

Jw456

Top Contributor
Nein ich bin am Handy coden hier nein.

Java:
if(packman.Schneidet(geist1.und hier der getter vom Geist )){ //<-
 

Jw456

Top Contributor
Java:
public class GEIST
 
 
{
 
 
    private BILD geist;

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

Dein pacman ist ja puplic.
 

Jw456

Top Contributor
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.
 

Jw456

Top Contributor
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:

Jw456

Top Contributor
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:

Jw456

Top Contributor
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.
 

Jw456

Top Contributor
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.

 

Klaus123456789

Aktives Mitglied
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
 

Klaus123456789

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

Klaus123456789

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

Jw456

Top Contributor
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.

 

Jw456

Top Contributor
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:

Klaus123456789

Aktives Mitglied
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

  • Pacman - 19.6.2022 - 15-00.zip
    971,7 KB · Aufrufe: 0

Jw456

Top Contributor
in welcher Klasse soll die Methode sein .

Ich arbeite nicht mit BlueJ sondern mit IntelliJ und starte den Labyrint Konstruktor
 

Jw456

Top Contributor
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);
            
            
        }
 

Klaus123456789

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

Jw456

Top Contributor
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);
               
            }
           
        }
       
    }
 

Klaus123456789

Aktives Mitglied
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);
              
            }
          
        }
      
    }
 

Klaus123456789

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

Jw456

Top Contributor
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.
 

Jw456

Top Contributor
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:

Klaus123456789

Aktives Mitglied
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
 

Jw456

Top Contributor
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);
              ....
 

Klaus123456789

Aktives Mitglied
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;
            }
        }
    }
 

Jw456

Top Contributor
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.
 

Klaus123456789

Aktives Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
G BlueJ Hintergrund Allgemeine Java-Themen 10
A BlueJ - Breite des Bildschirms Allgemeine Java-Themen 3
M Vererbung mithilfe von Bluej Allgemeine Java-Themen 3
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
P BlueJ BlueJ Gloop City Projekt Allgemeine Java-Themen 0
F BlueJ Java/Bluej Bug oder einfach nur Dummheit?? Allgemeine Java-Themen 5
H BlueJ Gloop Allgemeine Java-Themen 1
A BlueJ Java Frame Java Editor --> Bluej / String title Allgemeine Java-Themen 8
D JAVA;BlUEJ Allgemeine Java-Themen 9
H BlueJ Zustände verwalten Allgemeine Java-Themen 2
D BlueJ - Aufgabe 12 namens Traktor Allgemeine Java-Themen 7
P wieso kann ich auf bluej exportieren aber auf eclipse nicht? Allgemeine Java-Themen 2
L BlueJ Java/Bluej Windows7 Allgemeine Java-Themen 4
C blueJ: Objekt wird nicht in Objektleiste angezeigt Allgemeine Java-Themen 8
H BlueJ Klasse ZEICHENFENSTER in BlueJ Allgemeine Java-Themen 5
S BlueJ BlueJ - Geldautomat-Programmierung Allgemeine Java-Themen 2
K BlueJ: .jar Problem Allgemeine Java-Themen 2
G Anrufparameter für Applikationen in BlueJ Allgemeine Java-Themen 2
A BlueJ,Java, Exponentzechen! Allgemeine Java-Themen 12
F Kasiski-Test in BlueJ Allgemeine Java-Themen 4
B Problem mit Sortieralgorithmus (BlueJ) Allgemeine Java-Themen 2
Zrebna Fragen zu Testabdeckungs-Metriken Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
V Ich hätte 2 Fragen Allgemeine Java-Themen 5
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
H Fragen zur Kraken Api Allgemeine Java-Themen 1
nonickatall Klassen Grundsätzliche Fragen zu geplanter Programmstruktur Allgemeine Java-Themen 5
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
T Fragen bezgl. Lambdas Allgemeine Java-Themen 20
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
A Neuerungen in Java 8 StreamAPI- Paar fragen Allgemeine Java-Themen 4
temi Fragen zur Software-Architektur Allgemeine Java-Themen 123
M Diverse Design-Fragen Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
D Grundsätzliche Fragen zum Heap Space Allgemeine Java-Themen 12
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
2 2 Klein Fragen Allgemeine Java-Themen 7
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
A Java Theorie-Fragen Allgemeine Java-Themen 7
K Java QUIZ-Spiel Fragen und Antworten generieren?! Allgemeine Java-Themen 5
R Socket Fragen zu UDP Allgemeine Java-Themen 1
B Noob-Fragen zu Tablets und PC kompatiblität... Allgemeine Java-Themen 6
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
D Fragen zum erstellen einer ausführbaren Jar Datei Allgemeine Java-Themen 3
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
F Akkumulator Hough-Transformation offene Fragen Allgemeine Java-Themen 4
Luk10 Fragen zu Naming-Conventions Allgemeine Java-Themen 5
Z Einige Fragen Allgemeine Java-Themen 10
T OOP Einige Fragen zu UML-Klassendiagrammen Allgemeine Java-Themen 6
G Einige Fragen zu ResourceBundles Allgemeine Java-Themen 2
S Fragen zu verschiedenen Themen vom JCreator Allgemeine Java-Themen 2
DStrohma Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes Allgemeine Java-Themen 8
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2
X Executor fragen ob fertig Allgemeine Java-Themen 13
nrg Swing 2 Fragen zu Swing/AWT Allgemeine Java-Themen 7
K Reflections Fragen Allgemeine Java-Themen 7
S Fragen zum SCJD-Zertifikat Allgemeine Java-Themen 2
M Backend Entwicklung - Konzept fragen Allgemeine Java-Themen 3
E Fragen zu Scala Allgemeine Java-Themen 11
Daniel_L Fragen zu RegEx und URL umwandeln Allgemeine Java-Themen 4
J Diverse Fragen bezüglich Jasper Allgemeine Java-Themen 3
S Fragen zum ShutdownHook Allgemeine Java-Themen 7
V Fragen zu einem Java Browser Allgemeine Java-Themen 7
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
M Drag and Drop: 3 Fragen Allgemeine Java-Themen 3
L Einige Fragen zu Java Allgemeine Java-Themen 9
F Linguistische Fragen zu Javadoc bzw. Englisch Allgemeine Java-Themen 4
E Einfache Fragen zu Dateien Allgemeine Java-Themen 7
E Thread Fragen in Verbindung mit Swing Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
H Java Multiplicoice Test (10 Fragen) Allgemeine Java-Themen 11
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
D Grundsätzliche Fragen zur Grafikdarstellung in Spielen Allgemeine Java-Themen 2
J 2 Fragen zu JMF und eine Rechtsfrage Allgemeine Java-Themen 3
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
C LinkedList Fragen Allgemeine Java-Themen 7
P Fragen zur JBuilder und den kosten. Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
I Fragen zum Internetseiten Einlesen/Auswerten Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben