Guten Tag,
nicht ganz sicher, ob das noch zu Anfänger gehört. Folgendes Problem:
Ich habe in der Klasse Spielfeld mit der Methode hindernislisteErzeugen() eine Liste von Rechtecken erzeugt und diese mit dem return Befehl zurückgegeben.
Habe mal lieber alles hier rein gepackt.
Dann möchte ich in einer anderen Klasse Leinwand diese Liste zeichnen. Nur wenn ich diese Methode oder die zweite Möglichkeit, die mir eingefallen ist, die getHindernisliste() dort aufrufen möchte, gibt er mir einen Fehler, dass er die Methode nicht kennt.
Klasse Leinwand:
Für jede Hilfe dankbar.
nicht ganz sicher, ob das noch zu Anfänger gehört. Folgendes Problem:
Ich habe in der Klasse Spielfeld mit der Methode hindernislisteErzeugen() eine Liste von Rechtecken erzeugt und diese mit dem return Befehl zurückgegeben.
Java:
import java.io.*;
import java.util.*;
import java.awt.Color;
import java.util.Random;
public class Spielfeld
{
private int breite = 1000; //Länge, Breite des Spielfeldes
private int laenge = 1000;
private Punkt[] punkte; //Array der Klasse "Punkt"; Array = endliche Menge völlig gleichartiger Variablen; in diesem Fall Punkte
private int unten = 1; //Variable zum Tauschen der Array-Variablen
private static Random zufallsgenerator;
ArrayList<Rechteck> hindernisse = new ArrayList<Rechteck>(); //Array Liste (ähnlich Array nur mit "unbergrenzter" Länge) mit Namen "hindernisse" und vom Typ "Rechteck"
public Spielfeld() //bis jetzt leerer Konstruktor
{
Roboter robert = new Roboter();
}
public Punkt[] punktEingeben() //Methode zur Eingabe/Initialisierung von beliebig vielen Punkten
{
System.out.println("Anzahl der gewünschten Punkte eingeben: "); //Konsolenaufforderung
Scanner sc = new Scanner(System.in);
int anzahl = sc.nextInt(); // Scanner mit Variablen "anzahl" als Anzahl der Punkte
System.out.println("Geben Sie die Koordinaten der " + anzahl + " Punkte ein."); //Konsolenausgabe mit "anzahl" zur Kontrolle der Anzahl
punkte = new Punkt[anzahl + 1]; //Array "punkte" enthält anzahl+1 Variablen(Punkte); "anzahl" vom Benutzer eingegbene + Startpunkt (0/0)
int b = 1; //Initialisierung der Variable "b" zur besseren Ausgabe auf der Konsole (siehe Z.63)
int a = anzahl; //Initialisierung der Laufvariable "a"
while( a > 0 ) //while-Schleife mit "a" als Laufvariable
{
Scanner sc1 = new Scanner(System.in); //Scanner für Konsoleneingabe für die x-Variable des a-ten Punktes
int x = sc1.nextInt();
while (x >= 1000) //Schleife, wenn x größer als 1000; kleiner als 0
{
System.out.println("x muss im Spielfeld (zwischen 0 und 1000) liegen!");
Scanner sc3 = new Scanner(System.in);
x = sc3.nextInt();
}
while (x <= 0) //Schleife, wenn x größer als 1000; kleiner als 0
{
System.out.println("x muss im Spielfeld (zwischen 0 und 1000) liegen!");
Scanner sc3 = new Scanner(System.in);
x = sc3.nextInt();
}
Scanner sc2 = new Scanner(System.in); //Scanner für Konsoleneingabe für die y-Variable des a-ten Punktes
int y = sc2.nextInt();
while (y >= 1000) //Schleife, wenn y größer als 1000; kleiner als 0
{
System.out.println("y muss im Spielfeld (zwischen 0 und 1000) liegen!");
Scanner sc3 = new Scanner(System.in);
y = sc3.nextInt();
}
while (y <= 0) //Schleife, wenn y größer als 1000; kleiner als 0
{
System.out.println("y muss im Spielfeld (zwischen 0 und 1000) liegen!");
Scanner sc3 = new Scanner(System.in);
y = sc3.nextInt();
}
punkte[a] = new Punkt(); //die eben eingegebenen x, y -Werte als Koordinaten des Punktes setzen
punkte[a].setBoth(x, y);
System.out.println("Koordinaten des " + b + ". Punktes: (" + x + "/" + y + ")");
a--; //Laufvariable a um 1 verkleinern
b++; //Laufvariable b um 1 vergrößern
}
punkte[0] = new Punkt(0 , 0); //den ersten bzw. nullten Punkt auf (0/0) setzten; Startpunkt des Roboters
return punkte; //das Array "poi" ausgeben
}
public void poiSortieren(Punkt[] poi) //Methode zum Sortieren der vorher eingegebenen Punkte nach Abstand;
{ //Initialisierung der Variablen
int x; //x = x-koordinate des Bezugspunktes
int y; //y = y-Koordinate des Bezugspunktes
double d1; //Abstand zwischen dem Bezugspunkt und dem ersten Punkt
int anzahl = poi.length; //anzahl wird auf Länge des eingegebenen Arrays gesetzt
int speicher = 0; //Initialisierung des Speichers zur speicherung des bisher kürzeseten Abstandes
int unten = 1; //Variable zum Tauschen der Array-Variablen
for(int bezugspunkt = 0; bezugspunkt < anzahl - 1; bezugspunkt++) //for-Methode zur Extraktion der x, y -Werte des Bezugspunktes
{
double kurz = 1500;
x = poi[bezugspunkt].getX();
y = poi[bezugspunkt].getY();
for(int abstand = bezugspunkt + 1; abstand < anzahl; abstand++) //for-Methode zum Bestimmen der Abstände
{
d1 = poi[abstand].gibAbstand(x, y);
if(d1 < kurz) //if-Methode zum Vgl. von kurz mit d1
{
kurz = d1; //wenn d1 kürzer ist als der bisher kürzeste Abstand wird d1 zu kurz
speicher = abstand; //der Array-Index des jetzt kürzesten Abstandes wird in "speicher" gemerkt
}
}
System.out.print("Koordinaten des " + unten + ". Punktes: ");
poi[speicher].ausgabeAttribute();
tauschen(speicher, unten);
unten++;
System.out.println("Abstand zu diesem Punkt= " + kurz);
}
}
private void tauschen(int index1, int index2)
{
Punkt temp = punkte[index1];
this.punkte[index1] = punkte[index2];
this.punkte[index2] = temp;
}
public void poiAbfahren()
{
punktEingeben();
poiSortieren(punkte);
}
public ArrayList<Rechteck> hindernislisteErzeugen()
{
System.out.println("Geben Sie die Anzahl der gewünscheten Hindernisse ein: ");
Scanner scH = new Scanner(System.in);
int anzahlHin = scH.nextInt();
int i = 1;
zufallsgenerator = new Random();
int falsch = 0;
while(hindernisse.size() < anzahlHin) //laufen bis länge der ArrayList = anzahlHin ist
{
int x = zufallszahl(999);
int y = zufallszahl(999);
Punkt position1 = new Punkt(x, y);
int breite1 = zufallszahl(100);
int laenge1 = zufallszahl(100);
String bezeichnung1 = "Rechteck" + i;
Color farbe1 = zufallsfarbe();
Rechteck re = new Rechteck(position1, breite1, laenge1, bezeichnung1, farbe1);
if(falsch == 50)
{
break;
}
if(position1.getX() + re.getBreite() < 1000 && position1.getY() + re.getLaenge() < 1000) //überprüfen, ob das generierte Rechteck im Feld liegt
{
int a = 0;
boolean b = false;
int wahr = 0;
if(hindernisse.size() > 0)
{
while(a < hindernisse.size())
{
b = re.ueberlappen(hindernisse.get(a));
if(b == false)
{
falsch++;
break;
}
if(b == true)
{
wahr++;
if(wahr == hindernisse.size())
{
hindernisse.add(re);
i++;
falsch = 0;
break;
}
}
a++;
}
}
if(hindernisse.size() == 0)
{
hindernisse.add(re);
}
}
}
return hindernisse;
}
public ArrayList<Rechteck> getHindernisliste()
{
return hindernisse;
}
private int zufallszahl(int bis)
{
int zzahl = 1 + zufallsgenerator.nextInt(bis);
return zzahl;
}
private Color zufallsfarbe()
{
Color zfarbe = new Color(zufallsgenerator.nextInt(256), zufallsgenerator.nextInt(256), zufallsgenerator.nextInt(256));
return zfarbe;
}
public static void main(String[] args)
{
System.out.println("Willkommen. Möchten Sie eine beliebige Anzahl an Punkten so effizient wie möglich abfahren, drücken Sie die 1. \n Möchten Sie, dass ich einen Weg durch eine von ihnen vorgegebene Anzahl an Hindernissen finde, drücken Sie die 2.\n Möchten Sie mir einige persönliche Fragen stellen, drücken Sie die 3. \n Wenn Sie das Programm beenden wollen, drücken Sie die 9. \n Hinweis! \n Bestätigen Sie ihre Auswahl mit der Enter-taste. \n Die Auswahl mehrerer Optionen gleichzeigtig ist nicht möglich!");
while(true)
{
System.out.println("Ihre Wahl: ");
Scanner sc = new Scanner(System.in);
int wahl = sc.nextInt();
if(wahl == 1)
{
Spielfeld sp = new Spielfeld();
sp.poiAbfahren();
}
if(wahl == 2)
{
Spielfeld sp = new Spielfeld();
sp.hindernislisteErzeugen();
}
if(wahl == 3)
{
Roboter ro = new Roboter();
ro.spracherkennung();
}
if(wahl == 9)
{
System.out.println("Vielen Dank für Ihren Besuch. Auf Wiedersehen.");
break;
}
System.out.println("Ich hoffe Sie waren mit den ergebnissen zufrieden ^^. Ihre Optionen: \n 1 - poi \n 2 - Hindernisse \n 3 - Fragen \n 9 - Ende");
}
}
}
Habe mal lieber alles hier rein gepackt.
Dann möchte ich in einer anderen Klasse Leinwand diese Liste zeichnen. Nur wenn ich diese Methode oder die zweite Möglichkeit, die mir eingefallen ist, die getHindernisliste() dort aufrufen möchte, gibt er mir einen Fehler, dass er die Methode nicht kennt.
Klasse Leinwand:
Java:
import javax.swing.*; //Enthält meisten Swing-Operationen
import java.util.*;
import java.awt.*;
import java.util.List;
public class Leinwand
{
public static void main(String[] args)
{
JFrame fenster = new JFrame("Robotersimulation"); //erstellt den unsichtbaren JFrame(Fenster) "Robotersimulation"
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //legt die Aktion fest, die beim "x"-drücken ausgeführt wird; hier Fenster schließen und Programm beenden
fenster.setSize(1000, 1000); //Größe auf 1000x1000
fenster.setVisible(true); //macht den JFrame sichtbar
/* JLabel label = new JLabel("Lebe immer First-Class, sonst tun es deine Erben!");
* label.setForeground(Color.blue);
* fenster.add(label);
* Scanner sc = new Scanner(System.in);
* String neu = sc.nextLine();
* label.setText(neu);
*/
}
private class Zeichenflaeche extends JPanel
{
}
}
Für jede Hilfe dankbar.