Java Hamster Simulator

Moin,
ich muss bis Sonntag eine Aufgabe in Informatik abgeben, welche einen Quellcode und ein dazugehöriges PAP erfordert.
Wir sind bei der Imperativen Programmierung und unsere Aufgabe ist den Hamster durch ein beliebig großes Feld mit beliebig vielen Körnern (mit der while Schleife), welche er alle fressen soll.
Ich hatte kaum Unterrichtzeit um diese Aufgabe zu erarbeiten und bin jetzt 2 Tage vor der Abgabe und ich weiß, dass meine Gruppe ( 2 Jungs, welche beide Informatik nicht so können) nichts tun werden, und ich möchte gern meine 13 Punkte in Informatik halten, aber ich bin etwas überfordert bei dieser Aufgabe, da ich bei der While schleife etwas gefehlt habe. Ich habe einen Quellcode von nem Freund bekommen, der aber nicht ganz richtig ist, da er bei kleinen Feldern oder wenn der Hamster anders gedreht ist nicht funktioniert.
Ich habe gelesen, dass sich einige hier mit dem Hamster Simulator auskennen und falls einer so lieb wär und mir helfen könnte, wäre ich dafür sehr Dankbar.

Hier ist nochmal der Code von meinem Freund
void main()
{
while (vornFrei())
{
vor();
}
linksUm();
while (vornFrei())
{
vor();
}
if (kornDa())
{
while (kornDa())
{
nimm();
}
}
linksUm();
//Er geht erstmal in eine Ecke und soll nicht gegen eine Wand gucken

while (!maulLeer())
{
while (vornFrei())
{
vor();
if (kornDa())
{
while (kornDa())
{
nimm();
}
}
}
linksUm();
vor();
if (kornDa())
{
while (kornDa())
{
nimm();
}
}
linksUm();
//Erste Reihe

while (vornFrei())
{
vor();
if (kornDa())
{
while (kornDa())
{
nimm();
}
}
}
rechtsUm();
vor();
if (kornDa())
{
while (kornDa())
{
nimm();
}
}
rechtsUm();
//Zweite Reihe
}
}

void rechtsUm()
{
linksUm();
linksUm();
linksUm();
}
 
Die While-Schleifen sind richtig aber die Logik stimmt nicht. Du hast leider das Labyrinth nicht mit gezeigt und auch nicht wo der Hamster startet.
Im Prinzip musst der Hamster immer ein Feld nach vorn und dann die Körner aufnehmen, dann auf das nächste Feld nach vorn und dann die Körner aufnehmen. Wenn vorn nicht frei ist, dann nach einer Seite drehen und wieder ein Feld vor und dann die Körner aufnehmen. Dann auf das nächste Feld nach vorn und dann die Körner aufnehmen. Wenn vorn nicht frei ist, dann nach einer Seite drehen und wieder ein Feld vor und dann die Körner aufnehmen ...
Du musst einfach nur entscheiden, zur welchen Seite der Hamster drehen muss, der Rest ist immer gleich.
 
Ja wenn er an eine Wand kommt muss er sich nach links oder rechts drehen.

Wenn du aber jetzt einfach weiter machst wird er immer ab der Wand entlang laufen und nicht in die Mitte des Feldes kommen.

Wenn er zb rechts oben startet. Geht er oben bis zu Wand. Dann links drehen einen Schritt vor und wider links drehen und nun in der zweiten Reihe wider vor bis zur Wand. Da dann wider rechts rum eins vor noch mal rechts und nach vorn... ...

Und wie schon gesagt wurde nach jenden vor testen ob Korn da wenn ja einsammeln.

Tipp das müsste in der while sein in der du vor gehst.

Ich denke ihr habt noch kein Labyrinth nur ein einfaches Feld. Was abgegrast werden soll.

Also einfach in schlangen Form durch das Feld.
 
Zuletzt bearbeitet:
Ja wenn er an eine Wand kommt muss er sich nach links oder rechts drehen.

Wenn du aber jetzt einfach weiter machst wird er immer ab der Wand entlang laufen und nicht in die Mitte des Feldes kommen.

Wenn er zb rechts oben startet. Geht er oben bis zu Wand. Dann links drehen einen Schritt vor und wider links drehen und nun in der zweiten Reihe wider vor bis zur Wand. Da dann wider rechts rum eins vor noch mal rechts und nach vorn... ...

Und wie schon gesagt wurde nach jenden vor testen ob Korn da wenn ja einsammeln.

Tipp das müsste in der while sein in der du vor gehst.

Ich denke ihr habt noch kein Labyrinth nur ein einfaches Feld. Was abgegrast werden soll.

Also einfach in schlangen Form durch das
Die While-Schleifen sind richtig aber die Logik stimmt nicht. Du hast leider das Labyrinth nicht mit gezeigt und auch nicht wo der Hamster startet.
Im Prinzip musst der Hamster immer ein Feld nach vorn und dann die Körner aufnehmen, dann auf das nächste Feld nach vorn und dann die Körner aufnehmen. Wenn vorn nicht frei ist, dann nach einer Seite drehen und wieder ein Feld vor und dann die Körner aufnehmen. Dann auf das nächste Feld nach vorn und dann die Körner aufnehmen. Wenn vorn nicht frei ist, dann nach einer Seite drehen und wieder ein Feld vor und dann die Körner aufnehmen ...
Du musst einfach nur entscheiden, zur welchen Seite der Hamster drehen muss, der Rest ist immer gleich.
1642414394405.png
 
Man könnte auch nach oben gehen und dann gilt: Erreicht man die Wand oder ein bereits besuchtes Feld, dann drehe nach links, usw.
Dadurch ergibt sich eine Spirale.
Ja dazu musst du aber die besuchten Felder merken.
Also nach der erste runde eins vor der Wand sich zu drehen.
Wenn du auf jeden Fall Feld ein korn legst und es aufnimmt. Kannst du prüfen od du schon auf dem Feld warst.

Oder in der Mitte anfangen.
Eins vor drehen eins vor drehen, dann zwei vor dehen zwei vor dehen.
Dann kommen drei vor usw.
Beim vor natürlich prüfen ob du an ober wass bist dann natürlich gleich drehen.

So läuft er in einer Spirale von innen nach außen. Am Ende wird er immer an der Wand laufen.
 
Die Frage ist zwar jetzt mega Platt, aber kann einer von euch den Code richtig verfassen, so dass er läuft? Ich hatte bis jetzt keine einzige Möglichkeit gehabt seit Freitag was dran zu machen, da ich Freitag nach der Schule, Samstag und heute arbeiten musste. Hab bis Morgen noch ein WiPo Vortrag den ich jetzt machen muss und mir sind echt die Hände gebunden weshalb ich danach Frage. Ich löse gerne mein shit selbst, da es mir ansonsten nichts bringt, aber grade jetzt habe ich auch keine Ahnung wie ich das bis morgen 12 Uhr abgeben soll. Dazu kommt noch die Protokollierung der scheiße und ein PAP was aber hoffentlich mein Gruppenpartner macht.. Falls mir hier einer Helfen könnte, würde ich mich auch bei dem Privat revanchieren wenn es möglich ist.(Auch wenn eure Antworten echt hilfreich waren, da ich das inzwischen wenigstens verstanden habe, mir aber die Zeit im Nacken sitzt. Das wär unfassbar falls sie jemand dafür kurz zeit nehmen könnte
 
manchmal hast a pech 😀

es ist ansich 1 enum für die Richtungen
eine Tiefensuche oder Breitensuche
und eine Methode die das Feld erzeugt

das hast du in ner stunde wenn du es verstanden hast ( was du ja behauptest )

Ich glaube, wenn ich, sowie du es behauptest in einer Stunde schaffen würde, dann würde ich doch gar nicht mich hier melden und um Hilfe bitten..
Ich verstehe deinen Ansatz klar, aber ich glaube doch dass es auch menschlich ist, dass sowas passiert. Ich wurde am 30.12 positiv getestet und meine Restwoche Ferien verbrachte ich Krank in der Quarantäne, durch welche ich nicht annährend kraft hatte, etwas für die Schule machen zu
können. Falls du meinst dass es Pech ist, dann versteh ich´s, aber ich möchte auch nochmal klarstellen, dass das nur der Code von einem Klassenkammeraden ist, welcher das noch um einiges das besser versteht und bei dem Projekt auch dauerhaft dabei war, ich jedoch nicht.
Ich meine damit, dass falls trotzdem sich jemand in meine Lage versetzen kann und sowas selbst schon mal hatte, mir diese Person helfen könnte, abgesehen davon wie leicht es für dich rüber kommt. Außerdem finde ich nicht das verstehen gleich direktes umsetzen bedeutet. Wenn ich etwas neu anfange, kann ich das zwar verstehen, aber die Umsetzung an sich, ist ein Prozess welcher Zeitintensiv sein kann.
Vielleicht verstehst du mich jetzt besser.
 
meine Restwoche Ferien verbrachte ich Krank in der Quarantäne,
den urlaub den ich mir genommen habe hab ich damit verbracht täglich 10 stunden minimum zu lernen ..also es kann schlimmer sein

aber ich will ja nicht so sein
Java:
enum Direction{
    NORD,OST,West,SUD
}
Java:
public void tiefensuche(Direction richtung)
{
    move(richtung);
   
    for (var dir : Direction.values()){
        tiefensuche(dir);
    }
}
move(Direction richtung){
    pruefAktuellesFeld();
    switch(richtung){
            NORD -> gehNachNorden();
            WEST -> gehNachWesten();
            SUD -> gehNachSud();
            OST -> gehNachOst();
    }
   
}
pruefAktuellesFeld(){
    if( this.aktuellesFeld == ziel){
        System.out.println(Ziel erreicht)
        System.exit(0);
    }
}
die besuchten felder musst du abhaken ansonsten kommst in die endlosschleife
 
weniger pseudo code
Java:
package dfs.java.simple;

/**
 * Used to perform the Depth-First Search (DFS) Algorithm to find the shortest path from a start to a target node.
 */
public class DFS {

    /**
     * Implementation of DFS (depth-first search).
     * Given a start node, this returns the node in the tree below the start node with the target value (or null if it doesn't exist)
     * Runs in O(n), where n is the number of nodes in the tree, or O(b^d), where b is the branching factor and d is the depth.
     *
     * @param start  the node to start the search from
     * @param target the value to search for
     * @return The node containing the target value or null if it doesn't exist.
     */
    public static Node dfs(Node start, int target) {
        System.out.println("Visiting Node " + start.value);
        if (start.value == target) {
            // We have found the goal node we we're searching for
            System.out.println("Found the node we're looking for!");
            return start;
        }

        // Recurse with all children
        for (int i = 0; i < start.children.length; i++) {
            Node result = dfs(start.children[i], target);
            if (result != null) {
                // We've found the goal node while going down that child
                return result;
            }
        }

        // We've gone through all children and not found the goal node
        System.out.println("Went through all children of " + start.value + ", returning to it's parent.");
        return null;
    }
}

// used to store a tree datastructure
class Node {
    Node[] children;
    int value;
}
 
doie rekursion wird wahrscheinlich so nicht hinhauen aber es ist nah dran hab auch keinen bock deine aufgaben zu erledigen, aber es geht in die richtige richtung

das problem kann auch als "find the cheese" gesucht werden
 
da
den urlaub den ich mir genommen habe hab ich damit verbracht täglich 10 stunden minimum zu lernen ..also es kann schlimmer sein

aber ich will ja nicht so sein
Java:
enum Direction{
    NORD,OST,West,SUD
}
Java:
public void tiefensuche(Direction richtung)
{
    move(richtung);
   
    for (var dir : Direction.values()){
        tiefensuche(dir);
    }
}
move(Direction richtung){
    pruefAktuellesFeld();
    switch(richtung){
            NORD -> gehNachNorden();
            WEST -> gehNachWesten();
            SUD -> gehNachSud();
            OST -> gehNachOst();
    }
   
}
pruefAktuellesFeld(){
    if( this.aktuellesFeld == ziel){
        System.out.println(Ziel erreicht)
        System.exit(0);
    }
}
die besuchten felder musst du abhaken ansonsten kommst in die endlosschleife

Das ist sehr Lieb von dir, ich danke dir sehr. Kann man sich auch privat auf diesem Forum schreiben oder nur als Thread?
 
Da die Abgabe ja schon gewesen ist, deswegen laufe ich nicht in die Gefahr rein, Hausaufgaben zu machen...

Eine Tiefensuche fände ich hier "too much", da würde eine einfache Rekursion (bzw. Schleife) genügen:

Java:
void main() {
    lauf(true, 0);
}

void lauf(boolean richtung, int anzahlEcken) {
    if (anzahlEcken == 2) {
        return;
    }
    while (kornDa()) {
        nimm();
    }
    if (vornFrei()) {
        vor();
        lauf(richtung, anzahlEcken);
    } else if (richtung) {
        nachRechts();
        if (vornFrei()) {
            vor();
            nachRechts();
            lauf(false, anzahlEcken);
        } else {
            // Hamster ist in eine Ecke=Sackgasse gelaufen und kann nicht weiter
            linksUm();
            linksUm();
            vor();
            linksUm();
            lauf(richtung, anzahlEcken + 1);
        }   
    } else {
        linksUm();
        if (vornFrei()) {
            vor();
            linksUm();
            lauf(true, anzahlEcken);
        } else {
            // Hamster ist in eine Ecke=Sackgasse gelaufen und kann nicht weiter
            linksUm();
            linksUm();
            vor();
            nachRechts();
            lauf(richtung, anzahlEcken + 1);
        }
    }
}

void nachRechts() {
    linksUm();
    linksUm();
    linksUm();
}

Ähnlich wie ein Staubsaugerroboter, werden alle Felder einmal besucht, unabhängig davon, wo der Hamster startet...

hth
 
um eine "gute" läsung zu bieten bärucht man erst mal das maze field ... da man vor und lauf und rechts nicht implementieren kann .. es ist aber ja auch nix mehr gekommen deswegen scheitert eine clean code lösung an fehlenden informationen
 
Da hast du natürlich recht! Man müsste die Aufgabenstellungen kennen.

Aber jetzt ist es egal, wo und in welcher Richtung der Hamster startet, das Spielfeld muss nur rechteckig und ummauert sein. Dann läuft der Hamster jedes einzelne Feld mindestens einmal ab und höchstens zweimal. Anders geht es nicht ...

Oder er läuft erst "strikt geradeaus" in eine beliebige Ecke und startet von dort sein Suchmuster...
 
Anders geht es nicht ...

Oder er läuft erst "strikt geradeaus" in eine beliebige Ecke und startet von dort sein Suchmuster...
es geht einfacher deinen Code zu schreiben falls es dich interessiert aber das ist schwer zu erklären du brauchst die ganzen ifs nicht

der prinzipielle aufbau ist
1. Jeder Methoden aufruf hat alle 4 richtungen
2. die werden N O S W abgearbeitet dh

der hamster läuft solange nach norden bis eine mauer kommt bie der mauer liefert der nächste methoden aufruf NULL also return null dh der vorherige aufruf macht mit O weiter und ab dann wieder N bis nimmer geht .. dann wieder bis nicht mehr geht irgendwann kommst du da durch die rekursion zurück bis du bei jedem Punkt alle 4 himmels richtungen agbgearbeitet hattest

dies entspricht der tiefen scuhe und ist imprinzip nur 3 ifs
entweder ziel ist da return node
oder falls mauer oder geht nicht weiter oder node wurde schon besucht return null
falls der return wert == null ist mach mit der Nächsten richtung weiter ansonsten return Node

das entspricht der Tiefensuche die einfacher ist als dein Code 🙂

mit der möglichkeit ist es egal wo du startest und du latscht jeden punkt immer nur 1 mal ab
 

Zurück
Oben