BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren)

Klaus123456789

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

KonradN

Super-Moderator
Mitarbeiter
Ich fürchte, dass es so nicht funktioniert. Wir haben keine Ahnung, was Du bisher an Code hast, wie Dein Spiel strukturiert ist. Daher können wir Dir auch nicht sagen, wie Du da die gewünschten Funktionen einbauen kannst.
Du musst also deutlich deutlicher werden, was Du derzeit hast und auch genau sagen, was Du willst (Dein Punkt a ist so für mich teilweise unverständlich).
 

Klaus123456789

Aktives Mitglied
Ich fürchte, dass es so nicht funktioniert. Wir haben keine Ahnung, was Du bisher an Code hast, wie Dein Spiel strukturiert ist. Daher können wir Dir auch nicht sagen, wie Du da die gewünschten Funktionen einbauen kannst.
Du musst also deutlich deutlicher werden, was Du derzeit hast und auch genau sagen, was Du willst (Dein Punkt a ist so für mich teilweise unverständlich).
Danke für die Rückmeldung,
bei Punkt a meine ich, dass sich das Pacman-Gif immer in die Richtung bewegt in die das Pacman schaut (Mund in Bewegungsrichtung). Wenn das Bild also gedreht wird, soll es von alleine in diese Richtung bewegt werden.

Der Pacman soll aber nur gedreht werden können (mit den Pfeiltasten), wenn in diese Richtung, in den man ihn gedreht hat, keine Wand ist. (Map besteht aus vielen rechteckigen Wandstücken, welche in 30x30 Pixel zu einem Labyrinth zusammengereiht wurden)

Falls der Pacman am Ende eines Ganges an eine Wand stoßt soll er stehen bleiben. (ohne die Wand zu berühren, 2 Pixel davor stehen bleiben)



Bisheriger Code im Anhang (Kann mit BlueJ geöffnet werden)


Ich bitte um Hilfe.
 

Anhänge

  • Pacman-Spiel.zip
    746,5 KB · Aufrufe: 2
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Der generelle Aufbau ist dann doch einfach: Du musst für die Bewegung z.B. einen Thread haben.

Der Pacman hat eine Richtung. Der Thread schaut also immer nach: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.

Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du schaust: Ist in der Richtung frei? Wenn ja, dann wird die Richtung von Pacman umgesetzt.

Wobei ich im Augenblick unsicher bin, wie das Spiel funktionierte. Wenn man eine neue Richtung gegeben hat, dann ist doch PacMan bei der nächsten Möglichkeit in die Richtung gegangen, oder nicht? Das wäre dann ähnlich:

Der Pacman hat eine Richtung und eine nächsteRichtung.
Der Thread schaut also immer nach:
- Ist in nächsteRichtung gesetzt und frei? Dann wird die Richtung := naechsteRichtung.
- Dann: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.

Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du einfach naechsteRichtung setzt.

Das wäre der Theoretische Aufbau. Das ist aber etwas, das du Dir ganz ohne jedes Programmieren überlegen solltest. Mal es Dir zur Not auch alles einmal auf um zu verstehen, was denn da jeweils geprüft oder gemacht wird.
 

Klaus123456789

Aktives Mitglied
Der generelle Aufbau ist dann doch einfach: Du musst für die Bewegung z.B. einen Thread haben.

Der Pacman hat eine Richtung. Der Thread schaut also immer nach: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.

Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du schaust: Ist in der Richtung frei? Wenn ja, dann wird die Richtung von Pacman umgesetzt.

Wobei ich im Augenblick unsicher bin, wie das Spiel funktionierte. Wenn man eine neue Richtung gegeben hat, dann ist doch PacMan bei der nächsten Möglichkeit in die Richtung gegangen, oder nicht? Das wäre dann ähnlich:

Der Pacman hat eine Richtung und eine nächsteRichtung.
Der Thread schaut also immer nach:
- Ist in nächsteRichtung gesetzt und frei? Dann wird die Richtung := naechsteRichtung.
- Dann: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.

Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du einfach naechsteRichtung setzt.

Das wäre der Theoretische Aufbau. Das ist aber etwas, das du Dir ganz ohne jedes Programmieren überlegen solltest. Mal es Dir zur Not auch alles einmal auf um zu verstehen, was denn da jeweils geprüft oder gemacht wird.
Wie genau schaut man ob in dieser Richtung frei ist? Könnten Sie den Code vielleicht etwas bereitstellen, da ich mich mit Threads und Events noch nicht auskenne.
 

KonradN

Super-Moderator
Mitarbeiter
Wie schon gesagt: Wir haben keine Ahnung, was Du da bisher an Code hast und was Du für Dein PacMan Spiel nutzt. Daher können wir dir diesbezüglich keine Auskunft geben.
 

Klaus123456789

Aktives Mitglied
Wie schon gesagt: Wir haben keine Ahnung, was Du da bisher an Code hast und was Du für Dein PacMan Spiel nutzt. Daher können wir dir diesbezüglich keine Auskunft geben.
Habe es bei Dateien angehängt... (Oben)

Vielleicht kann mir wer anderes helfen: Wie mache ich es, dass Pacman erst dann wenn frei ist sich dreht und weiterläuft und immer in Richtung geht, wo der Mund hinzeigt.

Und wie kann ich es machen, dass der Geist den Pacman verfolgt.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, ich nehme an, dass Du in der Schule dies als Projekt hast? Dass ihr da mit dieser Engine Alpha im Unterricht das Spiel Pacman schreibt?

Im Augenblick ist mir och nicht klar, wie wir Dir am besten helfen. Denn vermutlich wirst Du ja irgend ein generelles Verständnis für das Projekt bekommen müssen und zu Java und so weiter ...
 

Klaus123456789

Aktives Mitglied
Ok, ich nehme an, dass Du in der Schule dies als Projekt hast? Dass ihr da mit dieser Engine Alpha im Unterricht das Spiel Pacman schreibt?

Im Augenblick ist mir och nicht klar, wie wir Dir am besten helfen. Denn vermutlich wirst Du ja irgend ein generelles Verständnis für das Projekt bekommen müssen und zu Java und so weiter ...
Ich habe ein generelles Verständnis für die grundlegenden Dinge. Aber das haben wir im Unterricht noch nicht gemacht.(Threads) (Dies ist unser Abschlussprojekt - wird zuhause gemacht) Und ich komme nicht weiter
 

KonradN

Super-Moderator
Mitarbeiter
Also generell brauchst Du nichts mehr mit Threads zu machen. Die Library hat da schon alles, was Du brauchst und du hast in Spiel die Methode tick, welche du in LABYRINTH ja überschrieben hast.

Du hast in LABYRINTH sowohl die LEVEL1 als auch die PACMAN Instanzen. PACMAN hat seine x und y Koordinate. LEVEL1 kennt die Wände.

Wenn Du wissen willst, ob in einer bestimmten Richtung keine Wand ist, müsstest Du also nur:
- Ermitteln, welches die neue Koordinate in dieser Richtung ist.
- Dann in LEVEL1 halt prüfen, ob an dieser Stelle eine Wand ist oder nicht. Wenn da keine Wand ist, dann wäre die Stelle frei.

Die Frage ist, wie die Geister dem Pacman folgen sollen. Da sind klare Vorgaben wichtig. Ich denke, es sollten 3 Modi geben:
a) Random Moves. Der Geist hat eine Richtung und immer wenn er abbiegen kann ermittelst Du die weitere Richtung per Zufall.
b) Spieler weit entfernt - hier sollte bei jeder Möglichkeit, abzubiegen, die Chance für den Weg, der in Richtung Spieler führt höher sein als für die anderen Richtungen. So wird vermieden, dass die Geister dem Spieler keine Chance lassen.
c) Spieler jagen - wenn ein Geist einen Spieler gesehen hat (Also in gerader Richtung ohne Wand war der Spieler sichtbar), dann rennt der Geist dem Spieler hinterher. Das kann dann prinzipiell b) sein mit Auswahl liegt immer in Richtung Spieler.

Generell sollte man sich ggf. auch überlegen, die Inhalte der Klassen etwas besser zu strukturieren. Teilweise sind da Codeabschnitte an Stellen, wo diese aus meiner Sicht nicht wirklich sein sollten. Eine bessere Platzierung des Codes kann ggf. auch die weitere Entwicklung vereinfachen.
 

Klaus123456789

Aktives Mitglied
Also generell brauchst Du nichts mehr mit Threads zu machen. Die Library hat da schon alles, was Du brauchst und du hast in Spiel die Methode tick, welche du in LABYRINTH ja überschrieben hast.

Du hast in LABYRINTH sowohl die LEVEL1 als auch die PACMAN Instanzen. PACMAN hat seine x und y Koordinate. LEVEL1 kennt die Wände.

Wenn Du wissen willst, ob in einer bestimmten Richtung keine Wand ist, müsstest Du also nur:
- Ermitteln, welches die neue Koordinate in dieser Richtung ist.
- Dann in LEVEL1 halt prüfen, ob an dieser Stelle eine Wand ist oder nicht. Wenn da keine Wand ist, dann wäre die Stelle frei.

Die Frage ist, wie die Geister dem Pacman folgen sollen. Da sind klare Vorgaben wichtig. Ich denke, es sollten 3 Modi geben:
a) Random Moves. Der Geist hat eine Richtung und immer wenn er abbiegen kann ermittelst Du die weitere Richtung per Zufall.
b) Spieler weit entfernt - hier sollte bei jeder Möglichkeit, abzubiegen, die Chance für den Weg, der in Richtung Spieler führt höher sein als für die anderen Richtungen. So wird vermieden, dass die Geister dem Spieler keine Chance lassen.
c) Spieler jagen - wenn ein Geist einen Spieler gesehen hat (Also in gerader Richtung ohne Wand war der Spieler sichtbar), dann rennt der Geist dem Spieler hinterher. Das kann dann prinzipiell b) sein mit Auswahl liegt immer in Richtung Spieler.

Generell sollte man sich ggf. auch überlegen, die Inhalte der Klassen etwas besser zu strukturieren. Teilweise sind da Codeabschnitte an Stellen, wo diese aus meiner Sicht nicht wirklich sein sollten. Eine bessere Platzierung des Codes kann ggf. auch die weitere Entwicklung vereinfachen.
Vielen, Vielen Dank für diese sehr hilfreiche Antwort.

a) Dennoch komme ich nicht weiter, wann der Pacman abbiegen kann, wenn man zuvor die jeweilige Pfeiltaste gedrückt hat. Sie haben es zwar gut erklärt, ich weiß aber trotzdem nicht wie ich dies umsetzen soll.

b) Wie setzt man deine Geist Punkte b, c um? (Meinem Plan nach hätte ich es eigentlich vereinfacht und es gibt nur Random Moves)

c) Wo ist Ihrer Meinung nach, Code der nicht an dieser jeweiligen Stelle sein sollte.


Es tut mir wirklich sehr Leid für diese vielen Fragen, aber ich will es einfach schaffen.

LG!
 

KonradN

Super-Moderator
Mitarbeiter
Die Fragen sind alle ok und ich gehe da auch gerne weiter drauf ein. Wird aber evtl. heute nicht mehr so viel an Antworten geben. Ich versuche das einfach einmal etwas zusammen zu fassen und den ersten Überblick, den ich habe, noch einmal dar zu stellen (Ich habe das Projekt aber auch nur kurz überflogen, daher kann es sein, dass ich auf der Schnelle etwas falsch interpretiert habe, zumal der Code teilweise schwer oder ungewohnt zu lesen ist ... (Es erinnert mich etwas an die Zahnpasta-Werbung von damals ... "Oh, alles rot" ... wobei meine IDE da sehr viel Gelb färbt wegen den vielen Warnung...)

Fangen wir einmal mit c) an. Du hast eine Klasse Level1 welche von Basisklasse erbt. Level1 ist eigentlich leer und alles, was den Level1 ausmacht ist in der Basisklasse. Einige Dinge sind dort auch richtig, z.B. dass es eine Instanzvariable für die Felder mit Wand gibt. Aber die konkreten Wände sollten natürlich nicht in der Basisklasse sondern in Level1 gesetzt werden. Das wäre eine Sache, die aufgefallen ist.

- Damit Du gewisse Dinge in einem Level machen kannst, braucht die Basisklasse ggf. noch weitere Methoden. Eine Methode nimmt eine Koordinate und gibt dann zurück, ob an der Stelle eine Wand ist.

- Dann kannst Du überlegen, ob Du eine Hilfsklasse baust, die eine Koordinate darstellt (x und y) und da wären dann Methoden wie rechts, links, oben und unten zu finden, die jeweils eine neue Koordinate zurück geben.

Dann ist im Labyrinth die tick Methode. In dieser Methode musst Du immer die jeweiligen Schritte machen:

Also in Tick:
- Packman bewegen
- Kollisionen prüfen
- jeden Geist bewegen
- Kollisionen prüfen

Diese Schritte kann man dann verfeinern - das solltest Du versuchen! Also noch nicht im Code schreiben sondern wirklich nur die Beschreibung in Worten. Packman bewegen hatte ich ja schon eine Möglichkeit aufgezeigt:
- Gibt es eine neue Richtung?
- Ja: Neue Koordinate von neuer Richtung ermitteln.
---> Level prüfen: Ist das Feld frei?
---> Ja: Richtung := neue Richtung; neueRichtung := leer
- Neue Koordinate von Richtung ermitteln
- Ist neue Koordinate keine Mauer?
---> Ja: Koordinate Pacman = neue Koordinate
(Hier hält der Pacman an, wenn er an eine Wand gelaufen ist.)

Solche Beschreibungen sind immer sehr wichtig. Das sind dann viele kleine / kurze Abläufe. Und die packst Du in entsprechende Methoden. musst dabei immer überlegen, wozu so eine Methode gehört. Im Level etwas zu prüfen gehört vermutlich in den Level oder eine Basisklasse. (Da es alle Level haben sollen, wird es wohl auf die Basisklasse hinaus laufen)

Kannst Du solche Beschreibungen für die Dinge, die Du implementieren möchtest, aufstellen? Wobei ich Dir auch raten würde: Fang wirklich mit einzelnen Schritten an. Also am Anfang die Geister weglassen. Nur den Pacman bewegbar machen. Erst wenn das fertig ist, dann kannst Du den nächsten Schritt angehen. Durch so ein Vorgehen hast Du viele kleine Erfolgserlebnisse (hoffentlich) und verhaspelst Dich nicht. Wenn du an mehreren Dingen gleichzeitig schraubst, dann wird es schwer, einen lauffähigen Stand hin zu bekommen um Deinen Code zu testen.

Das sollte es von mir für heute gewesen sein. Wir können das ggf. morgen gerne noch weiter vertiefen.
 

Klaus123456789

Aktives Mitglied
Die Fragen sind alle ok und ich gehe da auch gerne weiter drauf ein. Wird aber evtl. heute nicht mehr so viel an Antworten geben. Ich versuche das einfach einmal etwas zusammen zu fassen und den ersten Überblick, den ich habe, noch einmal dar zu stellen (Ich habe das Projekt aber auch nur kurz überflogen, daher kann es sein, dass ich auf der Schnelle etwas falsch interpretiert habe, zumal der Code teilweise schwer oder ungewohnt zu lesen ist ... (Es erinnert mich etwas an die Zahnpasta-Werbung von damals ... "Oh, alles rot" ... wobei meine IDE da sehr viel Gelb färbt wegen den vielen Warnung...)

Fangen wir einmal mit c) an. Du hast eine Klasse Level1 welche von Basisklasse erbt. Level1 ist eigentlich leer und alles, was den Level1 ausmacht ist in der Basisklasse. Einige Dinge sind dort auch richtig, z.B. dass es eine Instanzvariable für die Felder mit Wand gibt. Aber die konkreten Wände sollten natürlich nicht in der Basisklasse sondern in Level1 gesetzt werden. Das wäre eine Sache, die aufgefallen ist.

- Damit Du gewisse Dinge in einem Level machen kannst, braucht die Basisklasse ggf. noch weitere Methoden. Eine Methode nimmt eine Koordinate und gibt dann zurück, ob an der Stelle eine Wand ist.

- Dann kannst Du überlegen, ob Du eine Hilfsklasse baust, die eine Koordinate darstellt (x und y) und da wären dann Methoden wie rechts, links, oben und unten zu finden, die jeweils eine neue Koordinate zurück geben.

Dann ist im Labyrinth die tick Methode. In dieser Methode musst Du immer die jeweiligen Schritte machen:

Also in Tick:
- Packman bewegen
- Kollisionen prüfen
- jeden Geist bewegen
- Kollisionen prüfen

Diese Schritte kann man dann verfeinern - das solltest Du versuchen! Also noch nicht im Code schreiben sondern wirklich nur die Beschreibung in Worten. Packman bewegen hatte ich ja schon eine Möglichkeit aufgezeigt:
- Gibt es eine neue Richtung?
- Ja: Neue Koordinate von neuer Richtung ermitteln.
---> Level prüfen: Ist das Feld frei?
---> Ja: Richtung := neue Richtung; neueRichtung := leer
- Neue Koordinate von Richtung ermitteln
- Ist neue Koordinate keine Mauer?
---> Ja: Koordinate Pacman = neue Koordinate
(Hier hält der Pacman an, wenn er an eine Wand gelaufen ist.)

Solche Beschreibungen sind immer sehr wichtig. Das sind dann viele kleine / kurze Abläufe. Und die packst Du in entsprechende Methoden. musst dabei immer überlegen, wozu so eine Methode gehört. Im Level etwas zu prüfen gehört vermutlich in den Level oder eine Basisklasse. (Da es alle Level haben sollen, wird es wohl auf die Basisklasse hinaus laufen)

Kannst Du solche Beschreibungen für die Dinge, die Du implementieren möchtest, aufstellen? Wobei ich Dir auch raten würde: Fang wirklich mit einzelnen Schritten an. Also am Anfang die Geister weglassen. Nur den Pacman bewegbar machen. Erst wenn das fertig ist, dann kannst Du den nächsten Schritt angehen. Durch so ein Vorgehen hast Du viele kleine Erfolgserlebnisse (hoffentlich) und verhaspelst Dich nicht. Wenn du an mehreren Dingen gleichzeitig schraubst, dann wird es schwer, einen lauffähigen Stand hin zu bekommen um Deinen Code zu testen.

Das sollte es von mir für heute gewesen sein. Wir können das ggf. morgen gerne noch weiter vertiefen.
Vielen Dank, ich schaue mir dies Morgen nochmal genauer an,und werde deine Räte versuchen umzusetzen.

LG
 

Klaus123456789

Aktives Mitglied
Die Fragen sind alle ok und ich gehe da auch gerne weiter drauf ein. Wird aber evtl. heute nicht mehr so viel an Antworten geben. Ich versuche das einfach einmal etwas zusammen zu fassen und den ersten Überblick, den ich habe, noch einmal dar zu stellen (Ich habe das Projekt aber auch nur kurz überflogen, daher kann es sein, dass ich auf der Schnelle etwas falsch interpretiert habe, zumal der Code teilweise schwer oder ungewohnt zu lesen ist ... (Es erinnert mich etwas an die Zahnpasta-Werbung von damals ... "Oh, alles rot" ... wobei meine IDE da sehr viel Gelb färbt wegen den vielen Warnung...)

Fangen wir einmal mit c) an. Du hast eine Klasse Level1 welche von Basisklasse erbt. Level1 ist eigentlich leer und alles, was den Level1 ausmacht ist in der Basisklasse. Einige Dinge sind dort auch richtig, z.B. dass es eine Instanzvariable für die Felder mit Wand gibt. Aber die konkreten Wände sollten natürlich nicht in der Basisklasse sondern in Level1 gesetzt werden. Das wäre eine Sache, die aufgefallen ist.

- Damit Du gewisse Dinge in einem Level machen kannst, braucht die Basisklasse ggf. noch weitere Methoden. Eine Methode nimmt eine Koordinate und gibt dann zurück, ob an der Stelle eine Wand ist.

- Dann kannst Du überlegen, ob Du eine Hilfsklasse baust, die eine Koordinate darstellt (x und y) und da wären dann Methoden wie rechts, links, oben und unten zu finden, die jeweils eine neue Koordinate zurück geben.

Dann ist im Labyrinth die tick Methode. In dieser Methode musst Du immer die jeweiligen Schritte machen:

Also in Tick:
- Packman bewegen
- Kollisionen prüfen
- jeden Geist bewegen
- Kollisionen prüfen

Diese Schritte kann man dann verfeinern - das solltest Du versuchen! Also noch nicht im Code schreiben sondern wirklich nur die Beschreibung in Worten. Packman bewegen hatte ich ja schon eine Möglichkeit aufgezeigt:
- Gibt es eine neue Richtung?
- Ja: Neue Koordinate von neuer Richtung ermitteln.
---> Level prüfen: Ist das Feld frei?
---> Ja: Richtung := neue Richtung; neueRichtung := leer
- Neue Koordinate von Richtung ermitteln
- Ist neue Koordinate keine Mauer?
---> Ja: Koordinate Pacman = neue Koordinate
(Hier hält der Pacman an, wenn er an eine Wand gelaufen ist.)

Solche Beschreibungen sind immer sehr wichtig. Das sind dann viele kleine / kurze Abläufe. Und die packst Du in entsprechende Methoden. musst dabei immer überlegen, wozu so eine Methode gehört. Im Level etwas zu prüfen gehört vermutlich in den Level oder eine Basisklasse. (Da es alle Level haben sollen, wird es wohl auf die Basisklasse hinaus laufen)

Kannst Du solche Beschreibungen für die Dinge, die Du implementieren möchtest, aufstellen? Wobei ich Dir auch raten würde: Fang wirklich mit einzelnen Schritten an. Also am Anfang die Geister weglassen. Nur den Pacman bewegbar machen. Erst wenn das fertig ist, dann kannst Du den nächsten Schritt angehen. Durch so ein Vorgehen hast Du viele kleine Erfolgserlebnisse (hoffentlich) und verhaspelst Dich nicht. Wenn du an mehreren Dingen gleichzeitig schraubst, dann wird es schwer, einen lauffähigen Stand hin zu bekommen um Deinen Code zu testen.

Das sollte es von mir für heute gewesen sein. Wir können das ggf. morgen gerne noch weiter vertiefen.
Ich habe heute meinen Lehrer gefragt, wie ich das Umsetzen kann, damit der Pacman in die Richtung geht in der Frei ist:
Nur habe ich ein Problem: Bei Frage ob PACMAN ein Objekt namens RECHTECK schneidet, kommt eine Fehlermeldung. wie löse ich dies?
Bilder des Codes in nächster Antwort:
 

KonradN

Super-Moderator
Mitarbeiter
RECHTECK ist doch eine Klasse und damit kein Objekt. Du hast in EDITEMODE ein Array mit RECHTECK Instanzen namens wandstück. Vielleicht willst Du also in einer Schleife alle Elemente von wandstück prüfen?

Das ist aber nur geraten - so mit den Bildern kann man zu wenig erkennen um Deine Absicht auch wirklich zu verstehen und alles nachzuvollziehen.

Und falls sich jemand wundert: Diese hcp Dateien sind einfach Bitmaps - halt erstellt unter Windows mit einem Hardcopy-Tool.
 

Klaus123456789

Aktives Mitglied
RECHTECK ist doch eine Klasse und damit kein Objekt. Du hast in EDITEMODE ein Array mit RECHTECK Instanzen namens wandstück. Vielleicht willst Du also in einer Schleife alle Elemente von wandstück prüfen?

Das ist aber nur geraten - so mit den Bildern kann man zu wenig erkennen um Deine Absicht auch wirklich zu verstehen und alles nachzuvollziehen.

Und falls sich jemand wundert: Diese hcp Dateien sind einfach Bitmaps - halt erstellt unter Windows mit einem Hardcopy-Tool.

Wie mache ich es, dass dies in LABYRINTH funktioniert?
 

Anhänge

  • Pacman-Spiel-copy.zip
    755,3 KB · Aufrufe: 4
Zuletzt bearbeitet:

Jw456

Top Contributor
Du brauchst eigentlich die nechste Position in die der packman beim nechsten tick kommt. Und die musst du prüfen ob sie frei ist.
Die Richtung alleine wird dir da nicht reichen.
 

Jw456

Top Contributor
Java:
    public boolean Schneidet(Raum raum){
 
 
        return this.pacman.beruehrt(raum);
 
 
    }
 
 
    //Dreht

Hier siehst du welches Objekt du der Methode übergeben musst

Objekt keine Klasse
 

Jw456

Top Contributor
Das Objekt soll vom Typ Raum sein.. Nicht Rechteck.
Ob du eine Klasse Raum hast und auch ein Objekt davon mußt du wissen.
 

Jw456

Top Contributor
Raum muss eine Klasse sein entweder von dir oder der Lib.
Bei deinen Datein sehe ich keine Klasse Raum.
Zum lesen der Doku ist jetzt keine Zeit.
Vileicht morgen.
 

Jw456

Top Contributor
In deinem Labyrinth hast du ja ein Objekt von LAVEL1 erstellt diese erbt von EDITEMODE und darin hast du dein WandArray also kannst du auch darauf zugreifen.
Deine eigene Position des Pacman weist du ja , nun musst du ermitteln welches Rechteck aus dem Array „wandstück“ die in Frage kommende Wand ist. Damit er dann stehen bleibt.
Oder du prüfst alle duch.

PS. RECHTECK erbt ja von der Klasse Raum aus der Lib.

Ich hätte da vielleicht auch ein 2D Array benutz in dem ich alle Wände eingezeichnet hätte.
So könnte du leicht prüfen ob die Pos wo der Pacman hin verschoben werden soll frei ist.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Tipp: warum machst du nicht einfach für die vier Wände ein großes Rechteck. Dann kannst du prüfen ob sich der Pacman mit dem Objekt der Wand schneidet.
Du weißt ja in welcher Richtung er geht und auf welche Wand er zuläuft mit welcher du die Kollision prüfen musst.
 

KonradN

Super-Moderator
Mitarbeiter
@Klaus123456789 Falls Du gerade aktiv bist, würde ich gerne ein paar Fragen klären, was ihr so kennt. Dann könnte man da einiges an Code vereinfachen.

1) kennt Ihr Enumerations? Also sowas wie ein enum RICHTUNG { OBEN, RECHTS, UNTEN, LINKS } ?
2) Kennt ihr Konstanten? (Also eine Variable noch zusätzlich als final kennzeichnen)

Ich würde da aber paar Dinge anpassen, wenn es Dir recht ist.

Derzeit speicherst Du die Richtung in der Variablen private String Richtung;
Du hast also Richtung als String

Wenn es um die Richtung geht, die per Taste gewählt wurde, hast Du aber 4 boolean Variablen:
Java:
    private boolean rechts;
    private boolean links;
    private boolean oben;
    private boolean unten;

Wenn man eine Richtung speichert, dann sollte man da durchaus einheitlich vorgehen .. also entweder so oder so ...

Wie dem auch sei - wir wollen den Algorithmus doch etwas aufdröseln. Du hast die Stelle, an der man was machen muss, schon etwas erkannt: tick() ruft PacmanVerschieben auf das dann für die Bewegung zuständig ist.

Aber was soll bei einem tick alles passieren?
- Taste auslesen und merken ist schon ein guter Schritt.
- Dann wird aber doch nicht sofort der PacMan bewegt. Wir wollen doch vor dem Bewegen prüfen, ob man die Richtung ändern muss / kann.

Daher wäre tick doch dann eher etwas wie:
Code:
    @Override
    public void tick(){
        this.TasteMerken();
        this.RichtungFestlegen();
        this.PacmanVerschieben();
    }

Nun muss man natürlich noch die Richtung festlegen. Da hatten wir doch eigentlich schon den Ablauf etwas skizziert. Und diese Skizzierungen solltest Du immer erst einmal festlegen:
- Ist die neue Richtung anders als die bisherige Richtung?
--> Wenn ja, dann: Ist das Feld in neuer Richtung frei?
----> Wenn ja, dann: Richtungswechsel! (Richtung = neue Richtung)
- Ist das Feld in Richtung frei?
--> Wenn ja, dann bewege Pacman.

Wir haben jetzt also schon einiges an Logik mehr. Hier ist wichtig, dass wir das so schon nieder schreiben können. Das ist also Code in der Form (Ich lasse mal die Beschreibung als Kommentar drin!):
Java:
// - Ist die neue Richtung anders als die bisherige Richtung?
if (IstNeueRichtungAnders()) {
    // --> Wenn ja, dann: Ist das Feld in neuer Richtung frei?
    if (IstFeldInNeueRichtungFrei()) {
        // ----> Wenn ja, dann: Richtungswechsel! (Richtung = neue Richtung)
        WechselRichtung();       
    }
}

// - Ist das Feld in Richtung frei?
if (IstFeldInBewegungsrichtungFrei()) {
    // --> Wenn ja, dann bewege Pacman.
    BewegePacman();
}

Das ist der Code von eben genau diesen Schritten. Was an der Stelle noch unsicher ist: Evtl. benötigt irgend eine Methode noch Parameter. Oder evtl. wird eine Methode auf einer Instanz aufgerufen. Der Code ist somit noch nicht wirklich fest und es kann Abweichungen geben.

Und dann schauen wir uns diesen Code einmal an - ohne Kommentare:
Java:
if (IstNeueRichtungAnders()) {
    if (IstFeldInNeueRichtungFrei()) {
        WechselRichtung();       
    }
}

if (IstFeldInBewegungsrichtungFrei()) {
    BewegePacman();
}
Ist doch auch gut verständlich, oder? Nun müssen wir natürlich noch die ganzen Methoden schreiben. Die, die wir in if aufrufen, müssen natürlich ein boolean zurück geben. Mach erst einmal nur die Methoden ohne Inhalt. Dann übersetzt es schon einmal - aber macht so natürlich noch keinen Sinn.

Aber Du kannst dann eine Methode nach der anderen schreiben. Willst Du das mal weiter probieren?
 

Jw456

Top Contributor
Alles richtig was Konrad sagt. Wenn du es doch erstmal mit deiner alten Version testen willst. könntest du so prüfen. Du gehst halt alle Wandstücke durch.

Java:
...
if(this.oben = true){
                    this.pacman.VerschiebenUm(0,4);
                    if(testSchneiden(pacman)){
                        this.pacman.VerschiebenUm(0,-4);
...

boolean testSchneiden(PACMAN pacman){
    
    for (RECHTECK r : level1.wandstück){
      if( pacman.Schneidet(r)){
          return true;
        }
    }
    return false ;
}


Nur bin ich mir nicht sicher ob du überhaupt etwas auf dem Bildschirm siehst. Denn ich sehe nicht das du entweder die Rechtecke oder Bilder( Pacman) sichtbar machst. Jedes der Raum Elemente (Views) hat auch eine Sichtbarkeits Methode die nicht benutzt wird.
Default ist glaube nicht sichtbar.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Ich glaube aber das die letzte Wand Zeile nicht angezeigt wird.
Das Fester ist 600 Pixel ein Rechteck ist 30 x 30 und er will es auf 21 ausgeben. 600:30 sind nur 20 möglich.

Auch bei 800 : 30 bei 27 Teilen wird das rechte schmäler sein.

Außer er hat irgendwo die grösse der Zeichen Fläche überschreiben. Im Code ist es aber auf Defaut 800 x 600
 
Zuletzt bearbeitet:

Klaus123456789

Aktives Mitglied
Aber so wie ich es zuvor hatte, den Richtungwechsel(mit den Richtungen usw) müsste es doch theoretisch auch passen. Ich muss es nur noch schaffen dass er die Schneidung der Rechtecke prüft. Das muss doch auch irgendwie funktionieren ohne dass ich viel hinzufüge, oder? Ich muss in dem Projekt nicht effizient coden, sondern so, dass es funktioniert. Außerdem sollten wir möglichst wenig Methoden benutzen. Das Tick ist dann die andere Frage, mit der ich mich danach auseinandersetzen muss.
 

Klaus123456789

Aktives Mitglied
Ich würde es so machen, aber das geht nicht. (die schneiden methode)


public boolean SchneidungPrüfen()
Int Counter=0;
For(int i=0;i<AnzahlWandstücke;i++){
If(this.wandstück.schneidet(pacman) == true){

Counter++;
}
}
If(Counter != 0) {
Return true;
}else {
Return false;
}
}
 

KonradN

Super-Moderator
Mitarbeiter
Code bitte in Code-Tags schreiben. Also am einfachsten mit Hilfe des Knopfes </> links oberhalb des Eingabebereiches.

Und das sieht doch schon gut aus. Das müsste so funktionieren. Wobei Du den Counter auch weglassen könntest und an der Stelle des Counter++ hast würde ein return true; kommen.
 

Jw456

Top Contributor
Ih habe dir doch ein Beispiel gegeben . Post #32
Wie du prüfen kannst.

hier mit klassischer For Schleife

Java:
boolean testSchneiden(PACMAN pacman) {
        for (int i = 0; i < level1.wandstück.length; i++) {
            if (pacman.Schneidet(level1.wandstück[i])) {
                return true;
            }
        }
        return false;
    }
 
Zuletzt bearbeitet:

Klaus123456789

Aktives Mitglied
Code bitte in Code-Tags schreiben. Also am einfachsten mit Hilfe des Knopfes </> links oberhalb des Eingabebereiches.

Und das sieht doch schon gut aus. Das müsste so funktionieren. Wobei Du den Counter auch weglassen könntest und an der Stelle des Counter++ hast würde ein return true; kommen.
Ih habe dir doch ein Beispiel gegeben . Post #32
Wie du prüfen kannst.
Ahh danke, das habe ich übersehen. Ich werde es gleich mal testen. Aber in welcher Klasse muss ich die testschneiden Methode schreiben?
 

Klaus123456789

Aktives Mitglied
Guten Tag, ich habe in der Zwischenzeit einiges geschafft. (Pacman bewegt sich mit Pfeiltasten, Geister bewegen sich random (funktioniert noch nicht so gut)

Nun wollte ich fragen, ob jemand mir erklären kann wie folgendes Funktioniert: (Für BlueJ: Datei im Anhang)

Wie bringe ich folgenden Ablauf hin. (Mithilfe Methode tick)
1. bevor das Spiel Startet soll ein Sound kommen (pacman_beginning.mp3)
2. soll sich pacman bewegen
3. Geister bewegen
4. Prüfungen ob geist gefressen wurde (wenn pacman unverwundbar) , oder ob pacman gefressen wurde (wenn geist verwundbar) -> Game Over ( bei meiner Version von Pacman hat pacman nur 1 leben und wenn alle kleinen Punkte aufgefressen worden sind, kommt ein neues Level. Es geht nicht um den HIGHSCORE der punkte)
5. Wieder Bewegen... usw... (pacman, geister)
6. Wenn großer punkt gegessen wurde, soll für 10sekunden der pacman unverwundbar sein.
7. Falls alle Punkte gegessen wurden sollen die Wände verschoben werden (von level1 zu level2)
-> pacman zu start
-> Geister zu Start + mehr geister
-> punkte wieder setzen



Punkt 1, 4, und 6,7 kann ich ja nicht bei tick reinschreiben, da dies sonst nach jedem durchlauf passieren würde.


Vielen Dank. Ihr könnt es gerne in der Datei testen.
Vielleicht habt ihr auch noch andere Tipps zu meinem Projekt
 

Anhänge

  • Pacman - 13.6.zip
    847,9 KB · Aufrufe: 1

KonradN

Super-Moderator
Mitarbeiter
Die Punkte 4, 6 und 7 finden in der Schleife statt - aber enthalten natürlich eine Bedingung, die du prüfst. Aber das musst Du ja bei jedem Schleifendurchlauf prüfen.

1 ist ja etwas, das nur einmal passieren soll - daher musst Du das an der Stelle schreiben, bei der Du das Spiel startest.
 

Jw456

Top Contributor
Du hast zwar den Ticker in der Klasse Labyrinth überschrieben, aber gesetzt gestartet hast du ihn nicht.
Das musst du in der Klasse Spiel machen. damit der Ticker überhaupt tickt.

Java:
public SPIEL( int breite , int hoehe , boolean punkteLinks , boolean punkteRechts , boolean maus )
    {
        //Zaehler fuer Tick, Tack, ...
        zaehler = 0;
        anzeige = new AnzeigeE( breite , hoehe );
        //animationsManager = AnimationsManager.getAnimationsManager();
        
        //Punkteanzeige
        anzeige.punkteLinksSichtbarSetzen( punkteLinks );
        anzeige.punkteRechtsSichtbarSetzen( punkteRechts );
        
        //Maus ggf. aktivieren
        if ( maus )
        {
            anzeige.klickReagierbarAnmelden( this , true );
        }
        
        //Tastatur
        anzeige.tastenReagierbarAnmelden( this );
        
        //Ticker
        //Alle 500 Millisekunden (=Jede halbe Sekunde) ein Tick
        //anzeige.tickerAnmelden(this, 500);
    }
der Ticker ist immer noch aus
 

Jw456

Top Contributor
In der Klasse Geist erstellst du einen Neuen Pacman das ist falsch denn das ist ein anderer als den, den du Labyrinth Klasse erstellt hast. Wirst somit nicht prüfen können ob der Geist den richtigen Pacman frisst. Da müsstest du dem Geist schon den Richtigen Pacman mitgeben.
Oder eben die Steuerung auch in der Labyrinth Klasse machen.

Bei dem Level ist es das gleiche das ist nicht die geiche Instanz wie die die du in der Labyrinth Klasse erstellt hast .
 
Zuletzt bearbeitet:

Jw456

Top Contributor
dein Layout schaut leider immer noch so schlecht aus.


Unbenannt.png

Tipp: damit deine Geister sich besser bewegen würde ich ihnen nicht bei jedem Tick eine neue Random zahl geben.
 

Klaus123456789

Aktives Mitglied
In der Klasse Geist erstellst du einen Neuen Pacman das ist falsch denn das ist ein anderer als den, den du Labyrinth Klasse erstellt hast. Wirst somit nicht prüfen können ob der Geist den richtigen Pacman frisst. Da müsstest du dem Geist schon den Richtigen Pacman mitgeben.
Oder eben die Steuerung auch in der Labyrinth Klasse machen.

Bei dem Level ist es das gleiche das ist nicht die geiche Instanz wie die die du in der Labyrinth Klasse erstellt hast .
Hier bei diser Geister Schnitt methode in KLASSE GEIST kommen einige Fehler. Weshalb, und wie soll ich diese beheben?
 

Anhänge

  • Pacman - 14.6 (Kopie).zip
    847,7 KB · Aufrufe: 4

Klaus123456789

Aktives Mitglied
dein Layout schaut leider immer noch so schlecht aus. Ja, ich weiß, jedoch macht ein Freund von mir diese Labyrinths. Er ist aber noch nicht dazu gekommen. Morgen jedoch ist ein vollständiges Level mit den Wänden vorhanden. Der untere Rand wird irgendwie nicht angezeigt, obwohl da normal Wände sein müssten.


Anhang anzeigen 18466

Tipp: damit deine Geister sich besser bewegen würde ich ihnen nicht bei jedem Tick eine neue Random zahl geben. <--- Wie kann ich dies machen?
 
Ä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