BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren)

Jw456

Top Contributor
Und wie setze ich es um, dass zum Beispiel in Level 3 dann schon 3 Geister sind, Level 5 dann 4?
Dann erstelle soviel Instanzen von Geist wie du brauchst.
Mache doch eine Liste der du die Objekte hinzugefügtst.

Das sollte doch so sein das du das alles in den Level Klassen machst. Geister keine Punkte, Dreiecke,Diamanten....
Und was du sonst noch so zum einsammeln anbieten willst.
 

Jw456

Top Contributor
Einfach soviel Objekte von Geist erstelken wie du willst.
Natürlich musst du auch prüfen ob der Geist den pacman Frist.
Oder hast das fressen in der Geist Klasse machen. Dazu natürlich dem Geist die Instanz von pacman mitgeben dein Instanziren des Geistes mit new.
 

Klaus123456789

Aktives Mitglied
Einfach soviel Objekte von Geist erstelken wie du willst.
Natürlich musst du auch prüfen ob der Geist den pacman Frist.
Oder hast das fressen in der Geist Klasse machen. Dazu natürlich dem Geist die Instanz von pacman mitgeben dein Instanziren des Geistes mit new.
Aber ich will dass es erst 2 geister sind, später dann ab einem bestimmten Level 3 und so weiter. Wie kann ich das machen?
und dann wenn man stirbt soll es ja wieder von level 1 losgehen, also müssen geister wieder weg
 

Klaus123456789

Aktives Mitglied
Einfach soviel Objekte von Geist erstelken wie du willst.
Natürlich musst du auch prüfen ob der Geist den pacman Frist.
Oder hast das fressen in der Geist Klasse machen. Dazu natürlich dem Geist die Instanz von pacman mitgeben dein Instanziren des Geistes mit new.
//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


Java:
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;

            }

        }

    }
 

KonradN

Super-Moderator
Mitarbeiter
Ich hatte die Entwicklung im Thread nicht weiter verfolgt und habe auch keine aktuellen Sourcen des Projekts. Aber wenn Du mir die gibst (gerne auch per PM), dann kann ich da gerne auch einmal im Detail drauf schauen.

Das Problem muss auch nicht zwingend in der Methode sein sondern kann auch im Bereich des Aufrufes sein. Wenn z.B. auf einer falschen Instanz diese Methode aufgerufen würde, dann wäre das eine Möglichkeit.

Aber wie gesagt: Wenn Du mir den Code einmal als Ganzes gibst, dann kann ich mir das gerne im Detail ansehen (und Dir dann auch gerne generell etwas Feedback geben).
 

Klaus123456789

Aktives Mitglied
Ich hatte die Entwicklung im Thread nicht weiter verfolgt und habe auch keine aktuellen Sourcen des Projekts. Aber wenn Du mir die gibst (gerne auch per PM), dann kann ich da gerne auch einmal im Detail drauf schauen.

Das Problem muss auch nicht zwingend in der Methode sein sondern kann auch im Bereich des Aufrufes sein. Wenn z.B. auf einer falschen Instanz diese Methode aufgerufen würde, dann wäre das eine Möglichkeit.

Aber wie gesagt: Wenn Du mir den Code einmal als Ganzes gibst, dann kann ich mir das gerne im Detail ansehen (und Dir dann auch gerne generell etwas Feedback geben).
1. Labyrinth Objekt ertellen
2. Methode SpielStarten() aufrufe, dann öffnet sich die darstellung (nicht wundern: zuerst kommt ein verunglückter text, der hinweisen soll wie das spiel funktioniert - 5s) danach gehts los.

Wenn man die Punkte gegessen hat (probeweise nur 5 oben links), soll das neue Level aufgerufen werden. (wandstücke werden verschoben).
Pacman kann aber dann nicht mehr bewegt werden.
 

Anhänge

  • Pacman - 23.6.2022 - 1702.zip
    969,9 KB · Aufrufe: 1

Jw456

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


Java:
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;

            }

        }

    }
Keiner Punkt scheidet Wand warum prüft du das. Ist doch total unnütz. Das Punkte werden doch nur vom pacman gefressen nicht vom der Wand.

Wo in welcher klasse willst du das machen?

Punkte Wand... Sind doch statisch und sollte beim Layout erstellen festgelegt werden.
 

Jw456

Top Contributor
Wenn dein geame zu Ende ist starte es einfach wider mit einer anderen Layout klasse in der du alle Layout Teile und Geister erstellst.

PS habe mir deinen Code nicht angesehen
 

Jw456

Top Contributor
Beim Layout würde ich es so machen allse was in jedem Level gleich ist erstelkst du in der Klasse Level. Level1 zb Erbt ja von Level. In Level1 setzt du die Wände die anders sind als in allen Leveln.

Vileicht ist es auch besser nicht für jedes Raum Objekt ein Array zubenutzen. Wie ich schon am Anfang sagte würde ich ein 2d Array benutzen was vom Datentyp Raum ist. Jetzt hast du ein Array mit 27 Felder in x und 21 Felder in y Richtung. Nun kannst du auch deine Raum Objekte auf den Feldern Speichen. Wand Punkte. Diamanten und was es sonst so in den original Spiel zum sammel gab.

Ps bin die nechsten Wochen nur am Handy und da ist Code schreiben schlecht.
 

Jw456

Top Contributor
Java:
return beruehrt(raum);
Die Methode berührt wird immer auf ein Raum Objekt aufgerufen und ihr wird das zu prüfende Raum Objekt übergeben. Siehe Doku Alpha Lib.
Das tust du nicht, ein nur berührt aufrufen geht nicht.
Also in etwa so.
Java:
boolean
b = Krei_objekz.beruehrt(Wand_Objekt);
 

Klaus123456789

Aktives Mitglied
Keiner Punkt scheidet Wand warum prüft du das. Ist doch total unnütz. Das Punkte werden doch nur vom pacman gefressen nicht vom der Wand.

Wo in welcher klasse willst du das machen?

Punkte Wand... Sind doch statisch und sollte beim Layout erstellen festgelegt werden.
Ja stimmt. Jedoch wollte ein Freund eine Methode schreiben, die automatisch überall punkte setzt wo kein Wandstück ist außer an den Pacman und Geister spawnpunkten
 

KonradN

Super-Moderator
Mitarbeiter
Also ich würde Dir dringend raten immer eine Sache nach der andern anzugehen. So baust Du immer mehr Code, es wird immer unübersichtlicher und am Ende blickt niemand mehr durch.

So erstellst Du alle Mauerstücke an einer Position. Der Konstruktor bekommt aber nur die Größe und die Position ist einfach im Konstruktor gesetzt. Bei den Punkten ist es nicht anders - da sind alle Punkte übereinander.
Wenn man sich die Klasse RECHTECK anschaut, dann fällt auf, dass die Koordinate dort als float gespeichert wurde, aber das Setzen wird über int Werte vorgenommen.

Die Positionen sind auch nicht richtig gesetzt - nach dem "fressen" der Punkte statete Level 2 und Pacman war teilweise in der Mauer und konnte sich daher nicht bewegen!


Daher wäre aus meiner Sicht wichtig, dass man sich wirklich genau überlegt, welches Feature man implementieren möchte und dies sollte man dann richtig machen und abschließen, ehe man etwas neue startet.

Bezüglich des Codes, an dem Du gerade dran bist: Du solltest erst einmal überlegen, was Du da überhaupt machen willst. Wenn es Dir z.B. beim Setzen von Punkten darum geht, dass ein neu gesetzter Punkt nicht in einer Wand ist: Ich würde generell anders vorgehen:
Das Spielfeld besteht aus Feldern. Dann können Felder besetzt werden, z.B. durch ein Wandstück (RECHTECK) oder durch einen Kreis, der in der Mitte des Feldes seinen Mittelpunkt hat und kleiner als das Feld ist. Dann wäre die Prüfung einfach nur, ob der der Mittelpunkt des Kreises in einem Rechteck ist.

So ein Level sollte dann auch recht gut beschrieben werden:
  • Es gibt eine Anzahl Wandstücke und jedes Wandstück bekommt ein Feld zugewiesen.
  • Es gibt eine Anzahl Punkte und auch hier wird jedem Punkt ein Feld zugewiesen.
  • Es gibt eine Anzahl Geister - auch jedem wird ein Startpunkt zugewiesen.
  • Und es gibt ein Startpunkt für den Pacman.

Und generell kann man die Geister auch in einem Array vorhalten.

Dann ist unklar, die die Level vorgehalten werden sollen. Wenn man das als Felder vorstellt, dann kann man den Inhalt der Felder beschreiben
W steht für Wand, . für ein Punkt, P für Pacman und G für ein Geist.

Dann wäre ein Level ein Text wie:
Code:
WWWWWWWWWWWWWWWWWWWW
W..................W
W.WWW.WWWP.WWW.WWW.W
W..................W
W.WWW.WWW..WWW.WWW.W
WG................GW
WWWWWWWWWWWWWWWWWWWW

Das ist recht klein gehalten, aber ich will nur das Prinzip aufzeigen.

Den Text liest Du einfach ein, dann zählst Du die Anzahl des "W", "." und "G" und hast damit die Array Größen um diese anzulegen.

Dann gehst Du Zeile für Zeile durch. Und zählst dabei x pro Zeichen hoch und y pro Zeile. Angefangen bei 0.
Die Position einer Wandposition kann man dann berechnen um dann das Rechteck zu erstellen für die Wand. Bei den anderen Elementen muss man ggf. noch einen Offset dazu nehmen. Bei einem Kreis ist der Mittelpunkt halt denn noch jeweils 1/2 Feld in jede Richtung dazu zu nehmen.

Und durch die Startpunkte kann man sicher stellen, dass:
  • Nichts in einer Wand steckt (Da pro Feld immer nur ein Objekt möglich ist, ist das so auch kein Problem.)
  • Die Level kann man so auch Problemlos aufbauen mit einem Texteditor.

Das nur einmal kurz als Rückmeldung von meiner Seite.
 

Jw456

Top Contributor
Bei deinem Layout Rand ist es ja auch so das bei dir die Eck Felder doppelt im Array sind. Nicht schön.
Das sind nur 92 Felder bei dir sind es 96.
 

Klaus123456789

Aktives Mitglied
@Jw456
Ich schaffe folgendes nicht: (Will mit dem Projekt langsam abschließen)

1. Irgendwie bewegen sich die Geister sehr komisch mit der verfolgen Methode. Probier es bitte mal aus.
2. Außerdem bringe ich es nicht hin, dass der Pacman, nachdem er oben oder unten an eine Wand stoßt, wieder umkehren kann.
3. Ich will außerdem, dass in Labyrinth eine Methode ist (nächstesLevel()), die in tick() immer das neue Level aufruft, wenn die Anzahl der kleinen Punkte 0 sind. Das heißt, es soll wenn man gerade level2() in LEVEL geschafft hat, level.level3() aufgerufen werden.
4. Eine Methode die püft ob ein kleinerpunkt (Array) ein Wandstück (Array) schneidet, und dann überall wo keine Wand ist einen Punkt setzt. Außer beim Pacman spawnpunkt, und geister box
das heißt:
Java:
(In Klasse LEVEL) so ungefähr:
public boolean schneidetWandstücke(){
    if ......{
        return true....
    }
}

public void setzePunkeÜberallWoKeinWandstück(){
     for(int i;i<this.AnzahlKleinePunkte;i++){
         int counter = 0;
         if(this.kleinepunkte[i].schneidetWandstücke == false){
             this.kleinepunkte[counter].setzeMittelpunkt(..,..);
         }
     }
 }

So ungefähr, funktioniert halt nicht
 

Jw456

Top Contributor
Java:
//xGoast ist die x position des Geistes yGoast yPos.
if (Math.abs(xGoast) < 30 || Math.abs(yGoast) < 30)
// Math.abs gibt den absulutwet zurück ohne Vorzeichen.

{ if (Math.abs(xGoast) > Math.abs(yGoast)) { Richtung = xGoast <= 0 ? "rechts" : "links" ; // ist eine kompakte if Anweisungn
// der Variablen Richtung wird  je nachdem wie der die Bedingung in der Klammer vor dem Fragezeichen ausfällt true   das  vor dem Doppelpunkt oder bei false nach dem Doppeltpunkt zugewiesen.
 

Jw456

Top Contributor
Das mit dem Pacman der nicht oben oder unten nicht zurück geht.
Da habe ich dir schon einen Tipp gegen. Schaue dir fue virzeiche bei oben und unten an für das ruvhwerts gehen.

Ich bin die nechsten Tage nicht an einem Rechner kann erst später mal testen.

.
 

Jw456

Top Contributor
@Jw456
Ich schaffe folgendes nicht: (Will mit dem Projekt langsam abschließen)

1. Irgendwie bewegen sich die Geister sehr komisch mit der verfolgen Methode. Probier es bitte mal aus.
2. Außerdem bringe ich es nicht hin, dass der Pacman, nachdem er oben oder unten an eine Wand stoßt, wieder umkehren kann.
3. Ich will außerdem, dass in Labyrinth eine Methode ist (nächstesLevel()), die in tick() immer das neue Level aufruft, wenn die Anzahl der kleinen Punkte 0 sind. Das heißt, es soll wenn man gerade level2() in LEVEL geschafft hat, level.level3() aufgerufen werden.
4. Eine Methode die püft ob ein kleinerpunkt (Array) ein Wandstück (Array) schneidet, und dann überall wo keine Wand ist einen Punkt setzt. Außer beim Pacman spawnpunkt, und geister box
das heißt:
Java:
(In Klasse LEVEL) so ungefähr:
public boolean schneidetWandstücke(){
    if ......{
        return true....
    }
}

public void setzePunkeÜberallWoKeinWandstück(){
     for(int i;i<this.AnzahlKleinePunkte;i++){
         int counter = 0;
         if(this.kleinepunkte[i].schneidetWandstücke == false){
             this.kleinepunkte[counter].setzeMittelpunkt(..,..);
         }
     }
 }

So ungefähr, funktioniert halt nicht
Keine Ahnung wo du genau bist.
Wie wir dir schon sagten brauchst du zum Testen immer auc die bei Instanzen der Objekte die du testen willst. Wenn sie nicht beide in der gleichen Klasse erstellt wurden must du die der Methode mitgeben als Parameter.
Du scheinst noch sehr große Probleme beim verständnis von OOP zu haben.


Grundlagen Oop würde ich sagen könnte helfen. Daten Kaselung.
 

Klaus123456789

Aktives Mitglied
Was willst du denn hier vergleichen?
Sinnlos
Du wist doch die Differenz der pos von pacman und Geist haben.
Großer Wert weit weg kleiner Wert ziemlich nach. Das Vorzeichen gibt die Richtung an.
So nun schaue in die Alpha Doku wie du zu der Differenz von zwei Raum Objekten kommst.
Das hast du doch gemacht. ich habe nur von der kompakten if schleife auf die normale gemacht, und wollte fragen ob das so das selbe ist wie oben
 

fhoffmann

Top Contributor
Java:
        int xGoast = geist.berechneAbstandX(pacman.pacman);
        int yGoast = geist.berechneAbstandY(pacman.pacman);

        if (Math.abs(xGoast) < 30 || Math.abs(yGoast) < 30) {
Das hat tatsächlich @Jw456 geschrieben.

Wichtig sind hier die ersten beiden Zeilen: xGoast ist der horizontale Abstand zwischen Geist und Pacman. In der if-Bedingung wird dann abefragt, ob dieser horizontale Abstand kleiner als 30 ist.
 

Klaus123456789

Aktives Mitglied
Java:
        int xGoast = geist.berechneAbstandX(pacman.pacman);
        int yGoast = geist.berechneAbstandY(pacman.pacman);

        if (Math.abs(xGoast) < 30 || Math.abs(yGoast) < 30) {
Das hat tatsächlich @Jw456 geschrieben.

Wichtig sind hier die ersten beiden Zeilen: xGoast ist der horizontale Abstand zwischen Geist und Pacman. In der if-Bedingung wird dann abefragt, ob dieser horizontale Abstand kleiner als 30 ist.
Aber ich will ja, dass der Geist immer den Pacman verfolgt.
 

Jw456

Top Contributor
Dann setze den Abstand größer. So das der geist bei seinen random laufen den pacman früher einfängt.
Natürlich ist beim verfolgen auch immer noch dein Labyrinth im wege. Wenn der Abstand zb nur 10 ist in x Richtung und Eine Wand dazwischen wird er so nicht zum Pacman kommen.

Da musst du schon einen besseren Algorithmus schrieben das das Labyrint mit berücksichtigt.
Ich sagte ja auch einen sehr einfache Art. In dem Layout ohne viel Wände auch geht.

Ich denke in den alten Spielen da kannte der Geist den Weg duch das Labyrint. Also konnte er recht schnell von seiner pos zu der pos des pacman kommen. Die pos des pacman war sicherlich auch immer bekannt.

In deinem Spiel ist ja alles auf Zufall.
 
Zuletzt bearbeitet:

Klaus123456789

Aktives Mitglied
Dann setze den Abstand größer. So das der geist bei seinen random laufen den pacman früher einfängt.
Natürlich ist beim verfolgen auch immer noch dein Labyrinth im wege. Wenn der Abstand zb nur 10 ist in x Richtung und Eine Wand dazwischen wird er so nicht zum Pacman kommen.

Da musst du schon einen besseren Algorithmus schrieben das das Labyrint mit berücksichtigt.
Ich sagte ja auch einen sehr einfache Art. In dem Layout ohne viel Wände auch geht.

Ich denke in den alten Spielen da kannte der Geist den Weg duch das Labyrint. Also konnte er recht schnell von seiner pos zu der pos des pacman kommen. Die pos des pacman war sicherlich auch immer bekannt.

In deinem Spiel ist ja alles auf Zufall.
Aber wie baue ich den Algorithmus aus, damit er die Wände berücksichtigt? Soweit bin ich leider mit Java noch nicht. Das muss mir einer zeigen wie ich das mache, damit ich es dann später nochmal anwenden kann. Außerdem funktioniert die RandomMoves ja auch nicht wirklich. Der geist flieht durch wände, bleibt stecken oder ist aif einmal aus dem sichtbaren bereich geflogen.
 

Jw456

Top Contributor
Soweit bin ich leider mit Java noch nicht. Das muss mir einer zeigen wie ich das mache, damit ich es dann später nochmal anwenden kann.
Zeigen nicht unbedingt. Du solltest dir ein Strategie Prinzip bilden wie du verfolgen kannst wenn du deine Position und die des pacman kennst.
Meunedwegen merke dir auch die letzten Wege Tasten Klicks vom User...
Und ziehe daraus deine Rückschlüsse.
Zur Steuerung der Geister.

Ein Prinzip dazu solltest du schon selber entwickeln bei der umstzung in java wird dir sicher geholfen werden.

Aber das Grund Prinzip sollte von dir kommen.

Eine Möglichkeit mit der Differenz den Abstand der beiden Figuren habe ich gezeigt.
 

Jw456

Top Contributor
Zeige die Klasse in der Geister mit Steuerung.
Schaue dir mein Beispiel an was du schon hast da geht kein Geist durch die Wand. Mache doch erst mals eins fertig und versuche zu verstehen was du da tust. Auch das lesen der Doku hilft. Und Grundlagen oop.
 

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.

Hier bewegen sich die geister schon durch die Wand. Und sie bewegen sich sehr seltsam.
 

Jw456

Top Contributor
Das ist ja auch nicht in dem Code.

Der Code macht nur eins. Es wird durch Zufall eine Richtung bestimmt. Es wird geprüft ob das frei ist. Wenn nein wird je nachdem wekcgeruchtung es war eine Andere versucht ist die auch nicht frei dann die andrere geht das sich nicht dann zurück.

Da es nur aller 30 Ticks einen neuen Zufall gibt geht der Geist auch solang in die Richtung wenn keine Wand kommt.
 

Klaus123456789

Aktives Mitglied
Verfolgen wo müsstest
du das machen denke nach. Was brauchst du dazu. Wo und wie kommst du daran.
Hallo ich steh kurz vorm Verzweifeln. Ich habe jetzt soo viele Möglichkeiten für die Random Moves gesucht: aber nix geht wirklich
auch nicht mit diesem Code: die bewegen sich ständig gleich alle 4.

könntest du mir vielleicht dabei helfen, oder mir ein beispiel zeigen? Weil dein beispiel zuvor hat ja nicht funktioniert.

@Jw456 Ich muss morgen mit dem projekt fertig sein, und es geht einfach nicht.

Java:
if(this.Richtung == "rechts"){
            this.geist.verschiebenUm(4,0);
            if(this.testSchneiden(geist) == true){
                this.geist.verschiebenUm(-8,0);
                this.Richtung = "links";
                if(this.testSchneiden(geist) == true){
                    this.geist.verschiebenUm(4,-4);
                    this.Richtung = "oben";
                    if(this.testSchneiden(geist) == true){
                        this.geist.verschiebenUm(0,8);
                        this.Richtung = "unten";
                        if(this.testSchneiden(geist) == true){
                            this.geist.verschiebenUm(0,-4);
                            this.setRandomRichtung();
                        }
                    }
                }
            }
            else {
                this.Richtung = "rechts";
            }
        }
       
        else if(this.Richtung == "links"){
            this.geist.verschiebenUm(-4,0);
            if(this.testSchneiden(geist) == true){
                this.geist.verschiebenUm(8,0);
                this.Richtung = "rechts";
                if(this.testSchneiden(geist) == true){
                    this.geist.verschiebenUm(-4,-4);
                    this.Richtung = "oben";
                    if(this.testSchneiden(geist) == true){
                        this.geist.verschiebenUm(0,8);
                        this.Richtung = "unten";
                        if(this.testSchneiden(geist) == true){
                            this.geist.verschiebenUm(0,-4);
                            this.setRandomRichtung();
                        }
                    }
                }
            }
            else {
                this.Richtung = "links";
            }
        }
       
        else if(this.Richtung == "oben"){
            this.geist.verschiebenUm(0,-4);
            if(this.testSchneiden(geist) == true){
                this.geist.verschiebenUm(0,8);
                this.Richtung = "unten";
                if(this.testSchneiden(geist) == true){
                    this.geist.verschiebenUm(4,-4);
                    this.Richtung = "rechts";
                    if(this.testSchneiden(geist) == true){
                        this.geist.verschiebenUm(-8,0);
                        this.Richtung = "links";
                        if(this.testSchneiden(geist) == true){
                            this.geist.verschiebenUm(4,0);
                            this.setRandomRichtung();
                        }
                    }
                }
            }
            else {
                this.Richtung = "oben";
            }
        }
       
        else if(this.Richtung == "unten"){
            this.geist.verschiebenUm(0,4);
            if(this.testSchneiden(geist) == true){
                this.geist.verschiebenUm(0,-8);
                this.Richtung = "oben";
                if(this.testSchneiden(geist) == true){
                    this.geist.verschiebenUm(4,4);
                    this.Richtung = "rechts";
                    if(this.testSchneiden(geist) == true){
                        this.geist.verschiebenUm(-8,0);
                        this.Richtung = "links";
                        if(this.testSchneiden(geist) == true){
                            this.geist.verschiebenUm(0,-4);
                            this.setRandomRichtung();
                        }
                    }
                }
            }
            else {
                this.Richtung = "unten";
            }
        }

Könntest du mir helfen @Jw456 @KonradN ?
Ich hänge das projekt im Anhang an.
Code in Klasse GEIST
Ansonsten funktioniert alles.
 

Anhänge

  • Pacman - 3.7.2022 - 20-47-copy -- Javafo.zip
    1.000,1 KB · Aufrufe: 1
Zuletzt bearbeitet:

Jw456

Top Contributor
Nehmen wir mal das.

Java:
        if(this.Richtung == "rechts"){ //hier eigentlich equels und nicht ==
            this.geist.verschiebenUm(4,0);
            if(this.testSchneiden(geist) == true){
                this.geist.verschiebenUm(-8,0);
// ok die richtung ist belegt also schieben zurück wieso jetzt 8 Pixel. Sind doch nur 4.

                this.Richtung = "links"; // du gibst einfach eine neue Richtung vor ohne vorher zu schieben und dann zu testen ob frei ist.
                if(this.testSchneiden(geist) == true){
                 this.geist.verschiebenUm(4,-4);
                    this.Richtung = "oben";
                    if(this.testSchneiden(geist) == true){
                        this.geist.verschiebenUm(0,8);
                        this.Richtung = "unten";
                        if(this.testSchneiden(geist) == true){
                            this.geist.verschiebenUm(0,-4);
                            this.setRandomRichtung();
                        }
                    }
                }

Schaue dir meinen Code an duch denke ihn.
Bei dem recht habe ich zuerst nach recht geschoben geprüft. War es Frei würde nichts mehr gemacht.
War es nicht frei also habe ich das schieben zurück genommen. Eine andrere Richtung geschoben zb nach oben und getestet war es frei fertig.
Auch nach oben belegt dann wider Schieben zurück und neue Richtung versuchen. Ist das auch belegt dann in die Richtung aus der du kamst.
Immer erst schieben testeten wenn nicht frei wier zurückschieben und neue Richtung testen.

Auch das Setzen des des tick Zähler auf 200 ist nicht gut.
 
Zuletzt bearbeitet:
Ä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

Neue Themen


Oben