Swing Labyrinth zeichnen

Todo

Aktives Mitglied
Hi @ all,
habe ein Problem bei der Aufgabenstellung meiner neuen Fachhochschule.
Kurz zum Hintergrund: Bin von der FH Gummersbach zu FH Gelsenkirchen gewechselt.
Mir wurde zwar gesagt das nicht allzu große Unterschiede zwischen allgemeine Informatik (Gummersbach) zu angewandte Informatik Gelsenkirchen) bestehen, aber habe schon ein großes Problem bei den Praktikas.
In der FH Gummersbach haben wir noch nie wirklich mit Swing gearbeitet und somit brauch ich wohl kurz eine Erklärung zu der Aufgabe:

Also wir haben drei vorgegebene Klassen :

Labyrinthdarstellung:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

/**
 * Ein Objekt dieser Klasse stellt ein Labyrinth grafisch dar.
 */
public class Labyrinthdarstellung extends JPanel {
  
  /**
   * Innenabstand der Darstellung vom Fensterrand.
   */
  private static final int INNENABSTAND = 2;
  
  /**
   * Pixel pro Rastereinheit des Labyrinths.
   */
  private int rastermass;
  
  /**
   * Labyrinth, das dargestellt wird.
   */
  private Labyrinth labyrinth;
  
  /**
   * Erzeugt ein Objekt dieser Klasse zur Darstellung des
   * �bergebenen Labyrinths.
   */
  public Labyrinthdarstellung(Labyrinth labyrinth, int rastermass) {
    
    this.labyrinth = labyrinth;
    this.rastermass = rastermass;
    
    this.setBorder(new EmptyBorder(INNENABSTAND, INNENABSTAND,
                                   INNENABSTAND, INNENABSTAND));
  }
  
  /**
   * Liefert bevorzugte Gr��e dieser Darstellung.
   * 
   * @return bevorzugte Gr��e basierend auf Rastermass und
   *         Gr��e des Labyrinths
   */
  @Override
  public Dimension getPreferredSize() {
    
    return (labyrinth == null)
           ? new Dimension(0, 0)
           : new Dimension(rastermass * labyrinth.gibBreite()
                             + getInsets().left + getInsets().right,
                           rastermass * labyrinth.gibHoehe()
                             + getInsets().top + getInsets().bottom);
  }
  
  /**
   * Zeichnet das Labyrinth in die angegebene Grafikumgebung.
   * 
   * @param graphics  Grafikumgebung, in die gezeichnet wird
   */
  public void paintComponent(Graphics graphics) {
    
    super.paintComponent(graphics);
    
    graphics.setColor(Color.BLACK);
    
    for (int i = 0; i < labyrinth.gibAnzahlWandelemente(); i++) {
      Punkt startpunkt = labyrinth.gibStartpunkt(i);
      Punkt zielpunkt = labyrinth.gibEndpunkt(i);
      graphics.drawLine(getInsets().left + rastermass * startpunkt.gibX(),
              getInsets().top + rastermass * startpunkt.gibY(),
              getInsets().left + rastermass * zielpunkt.gibX(),
              getInsets().top + rastermass * zielpunkt.gibY());
    }
  }

}


UILabyrinth:
Java:
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JFrame;

/**
 * Ein Objekt dieser Klasse dient der Darstellung eines Labyrinths.
 */
public class UILabyrinth extends JFrame {
  
  /**
   * H�he des Labyrinths.
   */
  private static final int HOEHE = 10;
  
  /**
   * Breite des Labyrinths.
   */
  private static final int BREITE = 20;
  
  /**
   * Pixel pro Rastereinheit des Labyrinths.
   */
  private static final int PIXEL_PRO_RASTER = 20;
  
  /**
   * Labyrinth, das dargestellt wird.
   */
  private Labyrinth labyrinth;
  
  /**
   * Komponente zur Darstellung des Labyrinths.
   */
  private Labyrinthdarstellung darstellung;
  
  /**
   * Erzeugt die Oberfl�che zur Darstellung des �bergebenen Labyrinths.
   *
   * @param labyrinth  Labyrinth, das dargestellt wird
   * @param rastermass  Anzahl Pixel pro Rastereinheit
   */
  public UILabyrinth(Labyrinth labyrinth, int rastermass) {
    
    super("Labyrinth");
    
    this.labyrinth = labyrinth;
    
    /* Erzeugt die Komponenten dieses Frame.
     */
    erzeugeKomponenten(labyrinth, rastermass);
    
    /* Anwendung beim Schlie�en dieses Frame beenden.
     */
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  
  /**
   * Erzeugt die Komponenten dieses Frame.
   */
  private void erzeugeKomponenten(Labyrinth labyrinth, int rastermass) {
    
    Container container = this.getContentPane();
    container.setLayout(new GridLayout(1, 1));
    
    /*
     * Objekt zur Darstellung des Labyrinths erzeugen und dem
     * Container diesen Frame hinzuf�gen.
     */
    darstellung = new Labyrinthdarstellung(labyrinth, rastermass);
    container.add(darstellung);
  }
  
  /**
   * Start der Anwendung.
   *
   * @param args  wird nicht verwendet
   */
  public static void main(String[] args) {
    
    UILabyrinth fenster = new UILabyrinth(
            new Labyrinth(BREITE, HOEHE), PIXEL_PRO_RASTER);
    fenster.pack();
    fenster.setResizable(true);
    fenster.setVisible(true);
  }
  
}

Punkt:
Java:
/**
 * Ein Objekt dieser Klasse stellt einen Punkt in einer zweidimensionalen
 * Flaeche dar.
 */
public class Punkt {
  
  /**
   * Die x-Koordinate dieses Punkts.
   */
  private short x;
  
  /**
   * Die y-Koordinate dieses Punkts.
   */
  private short y;

  /**
   * Erzeugt einen neuen Punkt.
   * 
   * @param x Die x-Koordinate dieses Punkts.
   * @param y Die y-Koordinate dieses Punkts.
   */
  public Punkt(int x, int y) {
    
    this.x = (short) x;
    this.y = (short) y;
  }
  
  /**
   * Addiert zwei Punkte koordinatenweise und erzeugt daraus einen neuen Punkt.
   * 
   * @param punkt  zu addierender Punkt
   * @return neuer Punkt aus den addierten Koordinaten
   */
  public Punkt addiere(Punkt punkt) {
    
    return new Punkt(this.x + punkt.x, this.y + punkt.y);
  }
  
  /**
   * Liefert genau dann true, wenn dieser Punkt sich innerhalb des Rechtecks
   * befindet, das durch die beiden �bergebenen Punkte beschrieben wird.
   * 
   * @param linkeObereEcke  linke obere Ecke des Rechtecks
   * @param rechteUntereEcke  rechte untere Ecke des Rechtecks
   * @return true genau dann, wenn dieser Punkt im Rechteck liegt
   */
  public boolean istInnerhalb(Punkt linkeObereEcke, Punkt rechteUntereEcke) {
    
    return linkeObereEcke.x <= this.x
            && linkeObereEcke.y <= this.y
            && this.x <= rechteUntereEcke.x
            && this.y <= rechteUntereEcke.y;
  }
  
  /**
   * Gibt die x-Koordinate dieses Punkts zurueck.
   * 
   * @return x-Koordinate
   */
  public int gibX() {
    
    return x;
  }

  /**
   * Gibt die y-Koordinate dieses Punkts zurueck.
   * 
   * @return y-Koordinate
   */
  public int gibY() {
    
    return y;
  }

}

Das soll es erfüllen:
Java:
• Das Labyrinth hat eine rechteckige Grundform. Es ist außen von einer Wand umgeben, die an
der linken und der rechten Seite jeweils eine Öffnung besitzt.
• Im Labyrinth gibt es genau einen Weg zwischen den beiden Öffnungen.
• Jede Wand des Labyrinths führt zur Außenwand des Labyrinths.
• Jeder Gang des Labyrinths hat die Breite eines Rasterkästchens.
• Jede Stelle des Labyrinths ist ausgehend von den Öffnungen des Labyrinths erreichbar. Es gibt
also keinen vollständig von einer Wand umschlossenen Bereich.
Abbildung

Also wir sollen die Klasse Labyrinth erstellen die bisher so aussieht:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author T
 */
class Labyrinth {

        private int breite;
        private int hoehe;
        private Punkt startPunkt = null;
        private Punkt endPunkt = null;

    Labyrinth(int BREITE, int HOEHE) {
        breite = BREITE;
        hoehe = HOEHE;
    }

    int gibBreite() {
        return breite;
    }

    int gibHoehe() {
        return hoehe;
    }

    int gibAnzahlWandelemente() {
        return breite;
    }

    Punkt gibStartpunkt(int i) {
        startPunkt = new Punkt (0,i);
        System.out.println(i+"Startpunkt :" + startPunkt.gibX() + "|" + startPunkt.gibY());
        return startPunkt;

    }

    Punkt gibEndpunkt(int i) {
        endPunkt = new Punkt (breite,i);
        System.out.println(i+"Endpunkt: " + endPunkt.gibX() + "|" + endPunkt.gibY());
        return endPunkt;
    }

}

Ich weiß ist noch nicht zufälligs drin etc, aber ich versuch erstmal zu verstehen wie grundlegend abläuft.
So wie meine Klasse jetzt aufgebaut ist zeichnet er ja im Rastermass komplett die Diagonale, so oft wie es das Rastermass in der Breite zulässt (durchläuft die for-Schleife in Labyrinthdarstellung )
Aber das ist ja nicht der Sinn der Sache!
Wie kann ich denn vorher schonmal die Grundform zeichen, eigentlich ja im Konstruktor, aber wie wähle ich die Punkte aus und wie bekomme ich Öffnungen rein? Einfach die Höhe z.B. halbieren und dann da den Endpunkt auswählen?
Und wie zeichne ich danach die zufälligen Labyrinthenwege? Also ich hab überlegt das man ja dann nur mit Math.random ein zufälligen Startpunkt berechnent und dann zu ein zufälligen Endpunkt gehen muss oder habe ich das was falsches im Gedankengang? Also nicht das ihr denkt ich will eine komplette Lösung das soll nicht das Ziel sein, habe nur etwas Startschwierigkeiten in der FH reinzukommen, für Hilfen bin ich euch sehr dankbar. Danke
 

Marco13

Top Contributor
Er Zeichnet genau DIE Wandelemente, die im Labyrinth enthalten sind. Ich nehme an, deine Aufgabe ist (NICHT zu Zeichnen, sondern) die Wandelemente ins Labyrinth einzufügen, so wie es beschrieben ist.

Im Labyrinth liegt dann nicht EIN Start- und EIN Endpunkt, sondern z.B. Listen mit allen Endpunkten:
Java:
class Labyrinth {
 
    private int breite;
    private int hoehe;
    private List<Punkt> startPunkte = new ArrayList<Punkt>();
    private List<Punkt> endPunkte = new ArrayList<Punkt>();
 
    Labyrinth(int BREITE, int HOEHE) {
        breite = BREITE;
        hoehe = HOEHE;

        startPunkte.add(new Punkt (0,0));
        endPunkte.add(new Punkt (0,1));

        startPunkte.add(new Punkt (0,1));
        endPunkte.add(new Punkt (1,1));

        ...
    }

    Punkt gibStartpunkt(int i) {
        return startPunkte.get(i);
    }
 

Todo

Aktives Mitglied
Ja ok habe ich wohl verstanden, eigentlich macht das Programm doch eigentlich nichts anderes, als die Startpunkte, die ich vorgebe mit meinen Endpunkten zu verbinden oder?

Habe jetzt eine Klasse Grundriss geschrieben wo die Punkte für den Grundriss in ein Array liegen (quick&dirty)

Grundriss
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author T
 */
public class Grundriss {

        Object[] startPunkte = new Punkt[6];
        Object[] endPunkte = new Punkt[6];

        public Grundriss(int breite, int hoehe) {
            this.startPunkte[0] = new Punkt(0,0);
            this.startPunkte[1] = new Punkt(breite,0);
            this.startPunkte[2] = new Punkt(breite,hoehe/2+1);
            this.startPunkte[3] = new Punkt(breite,hoehe);
            this.startPunkte[4] = new Punkt(0,hoehe);
            this.startPunkte[5] = new Punkt(0,hoehe/2);

            this.endPunkte[0] = new Punkt(breite,0);
            this.endPunkte[1] = new Punkt(breite,hoehe/2);
            this.endPunkte[2] = new Punkt(breite,hoehe);
            this.endPunkte[3] = new Punkt(0,hoehe);
            this.endPunkte[4] = new Punkt(0,hoehe/2+1);
            this.endPunkte[5] = new Punkt(0,0);
        }

        public Object gibstartPunkte(int i) {
            return startPunkte[i];
        }

        public Object gibendPunkte(int i) {
             return endPunkte[i];
        }
}

und meine Klasse Labyrinth sieht jetzt so aus:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author T
 */
class Labyrinth {

        private int breite;
        private int hoehe;
        Grundriss grundriss =  null;

    Labyrinth(int BREITE, int HOEHE) {
        this.breite = BREITE;
        this.hoehe = HOEHE;
        grundriss = new Grundriss(breite,hoehe);
    }
  

    int gibBreite() {
        return breite;
    }

    int gibHoehe() {
        return hoehe;
    }

    int gibAnzahlWandelemente() {
        return 6;
    }

    Punkt gibStartpunkt(int i) {
        return (Punkt) grundriss.gibstartPunkte(i);
    }

    Punkt gibEndpunkt(int i) {
        return (Punkt) grundriss.gibendPunkte(i);
    }

}

So gut so gut.
Jetzt kommt ja das eigentliche Problem.
Jetzt würd ich mir wieder ne Klasse mit Arrays anlegen, wo ich mir mit Hilfe von Math.Random (steht auch in der Beschreibung vom Praktikum das ich es damit machen soll) einen zufälligen Punkt an der Wand suche. Aber jetzt kommt ja das eigentlich schwierige. Wie kann ich denn zufällig nach links/rechts/hoch/runter gehen, und keine Wand berühren?
Danke für eure Hilfe
 

Marco13

Top Contributor
Die Trennung von "Grundriss" und "Labyrinth" KÖNNTE (!) unsinning sein... es könnte auch Vorteile haben, aber ich denke, dass das Labyrinth gerade dazu da ist, die Funktion anzubieten, die jezt von Grundriss angeboten wird.
Ist aber nur ein Detail.

Man hat ein Gitter, mit Koordinaten. Wenn man bei den Koordinaten (0,3) ist, dann weiß man, dass man nicht nach (-1,3) gehen kann. Hm. Kannst du die Frage präzisieren?
Man kann mit
if (x<0) { ... }
abfragen, ob ein Wert negativ ist.
Das ist es wohl nicht?
 

André Uhres

Top Contributor
Die Grundform des Labyrinths können wir durch ein zweidimensionales Array darstellen. Seine Größe ist: breite mal hoehe, wobei "breite" die Anzahl der horizontalen Kästchen ist und "hoehe" die Anzahl der vertikalen Kästchen. Wenn r eine Referenz zu einem Random Objekt ist, dann haben wir folgenden zufälligen Startpunkt und zufälligen Zielpunkt:
start.x = 0, start.y = Math.abs(r.nextInt() % hoehe)
ziel.x = breite - 1, ziel.y = Math.abs(r.nextInt() % hoehe)
Das Array füllen wir in zwei verschachtelten for-Schleifen mit Cell-Objekten. Die Cell Klasse beschreibt ein einzelnes Kästchen mit seinen Außenwänden, Wänden, Koordinaten, ob es beim Wegsuchen besucht wurde, ob es beim Wegsuchen verworfen wurde, ob es das Startkästchen ist und ob es das Zielkästchen ist. Anfangs sind alle vier Wände von jedem Kästchen "aufgebaut". Beim Anlegen des Labyrinths werden dann die Kästchen durchlaufen und "Durchbrüche" zu zufällig ausgewählten Nachbarkästchen gemacht. Um den Weg durch das Labyrinth vom Start zum Ziel zu finden, wird vom Startkästchen ausgegangen und solange gesucht, bis das Zielkästchen gefunden wurde. Dabei wird jeweils das nächste erreichbare und noch nicht besuchte Nachbarkästchen besucht, falls vorhanden. Falls nicht vorhanden, wird das laufende Kästchen verworfen, da es in dem Fall nicht zum Zielweg gehört.
 

Todo

Aktives Mitglied
Hi nochmal,
also das mit dem vorherigen Labyrinth habe ich mal verworfen....

Das mit dem 2 dimensionales Array kam mir auch schon im Sinn, somit habe ich ja dann jede Koordinate die das Labyrinth zur Verfügung stellt (wenn ich es in Abhängigkeit von der breite und höhe mache) wie André Uhres es schon gesagt hat.

Am besten wäre es doch, wenn ich in mein 2 dimensionales Array "markieren" könnte ob er schon mit einen "Nachbar" verbunden ist oder nicht.

@ André Uhres
Habe noch eine Frage zum Thema Cell-Klasse
also die Koordinaten okay da werde ich ja die x,y Koordinate zurück geben, wie es die Klasse Punkt auch schon macht oder nicht?
Aber zu den Wänden und Aussenwänden, also die Auswände müsste ich ja nur Prüfen, ob die x-Koordinate oder y-Koordinate 0 ist und jeweils mit einer weiteren 0 x-Koorinate bzw y-Koordinate verbunden ist (ausser an 2 bestimmten Punkten wo die Öffnung ist)
So zu den Wänden, da stehen bei mir irgendwie noch große Fragezeichen im Kopf. Wie bekomme ich raus ob es eine Wand exestiert? Also ganz Banal gesehen ja wenn Array[5][5] als Beispiel als Zielkoordinate entweder [5][6] , [5][4].. etc hat oder denk ich zu Einfach für sowas?
Danke schonmal für eure Hilfe......

[EDIT]
Darf man auch den Grundriss in ein extra Array packen und die Koordinaten einfach im Array packen und durchlaufen oder ist das schlechte Programmierstiel? Weiß aber sonst nicht wie ich es machen soll und leider auch nicht mit den 2-d Array

Also so würd ich den Grundriss machen:
Java:
    private void grundriss_Punkte() {
            Grundriss [0] = new Punkt(0,0);                 //1 SP
            Grundriss [1] = new Punkt(breite,0);            //2 SP
            Grundriss [2] = new Punkt(breite,hoehe/2+1);    //3 SP
            Grundriss [3] = new Punkt(breite,hoehe);        //4 SP
            Grundriss [4] = new Punkt(0,hoehe);             //5 SP
            Grundriss [5] = new Punkt(0,hoehe/2);           //6 SP

            Grundriss [6] = new Punkt(breite,0);            //1 EP
            Grundriss [7] = new Punkt(breite,hoehe/2);      //2 EP
            Grundriss [8] = new Punkt(breite,hoehe);        //3 EP
            Grundriss [9] = new Punkt(0,hoehe);             //4 EP
            Grundriss [10] = new Punkt(0,hoehe/2+1);        //5 EP
            Grundriss [11] = new Punkt(0,0);                //6 EP
    }
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Ich verstehe nicht, was du mit dem Grundriss überhaupt meinst und wozu der gut sein soll. Mehr als ein zweidimensionales Array mit allen Kästchen braucht man doch nicht, um alle Infos vom Labyrinth darin unterzubringen.
Was die Wände betrifft, so könnte man erstmal eine Directions Klasse machen mit vier boolean Attributen: north, east, south, west. Dann braucht man in der Cell Klasse nur ein Attribut "Directions wall". In dem Fall würde z.B. "cell.wall.isNorth()" bedeuten, dass das Kästchen eine Nordwand hat. Ebenso kann man für die Außenwände ein Attribut "Directions border" einfügen, dann braucht man nicht immer die Koordinaten zu überprüfen, was wahrscheinlich komfortabler ist, aber wohl nicht unbedingt sein muss:
Java:
if (y1 == 0) {
    border.setNorth(true);
}
if (y1 == hoehe - 1) {
    border.setSouth(true);
}
if (x1 == 0) {
    border.setWest(true);
}
if (x1 == breite - 1) {
    border.setEast(true);
}
Für die Koordinaten ist deine Punkt Klasse durchaus brauchbar, obwohl die Methoden "addiere" und "istInnerhalb" hier sicher überflüssig sind. In dem Fall hätte die Cell Klasse z.B. ein Attribut "Punkt coordinates".
Dein vorgeschlagenes Array[5][5] (eigentlich Cell[5][5]) als Beispiel hätte als erstes Kästchen oben links: array[0][0]. Und als letztes Kästchen unten rechts: array[4][4]. Um z.B. herauszubekommen ob array[0][0] eine Südwand hat, braucht man nur "array[0][0].wall.isSouth()" abzufragen (der Einfachheit halber wäre das Attribut "wall" in dem Fall als "public" definiert).
 
Zuletzt bearbeitet:

Todo

Aktives Mitglied
also ich meine mit dem Grundriss, den wir vorgegeben bekommen haben.
Also eigentlich nur ein Rechteck, wo auf der linken Seite und auf der Rechte Seite jeweils auf der Hälfte eine Öffnung hat, also nicht durchgezeichnet.
Aber deine Cell Klasse hört sich schonmal sehr gut an muss ich sagen werde es damit mal Probieren
Eine Directions Klasse muss ich mal in Büchern welsen was das ist das habe ich noch nicht so gehört
Danke schonmal für deine Hilfe.

PS: Die Klasse Punkt wurde vom Prof vorgegegen genauso wie Labyrinthdarstellung und UILabyrinth.

EDIT:

Also zuerst würd ich mir jetzt erstmal mein 2 dim Array mit den Koordinaten füllen lassen das würde dann so aussehen:
Java:
    private void fülleArray(){
        for (int i=0;i<hoehe;i++){ // senkrecht
            for (int j=0;j<breite;j++){ //waagerecht
                Array[j][i]=new Punkt(j,i);
            }
        }
    }

und dann eine public Funktion um zu prüfen ob es in north west .... eine Wand gibt.

Jetzt mal ne blöde Frage :-X gehört das in der Klasse Labyrinth ? Oder alles in der Cell? Also von wegen der Funktion nord west ... würde ich der Cell schreiben, weils ja nur die Wände betrift, aber das 2 dim Array müsste doch ins Labyrinth oder :-[ ?
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Eine Directions Klasse muss ich mal in Büchern welsen was das ist das habe ich noch nicht so gehört.
Och, ich hab doch gesagt, was das ist: sie hat nichts weiter als die vier booleans. Ich hätte sie auch anders nennen können, aber ich dachte "Directions" wäre selbsterklärend:
Java:
class Directions {
    private boolean north,  east,  south,  west;
    public Directions(final boolean north, final boolean east, final boolean south, final boolean west) {
        this.north = north;
        this.east = east;
        this.south = south;
        this.west = west;
    }
    public boolean isEast() {
        return east;
    }
    public boolean isNorth() {
        return north;
    }
    public boolean isSouth() {
        return south;
    }
    public boolean isWest() {
        return west;
    }
    public void setEast(final boolean east) {
        this.east = east;
    }
    public void setNorth(final boolean north) {
        this.north = north;
    }
    public void setSouth(final boolean south) {
        this.south = south;
    }
    public void setWest(final boolean west) {
        this.west = west;
    }
}
 

Todo

Aktives Mitglied
Wenn ich das dann jetzt endlich mal richtig verstanden habe :)
Sorry bin irgendwie mit Gui absolut nicht vertraut leider.....

Meine Klasse Cell, die ja eine Wand beschreiben soll, da bräuchte ich doch folgene Attribute:

startPunkt [x,y]
endPunkt [x,y]

die beiden Koordinaten brauch ich doch um eine Wand zu beschreiben oder seh ich das jetzt wieder falsch ?
 

André Uhres

Top Contributor
Die Cell Klasse ist das Modell eines Kästchen und nicht seine graphische Darstellung. Die graphische Darstellung liegt im Bereich der Klasse, die das Kästchen malen wird, nennen wir sie z.B. CellComponent, die wir von JComponent ableiten können und wo wir die callback Methode "paintComponent(..)" überschreiben können um die Malarbeit durchzuführen. CellComponent muss natürlich genau die Breite und Höhe des Kästchen kennen, um es korrekt darstellen zu können. Die Cell Klasse hingegen muss nur wissen, welche von den vier möglichen Wänden vorhanden, bzw. nicht vorhanden sind.
 

Todo

Aktives Mitglied
hm ich glaub ich bin da echt zu doof für!!

Also ich hätte mir jetzt eine Cellklaase geschrieben, die ungefähr so aussieht:

Java:
public class Cell {
    
    private Punkt start;
    private Punkt ziel;
    private Directions orientierung;


    public Cell(Punkt s, Punkt z, Directions d) {
        this.start = s;
        this.ziel = z;
        this.orientierung = d;
    }

    public void konstCell (Punkt s, Punkt z, Directions d, Object Array[][]) {


    }
}

Also so das ich mir mit der KLasse Cell ein Object anlegen kann, wo ich dann mit ein Start und Ziel Punkt, mit der Orrientierung eine Wand konstruieren kann. Also ich würde mir die Punkte dann in den 2 dim Array hinterlegen und dann irgendwie zum Schluss das 2 dim Array in der KLasse Labyrinth durchlaufen würde und alle Wände, die da hinterlegt sind zeichnen würde, aber genau wie weiß ich leider auch noch nicht und irgendwie schaff ich es leider nicht :(


EDIT:
Muss man das vielleicht mit Hilfe der Graphentheorie entwickeln ?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Die Cell Klasse ist das Modell eines Kästchen und nicht seine graphische Darstellung. Die graphische Darstellung liegt im Bereich der Klasse, die das Kästchen malen wird, nennen wir sie z.B. CellComponent, die wir von JComponent ableiten können und wo wir die callback Methode "paintComponent(..)" überschreiben können um die Malarbeit durchzuführen.

Das kommt mir bekannt vor :D Aber... ich glaube, da ist bei einem von uns etwas falsch angekommen: Wenn ich das richtig sehe, soll die vorgegebene Klasse "UILabyrinth" verwendet werden, die das komplette Labyrinth zeichnet. Man kann dort also nicht ohne weiteres eigene Modell-Unterteilungen vornehmen. Die die kleinste graphisch repräsentierte Einheit ist das Labyrinth, dessen Schnittstelle vorgegeben ist. Und ich denke, das hängt damit zusammen, dass es weniger um das Zeichnen an sich geht, als vielmehr um die Erzeugung des Labyrinths mit den gegebenen Bedingungen.

@Todo: Das mit der Graphentheorie ist (FALLS meine Interpretation stimmt) nicht ganz falsch. Was mit diesem Labyrinth beschrieben wird, IST ja ein Graph. So ein Labyrinth
Code:
 _____
 _ _  |
|    _|
|_|_ _
wäre genau so ein Graph
Code:
 o-o-o
     |
 o-o-o
 | |
 o o-o

Es gäbe SEHR viele Möglichkeiten, das innerhalb der Labyrinth-Klasse zu modellieren. Spätestens, wenn man die besagten Kriterien überprüfen will, wäre es praktisch, dort eine an einem Graphen orientierte Repräsentation zu haben, aber es kann sein, dass dafür das "Aufbauen" an sich schwieriger werden würde).

Die Cell-Klasse, die André Uhres angedeutet hatte, käme dem an sich schon entgegen. Wenn ich das richtig verstanden hatte war aber nicht gedacht, dass diese Klasse wirklich Wände enthält, sondern nur die Information, OB in einer bestimmten Richtung eine Wand liegt oder nicht. Die Schwierigkeit wäre IMHO dabei, dass die Cell-Objekte und die Wandelemente voneinander abhängen, und es kompliziert sein könnte, das Labyrinth so aufzubauen, dass alles stimmt und Cell- und Wandobjekte zueinander passen ...

Vielleicht nochmal Schrittweise: Das Labyrinth muss die Wandelemente anbieten (in Form von jeweils einem Start/Endpunkt). Für ein vollständiges Labyrinth der Größe 2x2 wie das hier
Code:
(0,0)----------(1,0)----------(2,0)
  |              |              |
  |              |              |
  |              |              |
  |              |              |
  |              |              |
(0,1)----------(1,1)----------(2,1)
  |              |              |
  |              |              |
  |              |              |
  |              |              |
  |              |              |
(0,2)----------(1,2)----------(2,2)
hätte man dann jeweils die Start- und Endpunkte der Wandelemente:
(0,0) - (1,0)
(1,0) - (2,0)
(0,0) - (0,1)
...
(1,2) - (2,2)

Da kommt man kaum drumrum, denn DASS diese Information angeboten werden muss, ist durch die Zeichen-Klasse vorgegeben.

Bis dahin irgendwelche Einwände oder andere Meinungen?
 

André Uhres

Top Contributor
ich glaube, da ist bei einem von uns etwas falsch angekommen
Bei meinem Cell-Konzept gibt es keine wirklichen "Wandobjekte", nur Kästchen mit jeweils bis zu vier Wänden. Die Wände sind also fester Bestandteil eines Kästchens. Das dürfte uns aber nicht daran hindern, die Darstellung "wandweise" umzusetzen (hatte ich in der Tat übersehen) statt "kästchenweise". Die Wandkoordinaten sind ja einfach berechenbar. Das Kästchen (x,y) hat die Wände [(x,y) ; (x+1,y)], [(x+1,y) ; (x+1,y+1)], [(x+1,y+1) ; (x,y+1)] und [(x,y+1) ; (x,y)]. Für jede nicht vorhandene Wand setzen wir seine beiden Eckpunkte einfach gleich. Das ganze Labyrinth hat mit diesem Konzept zwar viel mehr "Wände" als unbedingt nötig (nämlich genau "vier mal hoehe mal breite"), aber das ist ja wohl egal.
 
Zuletzt bearbeitet:

Todo

Aktives Mitglied
So wie du (Marco13) es mit dem kleinen Labyrinth gemacht hast habe ich ja an Anfang das Grundgerüst gezeichnet. Da dieses fest vorgegeben ist. Du hast es richtig verstanden die KLasse UILabyrinth Punkt Labyrinthdarstellung sind vorgegeben. Prinzipel habe ich immer nur die Möglichkeit, 2 Punkte zu zeichnen (startPunkt und zielPunkt) die ich zurückgebe mit der Funktion gibStartPunkt und gibEndpunkt. Dann kam, bzw wurde mir als Tip gegeben das 2 dimensionales Array, dann habe ich mir das mal ganz einfach auf ein Zettel gemalt. Da kam mir das mit der Graphentheorie im Sinn. Ist ja eigentlich nichts anderes, dachte vielleicht wäre das ja einfacher in Java umzusetzen. Mit der Funktion, gibWandelemente kann ich nur bestimmen wie oft er in die Funktion gibStartPunkt und gibEndpunkt springt. Habe mir schon überlegt, das komplette Labyrinth irgendwie in ein 2 dimensonales Array zu speichern und dann mit der Funktion gibStartPunkte und gibEndpunkte einmal komplett das Labyrinth zu durchlaufen, aber in den beiden Funktion bekomme ich jegelich ein Integerwert dazu den ich vorher mit gibAnzahlwandelemente festgelegt habe und dann wüsste ich nicht wie ich ein 2 dimensionales Array zurückgeben soll. Mit diesen Ansichtspunkt ist mir nur eine Liste eingefallen die ich dann einmal abklappern kann wo drinsteh welche Punkte verbunden werden sollen, aber so eine Liste sollte ja auch zufällig generiert werden und dann weiß ich auch schon wieder nicht mehr weiter
 

André Uhres

Top Contributor
Die vorgegebenen Klassen sind problemlos in mein Konzept integrierbar. Z.B. könnte die Methode "gibStartpunkt" etwa so aussehen:
Java:
    Punkt gibStartpunkt(int i) {
        int x = (i / 4) % breite;
        int y = (i / 4) / breite;
        int n = i % 4;
        switch (n) {
            case 0:
                startPunkt = new Punkt(x, y);
                break;
            case 1:
                startPunkt = new Punkt(x + 1, y);
                break;
            case 2:
                startPunkt = new Punkt(x + 1, y + 1);
                break;
            case 3:
                startPunkt = new Punkt(x, y + 1);
                break;
        }
        return startPunkt;
    }
Dazu braucht man selbstverständlich noch eine handvoll eigene Methoden, wie etwa die folgenden:
void initArray() {..}
void createLabyrinth() {..}
Cell random() {..}
Cell randomNeighborCellWithWallsUp(final Cell currentCell) {..}
void removeWall(final Cell currentCell, final Cell neighborCell) {..}
und natürlich die eigenen (äusserst einfachen) Klassen Cell und Directions.

Die Methode "createLabyrinth" könnte man etwa so umsetzen:
Java:
    public void createLabyrinth() {
        stack = new Stack<Cell>();
        totalCells = hoehe * breite;
        currentCell = random();
        visitedCells = 1;
        while (visitedCells < totalCells) {
            neighborCell = randomNeighborCellWithWallsUp(currentCell);
            if (neighborCell == null) {
                currentCell = stack.pop();
            } else {
                removeWall(currentCell, neighborCell);
                stack.push(currentCell);
                currentCell = neighborCell;
                visitedCells++;
            }
        }
    }
 

Anhänge

  • labyrinth.jpg
    labyrinth.jpg
    21 KB · Aufrufe: 70
Zuletzt bearbeitet:

Mugi

Mitglied
Was ein zufall,ich sitze grade auch an der Aufgabe jedoch verstehe ich das ganze auch noch nicht. Also ich weiß das das Labyrinth auf einem
2 Dimensionalen Array basiert aber wie kann man denn da die Linien zeichnen bzw. denen sagen das die dort hin gehören. Wäre cool wenn mir ma einer erklären könnte wie man sich das alles genau vorstellen muss.

Übrigens die genannten Klassen sind vorgegeben wir sollen aber mit der Methode Math.Random ein zufälliges Labyrinth gerüst zeichnen was links und rechts in der Mitte offen ist. Nur die Mauern sollen zufällig gemalt werden und eben die Eigentschaften eingehalten werden.


@André Uhres
Wir dürfen nicht mit Switch und case arbeiten!
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Das switch-case zu ersetzen sollte kein Problem sein, man kann ja auch mit if-else arbeiten:
Java:
if(n == 0){
    startPunkt = new Punkt(x, y);
}else if (n == 1){
    startPunkt = new Punkt(x + 1, y);
}else if ...

Um die die Linien zu zeichnen braucht man nur die Methoden Labyrinth#gibAnzahlWandelemente(), Labyrinth#gibStartpunkt(int i) und Labyrinth#gibEndpunkt(int i) zu implementieren, was ziemlich einfach ist (siehe mein Beispiel für gibStartpunkt).
Ich hatte verstanden, dass die Öffnungen links und rechts im Labyrinth nicht unbedingt in der Mitte sein müssen, sondern an einer zufälligen Position. Aber das ist eigentlich egal. Man kann ja eh von irgendeinem Punkt ausgehend immer alle anderen Punkte erreichen.
 

Gamerzstyle

Mitglied
@André Uhres
Wir dürfen nicht mit Switch und case arbeiten!

seit wann das denn hab schon öfter switch benutzt und hab trotzdem volle punktzahl bekommen, wir sollen nur kein break benutzen wenn es nicht gerade nötig ist (also bei switch ist es erlaubt).
naja zum labyrinth, ich finde eine cell klasse unnötig (und da ich nie in den Vorlesungen bin ich mir nichtmal sicher ob wir überhaupt extra klassen verwenden dürfen) es reicht vollkommen wenn man die punkte nummeriert und in ner boolean variable speichert ob da eine wand dran ist oder nicht, der rest ergibt sich von selbst

@edit:
luis verwendet die methoden gibStartpunkt(index) und gibEndpunkt(index), dabei steht index für den zähler der wandelemente er zeichnet immer von startpunkt1-> endpunkt1, startpunkt2-> endpunkt2 usw.
als limit benutzt er die anzahl der wandelemente, falls die zahl vom maximalen index abweicht bekommst du nen fehler
 
Zuletzt bearbeitet:

Mugi

Mitglied
Ich versteh net ganz was es mit den Methoden gibAnzahlWandelemente(), Labyrinth#gibStartpunkt(int i) und Labyrinth#gibEndpunkt(int i) auf sich hat. Also wie diese genau funktionieren im Labyrinth. Dachte die müssten mit dem math.random zufällig die punkte suchen. Bei Starpunkt und Endpunkt weiß ich das er abfragen muss wie er vorran zugehen hat aber dies soll ja auch zufällig passieren.


Also bei deinem Startpunkt wird abgefragt in welche richtung der Zeichnen soll aber warum ändern sich dann x und y werte? falls n=2 ist?
Dachte es ändert sich immer nur 1 wert halt so wie nach links rechts unten oben

wegen switch..

Er meint wir sollten es vermeiden damit zu arbeiten, mehr kann ich auch net dazu sagen ^^
 
Zuletzt bearbeitet:

Mugi

Mitglied
Wenn i gleich die Anzahl der Wandelemente ist, warum werden dann x mit i/4 & breite und y mit i/4 / breite deklariert?

Die Anzahl der Wandelemente ist nicht gleich die Breite des Labyrinths?

Fragen über Fragen aber sry ich blick da nicht durch..:(
 

Marco13

Top Contributor
Das mit dem "/4" war für die Annahme, dass das Labyrinth und die Wandelemente nicht so codiert sind, wie ich in dem Bild auf der letzten Seite beschrieben habe, sondern für den Fall, dass quasi alle Wände "doppelt" vorliegen, und jedes Kästchen 4 Wandelemente hat
Code:
 ----  ----
|    ||    |
|    ||    |
 ====  ====
|    ||    |
|    ||    |
 ----  ----

Unabhängig davon ist eine "Schwierigkeit" bei dieser Aufgabe die "Dualität" zwischen
- Wänden zwischen Zellen (im gezeichneten Labyrinth)
- Kanten zwischen Knoten (im "Graphen")
Das heißt, zwischen zwei Zellen ist eine Wand, genau dann wenn zwischen den Knoten des entsprechenden Graphen KEINE Kante ist. Vielleicht kann man das auch irgendwie für die Modellierung ausnutzen.
 

Gamerzstyle

Mitglied
[JAVA=1] public Punkt gibStartpunkt(int i){
return this.wandanfang;
}
public Punkt gibEndpunkt(int i){
return this.wandende;
}
public int gibAnzahlWandelemente(){
int i=0;
while (this.wandende != null){
i++;
}
return i;
}[/code]
das generieren machst du innerhalb des labyrinth constructors und nummerierst die wandelemente durch von 1 bis zur anzahl der wandelemente, da ich einfach einen großen array benutze zähle ich die belegten einfach hoch bei gibAnzahlWandelemente(). bei mir gibts momentan keine probleme beim generieren aber mein aufwand ist glaub ich höher als länge*breite (aber ehrlich gesagt kA wie man das ausrechnet ^^)
 

Todo

Aktives Mitglied
ah ok du hast zwei arrays genommen dafür einmal für start und einmal für ende, habe es einfach in ein gepackt.
aber im großen und ganzen hab ich die drei Methoden so ähnlich.

Aber darin lag ja auch nicht die Schwierigkeit.

Wenn du keine eigene Cell KLasse etc geschrieben hast, hast du doch sau viele Methoden in deiner Labyrinth Klasse oder nicht?
Also so Methoden wie setWest .... etc muss du dann ja in der Labyrinth Klasse haben fänd ich ein wenig unübersichtlich.
Aber soll dir ja gefallen und nicht mir, deins läuft ja anscheinend meins ja noch nicht :-D
Mein Problem ist einfach, irgendwie die passen start und ziel Punkte zu finden, berechnen.
Also ich such mir immoment ein zufälligen Punkt auf der Höhe und Breite.
Dann lass ich mir eine ZUfallszahl zwischen 1 und 4 generieren (1 für links 2 für rechts....)
Leider sieht das alles noch unstrokturiert auf, es kommen noch geschlossene Felder zustande etc......
 

Gamerzstyle

Mitglied
so wird das nicht klappen denn:
Neue Wandelemente werden dem Labyrinth so hinzugefügt, dass sie an genau einer Stelle ein
schon vorhandenes Wandelement berühren. Machen Sie sich klar, was passiert, wenn Sie zulassen,
dass das neue Wandelement entweder kein Wandelement oder zwei Elemente berührt.
du musst also von deinen bereits verwendeten punkten einen zufälligen punkt nehmen und da die wände starten bzw weiterziehen und natürlich auch darauf prüfen ob die punkte darum belegt sind (prüf ich mit nem boolean array)

wobei meine labyrinth klasse wirklich relativ überfüllt ist, aber solang er nichts ausdrücklich in der aufgabe sagt mach ich es auch nicht.
 

Todo

Aktives Mitglied
hmm....

also ich kapier das immoment noch nicht so hatte vorher noch nie Swing :(
Also wie ich es irgendwie versucht hätte:

Leider weiß ich nachher auch nicht mehr weiter :( :
Also ich hätte erstmal 2 Arrays erstellt, einmal start einmal ziel.
Dann würd ich mir ein zufälligen startpunkt nehmen den in start array packen.
Dann eine zufallszahl zwischen 1 und 4 erstellen 1 für links 2 für rechts.....
Da wird dann ein neuer Punkt generiert (-1+x,y)(+1+x,y) den dann in Zielarray speichern und den Zielpunkt als mein nächster Startpunkt nehmen
So dann würd ich es so lange machen bis ich an einen Rand komme.
Wenn ja dann ein neuen Startpunkt generieren und von vorne....

Jedoch darf es ja keine doppelten Wände haben etc...
Da hab ich einfach keine Idee.
Du machst es mit ein boolean Array, also ein 2 dimensionales Array wo du jede auf true setzt die es schon gibt?
Oder wie kann ich es mir vorstellen?

Ich bin da echt zu blöd für :D
 
Zuletzt bearbeitet:

Marco13

Top Contributor
so wird das nicht klappen denn:
Neue Wandelemente werden dem Labyrinth so hinzugefügt, dass sie an genau einer Stelle ein
schon vorhandenes Wandelement berühren. Machen Sie sich klar, was passiert, wenn Sie zulassen,
dass das neue Wandelement entweder kein Wandelement oder zwei Elemente berührt.

Wenn das ein Zitat aus der Aufgabenstellung ist, macht das das ganze ja schon etwas einfacher. Allerdings macht das IMHO hauptsächlich bei den Wandelementen Sinn, die NICHT an eine Rand-Wand grenzen.

Wie schon angedeutet: Es geht bei dieser Aufgabe wohl NICHT um Swing und NICHT um's Zeichnen, sondern um das Erzeugen des Labyrinths. Alles, was zum Zeichnen benötigt wird, ist vorgegeben, und man muss nur noch die 3 Methoden implementieren (und eben eine zum Erstellen des Labyrinths).

Du könntest die Klasse im Prinzip also so schreiben, wie in diesem Beitrag angedeutet. Das Erzeugen wäre dann als Pseudocode nur noch sowas wie
Java:
void erzeuge()
{
    Punkt s = null;
    Punkt e = new Punkt (0,0); // Zufällige RAND-Position wählen
    while (true)
    {
        s = e;
        e = erzeugeNachfolger(s);
        if (e == null) return;
        startPunkte.add(s);
        endPunkte.add(e);
    }
}
wobei "erzeugeNachfolger" einen neuen (End)Punkt für den gegebenen Startpunkt liefert. Der Endpunkt liegt dann entweder über,unter, rechts oder links vom gegebenen Punkt, oder ist 'null' wenn man keinen weiteren Punkt mehr anhängen kann.

(Ich glaube, das Problem ist bei weitem nicht so schwer, wie es hier teilweise erschien... ;) )
 

Todo

Aktives Mitglied
startPunkte.add(s);
endPunkte.add(e);

Damit meinst du sicherlich ein Array oder ne Liste denk ich mal ne ?!

erzeugeNachfolger habe ich mir ungefair so gedacht nur das die bei mir anders heißt aber der Name ist ja sh** egal :
Java:
    private Punkt suchenaechstenPunkt(Punkt s) {
        int zufall = (int) Math.random() * 4 + 1;
        int a = s.gibX();
        int b = s.gibY();
        
        do {
        if(zufall == 1) a++;    //rechts
        if(zufall == 2) a--;    //links
        if(zufall == 3) b++;    //runter
        if(zufall == 4) b--;    //hoch

        this.loeschevorhandenenPunkt(a, b);
        }while(this.loeschevorhandenenPunkt(a, b)!=true);
        return new Punkt (a,b);
    }

immoment habe ich mir es so gedacht, das ich das Labyrinth in ein 2 dimensionales boolean Array darstelle, habe immoment alles auf false aber das wird so nicht klappen da ich dann nie ein Ende finde ist aber nur zum ausprobieren...
Dann habe ich noch meine StartPunkte, die ich annehemen kann in ein Array gespeichert.
So da suche ich mir mit der Methode sucheWandelement ein zufälligen Punkt
Java:
    private Punkt sucheWandelement() {
        boolean istnochfrei = true;
        do {
        this.zufallstelle = (int) Math.random()* this.Punkte.length + 1;
            if(this.Punkte[zufallstelle] != null) {
                this.Array[Punkte[zufallstelle].gibX()][Punkte[zufallstelle].gibY()] = true;
                this.loescheWandelement(zufallstelle);
                istnochfrei = false;
            }
        }while(istnochfrei!=true);
        
        return this.Punkte[zufallstelle];
    }

So wenn ich dann ein Punkt gefunden hab setzt ich denn null in mein Array mit der Methode loescheWandelement
Java:
    private void loescheWandelement(int a) {
        this.Punkte[a] = null;
    }

Und dann gibs bei mir noch die Methode loeschevorhandenPunkt, die soll mir die Punkte "makieren" wo ich schon war
Java:
    private boolean loeschevorhandenenPunkt(int a, int b) {
        if(this.Array[a][b] == false) {
            this.Array[a][b] = true;
            return true;
        }
        else return false;
    }

Insgesamt sieht der Quellcode so aus, wobei ich die Arrays StartPunkte und Zielpunkte extra einfach mal groß angenommen habe zum Testen. Gib anzahl Wandelemente habe ich extra auch auf 20 eingestellt wieder zu Testzwecken.
Irgendwie fehlt mir grad echt der Überblick leider, aber habe da wieder 2 Tage reingesteckt an arbeit, deshalb meine Frage, bin ich wenigstens auf den richtigen Weg der sich lohnt weiter zu gehen oder sagt ihr alles Blödsinn? Wäre mal nett zu hören was ihr davon haltet. Danke schonmal. gibStart und gibEndpunkte habe ich immoment noch nicht definiert weil ich noch nicht genau weiß wie ich das da machen will :-D

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author T
 */
class Labyrinth {
    private int breite,hoehe;
    private boolean Array [][];
    private Punkt Punkte[];
    private Punkt startPunkt[];
    private Punkt zielPunkt[];
    private int arraygroeße;
    private int zufallstelle;

    public Labyrinth(int b, int h) {
        this.breite = b;
        this.hoehe = h;
        this.Array = new boolean[b][h];
        this.Array[b][h] = false;
        this.arraygroeße = 2*b+2*h-3;
        this.Punkte = new Punkt[arraygroeße];
        this.startPunkt = new Punkt[1000];
        this.zielPunkt = new Punkt[1000];
        this.definiereWandelemente();
    }

    int gibBreite() {
        return this.breite;
    }

    int gibHoehe() {
        return this.hoehe;
    }

    int gibAnzahlWandelemente() {
      /* int i=0;

            while (this.Punkte[i] != null)    {
            i++;
        }
        return i;*/ return 20;
    }

    Punkt gibStartpunkt(int i) {
        return this.sucheWandelement();
    }

    Punkt gibEndpunkt(int i) {
        return this.suchenaechstenPunkt();
    }

    private void definiereWandelemente() {
        int index = 0;
        for(int i=0;i<hoehe;i++) {
            for(int j=0;j<breite;j++){
                if(i==0 || i==hoehe-1) {
                    this.Punkte[index] = new Punkt(j,i);
                    index++;
                }
                
                if(j==0 && i>0 && i<hoehe-1 || j==breite-1 && i>0 && i<hoehe-1) {
                    this.Punkte[index] = new Punkt(j,i);
                    index++;
                }
            }
        }
    }

    private Punkt sucheWandelement() {
        boolean istnochfrei = true;
        do {
        this.zufallstelle = (int) Math.random()* this.Punkte.length + 1;
            if(this.Punkte[zufallstelle] != null) {
                this.Array[Punkte[zufallstelle].gibX()][Punkte[zufallstelle].gibY()] = true;
                this.loescheWandelement(zufallstelle);
                istnochfrei = false;
            }
        }while(istnochfrei!=true);
        
        return this.Punkte[zufallstelle];
    }
    
    private void loescheWandelement(int a) {
        this.Punkte[a] = null;
    }


    private Punkt suchenaechstenPunkt(Punkt s) {
        int zufall = (int) Math.random() * 4 + 1;
        int a = s.gibX();
        int b = s.gibY();
        
        do {
        if(zufall == 1) a++;    //rechts
        if(zufall == 2) a--;    //links
        if(zufall == 3) b++;    //runter
        if(zufall == 4) b--;    //hoch

        this.loeschevorhandenenPunkt(a, b);
        }while(this.loeschevorhandenenPunkt(a, b)!=true)
        return new Punkt (a,b);
    }

    private boolean loeschevorhandenenPunkt(int a, int b) {
        if(this.Array[a][b] == false) {
            this.Array[a][b] = true;
            return true;
        }
        else return false;
    }
 }
 

Marco13

Top Contributor
Hab nur mal drübergeschaut... Eigentlich sollte es bei
Code:
this.Array = new boolean[b][h];
this.Array[b][h] = false;
schon krachen. Ansonsten ist mir erstens nicht ganz klar, was die Daten dort alle bedeuten (Namen sind zwar in mancher Hinsicht "sch*** egal", aber einen Array Array zu nennen kann ungünstig sein...) und wie du genau vorgehst um was zu erreichen. Ich bin mir nicht mal sicher, ob die drei get-Methoden, die man implementieren soll, die AUSSENwände auch zurückgeben sollen, aber das ist nur ein Detail.

Nochmal: Ich glaube, viel mehr als die Liste der Wandelemente ("Zufällig von den Außenwänden nach innen wachsen lassen") braucht man gar nicht ... (Kann aber auch sein, dass ich da was falsch verstanden haben...)
 

Gamerzstyle

Mitglied
bei deinem wirr warr blick ich auch nicht mehr durch, aber ich bin mir sicher das deine gib Methoden mist sind.... du hast als parameter einen index den man für die wände benutzen soll, aber du nimmst dir einfach ne zufällige wand, dabei kann es auch passieren das er 2x die gleiche wand darstellt und somit dein labyrinth am ende nicht gefüllt ist...
return doch einfach startPunkt und endPunkt, also die darstellung sollte das kleinste problem sein
mir ist klar das es im vergleich zu den bisherigen aufgaben schwer ist aber die schwierigkeit sollte in dem algorithmus sein und nicht in der ausgabe, wenn du probleme mit der ausgabe hast solltest du vlt nochmal die hpr1 aufgaben durchgehen (zumindenst die letzten)
außerdem hast du die außenwand ganz vergessen die erstellst du mit definiereWandelemente() aber in den gib Methoden die er zum darstellen verwendet ist keine Beziehung zu den Punkten in definiereWandelemente(), nochmal er sucht sich nicht aus den Punkten die du speicherst die richtigen raus sondern du musst ihm die richtigen punkte geben...
 

Todo

Aktives Mitglied
Joa ich werds nochmal weiter probieren...

PS: HPR1 hatte ich in GE nicht weil ich vorher auf ne andere FH war....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
M Auf einem Hintergrundbild zeichnen AWT, Swing, JavaFX & SWT 2
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
S Font laden, Wort zeichnen und animieren..? AWT, Swing, JavaFX & SWT 2
S Bild von Punkt zu Punkt zeichnen AWT, Swing, JavaFX & SWT 8
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben