Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du erstellst dir selber die Dateien und dann liest du sie zeilenweise ein und füllst dein Spielfeld mit Elementen, die in der Textdatei vorgegeben sind.
Du musst dir deine Aufgabe schon anschauen.
Klar, dass irgendwann gehässige oder genervte Kommentare kommen.
Man kann dir nur helfen, wenn du auch mitmachst.
Ok, ab jetzt klinke ich mich aus.
Du liest die Hilfe nicht, die Aufgabe nicht und du scheinst nichtmal mit den grundlegendsten Grundlagen von Computern vertraut.
Das ganze macht so leider keinen Sinn und ist für mich reine Zeitverschwendung.
Such dir jemanden der dir direkt helfen kann. Am besten solltest du dabei nochmal ganz von vorne anfangen
Ok, ab jetzt klinke ich mich aus.
Du liest die Hilfe nicht, die Aufgabe nicht und du scheinst nichtmal mit den grundlegendsten Grundlagen von Computern vertraut.
Das ganze macht so leider keinen Sinn und ist für mich reine Zeitverschwendung.
Such dir jemanden der dir direkt helfen kann. Am besten solltest du dabei nochmal ganz von vorne anfangen
Egal was man dir erklärt du verstehst nichts davon, da dir sämtliche Grundlagen fehlen. Entweder kannst du das alles einfach nicht oder du warst übers Semester einfach zu faul. Ich kann das nicht beurteilen, da wir dir aber auch nicht alles vorkauen können (doch das ist absolut das richtige Wort dafür!) musst du dir ernsthaft Gedanken machen wie das bei dir weitergehen soll.
Mein Tipp ebenfalls: Such dir dringend einen Kommilliton der das mit dir en Persona macht!
Du hast Maps in Form einer .txt-Datei. In der ist das Level in der Form beschrieben die schon genannt wurde (Felder bzw Elemente werden durch ihren buchstaben representiert).
Ein Level ist also erstmal nichts anderes als eine Liste aus Textzeilen, also eine Liste aus String, genauer eine List<String>.
Zum merken: List<String> ist hier eine Liste die die Zeilen deiner Datei enthält.
Jetzt willst du aber nicht nur ein Level sondern gleich mehrere auf einmal laden.
Du kriegst also eine Liste von Leveln, genauer eine Liste von Listen von Zeilen = List<List<String>>
Jetzt zum Zugriff darauf:
Angenommen du hast die Level geladen und irgendwo abgelegt.
Jetzt musst du diese überprüfen.
Da du den Code vermutlich öfters benötigen wirst lohnt es sich wohl die prüfung eines Levels als eigene Methode zu schreiben.
ein Möglicher methodenkopf wäre
Java:
public boolean validateLevel(List<String> level){
//Implementierung
}
Die Methode bekommt das Level als Liste aus Strings und prüft es nach den von dir genannten Kriterien:
es komplett von Wänden umgeben ist.
genau eine Spielfigur existiert.
mindestens ein Ausgang existiert.
es rechteckig ist.
Und jetzt gehst du mal in die Java-Api Java Platform SE 6
und schaust dir dort mal die Klassen String und List an.
Dann überlegst du dir was du in deiner Liste aus zeilen genau prüfen willst, suchst in den entsprechenden Klassen nach Methoden die dir helfen können und versucht das ganze einmal.
An deinem Code ist das schwer zu sagen, fehlt evtl noch etwas von der Aufgabenstellung oder vorgegebenem Code?
An sich kannst du dir den MapParser aber vorstellen wie eine Schnittstelle die benutzt wird um Level von der Festplatte zu laden.
Benutzt werden könnte er in einem Menü das sich in der Applikation befindet "Load Level..."
Oder auch beim Programmstart um direkt ein Level zu laden das vorgegeben ist.
Das hängt aber davon ab, wie eure Vorgaben sind, bzw wie du selbst dein Programm gestalten willst.
Habe ich es denn jetzt richtig verstanden, dass ein Element für eine ganze Zeile des Spielfelds steht und dass ich in der Klasse MapParse dann wiederum jede Zeile durchgehen muss und damit das zweidimensionale Arry füllen muss?
Und dass ich dann die Methode aus MapParse dort verwende bei Zeile 22-23?
Edit:
Achso, das ist die ganze Aufgabe 2.
Aber hier noch Aufgabe 3:
Damit das Spiel spielbar wird benotigt ihr noch eine Klasse, die alles zusammenhalt. Entwickelt
dazu die Klasse BoulderDash.
Die Klasse soll zunachst drei Spielwelten von der Festplatte laden. Nehmt dazu Euren MapParser
zur Hilfe. Sind die Welten geladen, soll die erste Welt in der GUI angezeigt werden. Die Benutzung
der Gui lasst sich aus der Doxygen-Dokumentation entnehmen.
Anschlieend werden so lange Spielzuge ausgefuhrt bis die Spielgur entweder zermalmt ist oder
gefressen wurde oder auf den Ausgang bewegt wurde. Im letzteren Fall geht es weiter zum
nachsten Level. Die Punkte bleiben naturlich erhalten.
Ein Spielzug lauft dabei wie folgt ab:
1. frage die Benutzereingabe aus der Gui ab und teile sie dem Spieler-Objekt mit
2. rufe auf dem Spieler-Objekt performTurn() auf
3. rufe auf allen anderen Elementen performTurn() auf
4. Aktualisiere die Gui
spielfeld[j] ist vom Typ Element
map.get(i).charAt(i) enthält zwar semantisch für dich die Information welches Feld das ist,
für Java ist das allerdings nicht zuweisungskompatibel.
Du musst überprüfen welcher Char genau das ist und basierend darauf ein neues Element-Objekt erzeugen (z.B. einen Diamanten)
Gruß
Da in der Lehrveranstaltung Praktische Informatik I an der Universität Bremen genau die selbe Aufgabe gestellt wurde (Wortgleich ), gehe ich davon aus, dass du ein Teilnehmer dieser Veranstaltung bist.
Ich finde es ein bisschen schade, dass du deine Fragen zu erst in diesem Forum und nicht an uns (die Tutoren) stellst. Erwecken wir den Eindruck, dass wir dir/euch nicht helfen würden?? Es ist unsere Aufgabe euch bei Problemen jeder Art zu helfen (und wenn es die Frage ist, was ein JFileChooser ist). Bei der Aufgabe mit der Kneipe hast du dich auch erst an das Forum gewendet http://www.java-forum.org/java-basics-anfaenger-themen/128437-modellierung-kneipe.html ...
Wenn du weiterhin noch Fragen hast, stehe(n) ich/wir dir gerne zur Verfügung. Du kannst im StudIP einfach ins Forum schreiben, oder dich an einen(oder deinem) Tutor wenden.
Da in der Lehrveranstaltung Praktische Informatik I an der Universität Bremen genau die selbe Aufgabe gestellt wurde (Wortgleich ), gehe ich davon aus, dass du ein Teilnehmer dieser Veranstaltung bist.
Ich habe nicht den Eindruck, daß mir nicht geholfen würde; im Gegenteil, mir wurde schon oft geduldig geholfen.
Ich scheue mich auch nicht, meine Fragen an den Tutor zu stellen, nur kann ich wohl kaum Fragen stellen wie "Wie geht das?" - wenn ich mir nicht vorher den Hauch einer Ahnung verschafft habe. Daher stelle ich meine Fragen zuerst hier.
Versuche etwas mehr in Komponenten zu denken. Du solltest zunächst eine Klasse haben, welche das Spielfeld repräsentiert und nichts anderes. Sie könnte weiterhin Methoden anbieten, welche dir Zugriff auf die Elemente der Spielwelt gewährt. Eine solche Methode könnte zB. sein:
Java:
public Element getElementAt(int x, int y)
Ich nenne diese Klasse einfach mal World (Map wäre eine ungute Wahl, da es in Java bereits ein solches Interface gibt, welches in einem völlig anderen Kontext steht)
Als nächstes benötigst du eine Komponente, welche dir es ermöglicht Spielfelder anhand einer String-Liste zu erzeugen. Eine, in meinen Augen, gut geeignete Methode könnte doch sein:
Java:
public static World createWorld(List<String> list)
Diese Methode erzeugt nun, so wie du es zB. gemacht hast, die Elemente und schreibt sie in das Array rein. Sinnig wäre es bestimmt einem Element die Referenz auf das jeweilige Array im Konstruktor mitzugeben.
Danke, ich versuche es noch besser zu strukturieren nach Deinen Tipps.
Jetzt nochmal eine Frage zur Klasse "Player". Die sieht bei mir sehr länglich aus, ich muss da noch besser zusammenfassen. Im Moment geht es mir aber um die Zeile 31, wo ich versuche, das Drücken der Pfeiltasten einzubauen. Da kommen die Fehlermeldungen:
Dh. du definierst hier eine neue Methode mit dem Namen performTurn()
In Zeile 33 steht dann:
Java:
public void keyPressed(KeyEvent e){
Dh. du definierst eine weitere Methode, jedoch im Methodenrumpf der Methode performTurn(), und das geht natürlich nicht... Dieses Konstrukt erscheint mir auch etwas komisch, da auf dem Aufgabenzettel steht, dass die GUI benutzt werden soll um die gedrückte Taste zu ermitteln. Was du hier, so glaube ich jetzt erst mal, gemacht hast, ist den Code der Methode step() aus GUI.java kopiert. Dies war aber nicht Sinn der Übung. Lies doch bitte nochmal den Zettel und vor allem die Doku zu GUI.java (Doxygen), dort erfährst du, wie du diese Klasse zu verwenden hast.
GUI ist ein Akronym für Graphical user interface und bezeichnet halt eben eine grafische Schnittstelle für den Benutzer eines Programms. Der Editor in dem du zB. die Texte schreibst für dieses Forum ist auch nur eine GUI um komfortabel Nachricht in diesem Forum zu verfassen.
Also, im Sinne der Aufgabe haben wir euch die Arbeit zum Entwickeln einer GUI abgenommen und liefern diese halt eben in der Datei GUI.java mit. Praktischer Weise hat die Klasse GUI eine Methode step(), welche eine ganz nützliche Funktion bereitstellt. Um dir diese Funktion anzeigen zu lassen generiere doch erst mal die Doxygen-Doku zu dieser Datei. Dann sollte dir einiges klarer werden
Hmm warum rufst du denn einfach step() auf... das ist doch eine Methode der Klasse GUI. Wie du eine Methode einer Klasse (eines Objektes) aufrufst, solltest du schon wissen.
Ich kann schon verstehen, warum einige Personen in diesem Forum dir nicht mehr helfen wollen. Es wirkt leider immer so, als wenn du unsere Vorschläge annimmst, etwas hincodest, kompilieren willst und wenn dass dann nicht klappt, also ein Kompilerfehler erscheint, postest du die Nachricht hier, ohne dir wohl Gedanken gemacht zu haben, was da eigentlich steht. Bei diesem Fehler werde ich dir nicht helfen, den musst du wirklich alleine finden, vor allem weil die Ausgabe wirklich alles sagt was du benötigst... Sobald das läuft, du also die Methode step aufrufen kannst, werde ich dir weiter helfen.
Ich weise einfach nochmal darauf hin! Kümmer dich doch erstmal darum.
Frag dich mal was du mit den Zeilen erreichen willst und schau dann in ein
Buch wie man das umsetzt (Stichwort: Konstruktor).
Edit: Mist, zu langsam ;-) Dieser Beitrag hat sich damit wohl erledigt.
Hallo, wie kann ich schauen, ob ein Level rechteckig ist?
Für die Überprüfung, ob ein Level genau einen Spieler und mindestens einen Ausgang hat und von Wänden umgeben ist, habe ich jeweils eine Methode für einen String geschrieben, die ich dann in der Methode, in der ich teste, ob dies für ein Level gilt, verwende.
Nur zu der Überprüfung, ob das Level rechteckig ist, fällt mir nichts ein.
Du kriegst eine Liste aus Strings als Level:
(Element der Liste) "String"
(0) "XXXX"
(1) "XXXX"
(2) "XXXX"
und eine 2.:
(0) "XXXX"
(1) "XXXXXX"
(2) "XXXX"
bzw eine 3.:,
(0) "XXXX"
(1) "XXXX"
(2) "XXXX"
(3) "X"
warum sind die 2. und die 3. nicht Rechteckig, woran erkennst du den Unterschied.
Wo die Klasse String ist weißt du, eine passende Methode findet man schnell und wenn man dann nur noch das runterschreibt was man selber per hand macht "alle strings durchgehen und auf gleiche länge prüfen" (lösung *hust*) ist man fertig.
Das ist damit auch mein letzter Post in dem Thread - ich sehe es nicht ein einem Studenten sowas vorkauen zu müssen. Das hat nichtmal mehr was mit Java zu tun (ansonsten wäre sowas gekommen wie:
"Warum klappt meine Rechteck-prüfung mit den 2 verschachtelten for-schleifen und den paar Variablen nicht, könnte das an der Methode .irgendwas() aus der Klasse String liegen oder habe ich da einen denkfehler drin")
Hier fehlen einfach Grundsätzliche Skills wie Abstraktion, ein Grundwissen über die Sprache kann man nach 2.5 Monaten vorraussetzen, ebenso wie OOP-Fertigkeiten - aber auch hier kommen zuviele Grundsatzfragen. Und Selbststudium bedeutet sich selbst Wissen suchen und aneignen können - eine Grundlage auf einer Universität - und nicht sich alles zusammenfragen zu müssen, selbiges kann man machen wenns mal echt irgendwo hängt und man tiefere Fachprobleme hat (und hinter einem Konstruktoraufruf die () zu vergessen und dafür gleich mehrfach zu posten ;( )
Mehr als mir Mühe geben kann ich auch nicht.
Ich muss mir auch nicht hier ständig anhören, wie unfähig ich bin.
Ich bin doch nicht hier, um mich demütigen zu lassen.
Dann lass es halt sein, wenn es unter Deiner Würde ist.
Langsam habe ich es oft genug gehört.
Also dies habe ich mir überlegt.
Ich hoffe, es hagelt jetzt nicht wieder böse Kritik. Sollen sich halt alle raushalten, die es zu doof finden. Ich finde auch so Manches zu doof, zum Beispiel, daß ich in einem Hilfe-Forum keine Hilfe, sondern demotivierende Backpfeifen bekomme.
Die Kritik ist ja um Gottes Willen angekommen und sie ist berechtigt.
Dennoch muss man sie nicht immer und immer und immer wieder wiederholen.
Und dann noch ein Wort zu dem hilfsbereiten Tutor, der hier netterweise geholfen hat: Hieß es in Deinen eigenen Worten nicht sinngemäß, daß man jede Frage stellen könne?
Achso, aha, ich verstehe. Und schon drei Messages weiter muss ich mir dann anhören, daß es nur allzu verständlich ist, daß mir hier nicht geholfen wird und schon weitere zwei Messages weiter fließen dann nette indirekte Kommentare ein wie "... - ich wiederhole es nochmal----"..
Aha, so war das also gemeint, daß man jede Frage stellen kann.
Können ja, aber auch mögen?
(Und nochmal: Ich sehe es ein, daß ich nicht talentiert bin und frage, frage, frage. Man werfe mir also zumindest bitte nicht vor, daß ich selbst die Kritik ausblende.)
Java:
//Es folgen Methoden, die für den Test der Validität eines Levels benutzt werden.
//Zähle die Anzahl der Spieler.
public int countPlayer(String string, char aChar){
int counter=0;
for(int i=0; i<string.length(); i++){
if(string.charAt(i)==aChar){
counter++;
}
}
return counter;
}
//Teste, ob am Anfang und Ende eines Strings ein bestimmes Char steht.
public boolean sourroundedByWalls(String string){
boolean sourrounded=true;
if(string.charAt(0)!='W' || string.charAt(string.length()-1)!='W'){
sourrounded=false;
}
return sourrounded;
}
//Zähle die Anzahl der Ausgänge.
public int countExists(String string, char aChar){
int counter2=0;
for(int i=0; i<string.length(); i++){
if(string.charAt(i)==aChar){
counter2++;
}
}
return counter2;
}
//Teste, ob ein übergebenes Level valide ist (mittels der obigen Methoden).
//1. Genau ein Player?
//2. Level von Wänden umgeben?
//3. Mindestens ein Ausgang?
//4. Spielfeld rechteckig?
public boolean validateLevel(List<String> level){
boolean validate=false;
int counter=0;
int counter2=0;
boolean sourrounded=false;
for(int j=0; j<level.size(); j++){
counter=countPlayer(level.get(j), 'P');
sourrounded=sourroundedByWalls(level.get(j));
counter2=countExists(level.get(j), 'G');
}
if(counter==1 && sourrounded==true && counter2>=1){
validate=true;
}
return validate;
}
(Das mit der rechteckigen Form fehlt noch.)
Doch wenn ich die letzte Methode jetzt anwenden will, also das in Zeile 9 schreibe, funktioniert es nicht. Es fehlt ein identifier, steht dort.
Du kannst uns und damit meine ich ausschließlich uns Tutoren jede Frage stellen, die du möchtest. Wir werden dir auch jeder Zeit gerne weiterhelfen, denn das ist unser Job, dafür werden wir bezahlt. Für Mitglieder dieses Forums gilt das jedoch nicht, du darfst nicht voraussetzen, dass dir hier jeder sofort helfen wird, da alles hier auf einer freiwilligen Basis geschieht.
Vlt. sollte ich das Wort Hilfe auch mal etwas anders beschreiben. Hilfe bedeutet, dass wir die die Richtung in der du selbstständig lernen sollst vorgeben. Die Vorlesung vermittelt dabei tatsächlichen Inhalt, was nicht unbedingt bedeutet, dass die Vorlesung vollständig sein muss, sondern eher Ausschnitte von den Themen zeigt, in denen du dich gerade bewegen solltest. Die Übungsaufgaben und das Tutorium sind nun dazu da, um das Wissen, welches du dir eben aneignen sollst, praktisch um zu setzten. In der Informatik lässt sich dies besonders gut in Programmieraufgaben umsetzten.
Wir Tutoren helfen euch bei den Übungen. Wenn ihr euch zB. total verrennt, dann helfen wir euch mit Tipps wieder auf die Spur zu kommen. Wenn ihr also zu uns kommen würdet und uns fragen würdet, wie ihr die Länge eines Strings ermitteln könnt, dann würden wir euch sagen, hey schaut doch mal in Java-Doc von String nach, da gibts einige Methoden die euch evtl. gut helfen können. Ob wir in den Tutorien Kompilerfehler etc. fixen steht uns frei. Die Devise lautet: Hilfe zur Selbsthilfe.
Wenn ich dir also sage, schau doch mal bitte in die Doxygen-Doku der Klasse GUI nach, dann tu das doch einfach erst mal. Dann würde sich bestimmt auch die Frage erübrigen, welchen Rückgabetyp die Methode step() hat und wo dieses Enum definiert ist. Ich werde dir nun diese Ausschnitt einfach mal hier posten:
/**
* This method implements one step of the Boulder Dash game. If this method
* is called for the first time after setting a new level
* ({@link setLevel(int, Element[][])}) a countdown is displayed. After that
* this method sleeps for 50ms and then determines and returns the first
* key press that has not yet been processed.
* This means that subsequent key presses will be ignored until the first
* key press has been handled. If no key has been pressed, this method
* returns the element @em NONE of the enumeration {@link GUI.Key}.
*
* @return the pressed key
*/
Niemand hier möchtet dich fertig machen oder dir nicht weiterhelfen. Jedoch, und das wirst du lernen müssen, heißt Studium immer selbstständiges lernen.
Leider muss ich Firephoenix recht geben. Du scheinst noch viele Probleme mit den Grundlagen zu haben. Wenn du diese nicht umgehend beseitigst, dann sehe ich da große Probleme auf dich zukommen... Diese Probleme können wir (also der Dozent und wir Tutoren) nicht mehr für dich lösen, da der Stoff der Vorlesung bereits viel zu fortgeschritten ist. Ich würde dir empfehlen ein Grundlagenbuch raus zu holen und nochmal alles ganz von vorne durch zu gehen.
Alles sicher weise gesprochene Worte, das möchte ich auch gar nicht anzweifeln.
Vielleicht zieht man ja aber in Erwägung, daß man aus dieser Doxygen-Dokumentation durchaus auch nicht schlau werden kann.
Mir ist zum Beispiel trotz dieses zitierten Ausdrucks nicht klar, daß der Rückgabetyp
GUI.Key
ist und es stellt sich mir noch immer die Frage, wieso der Rückgabetyp nicht
gui.Key
ist, da ich ja schließlich eine neue Instanz der Klasse GUI erzeugt habe.
Wenn auf solche Fragen aber immer die Antwort kommt, man müsste bei den Grundlagen anfangen, verstehe ich das nicht. Sowas SIND doch Grundlagen. Und so tritt man immer auf der Stelle und ist, so viel kann ich sagen, sicherlich nicht weniger frustriert als die Helfer, die den Eindruck haben, man käme keinen Schritt voran. Wie denn aber auch, wenn man immer die Antwort bekommt, dieses oder jenes sei doch Grundlagenwissen und müsse man so herausfinden. Schön und gut und sicher in den meisten Fällen wahr, aber nicht immer.
Ich muss mir doch jetzt nicht wieder angucken, was ein Rückgabetyp ist, das ist mir klar. Wenn ich mir jetzt meine Grundlagenbücher hernehme und das nachschlage, sehe ich nicht, wie mir das in diesem konkreten Fall weiterhelfen soll, deswegen frage ich das ja schließlich so konkret, sonst würde ich ja fragen, was im Allgemeinen ein Rückgabetyp ist, worüber dann auch wieder die Augen verdreht würden. Ich glaube, Manche sind sich selbst nicht darüber klar, was sie sagen: Wegen Grundlagen soll man nachschlagen, aber wenn man nachschlägt und dann nachfragt, bekommt man wieder nur den Hinweis, man solle doch das mal nachschlagen.
In DIESEM Fall ist es mir eben nicht klar, wie man auf den Rückgabetyp kommt.
Mit [c]gui.Key[/c] kommst du auch an die Elemente des Enums (vermute ich mal, den
Code der Klasse GUI haben wir hier ja nicht zur Verfügung). Das ist aber dann der
konkrete Wert. Grob gesagt: Typ = Definition, Wert = das was eine Methode bei der
konkreten Ausführung zurück gibt (eine initialisierte Instanz des Rückgabetyps).
Hallo, ich würde jetzt gerne die Klasse "BoulderDah" gemäß dieser Aufgabenstellung erstellen (zumindest versuchen):
Damit das Spiel spielbar wird benötigt ihr noch eine Klasse, die alles zusammenhält. Entwickelt
dazu die Klasse BoulderDash.
Die Klasse soll zunächst drei Spielwelten von der Festplatte laden. Nehmt dazu Euren MapParser
zur Hilfe. Sind die Welten geladen, soll die erste Welt in der GUI angezeigt werden. Die Benutzung
der Gui lässt sich aus der Doxygen-Dokumentation entnehmen.
Anschließend werden so lange Spielzüge ausgeführt bis die Spielfigur entweder zermalmt ist oder
gefressen wurde oder auf den Ausgang bewegt wurde. Im letzteren Fall geht es weiter zum
nächsten Level. Die Punkte bleiben natürlich erhalten.
Ein Spielzug läuft dabei wie folgt ab:
1. frage die Benutzereingabe aus der Gui ab und teile sie dem Spieler-Objekt mit
2. rufe auf dem Spieler-Objekt performTurn() auf
3. rufe auf allen anderen Elementen performTurn() auf
4. Aktualisiere die Gui