DieterS Geschrieben 24. November 2010 Teilen Geschrieben 24. November 2010 (bearbeitet) Hi, ich mache gerade ein Onlinetutorial um ein Adventurespiel zu erstellen, steh im moment aber irgendwie total auf der Leitung und check die Aufgabe nicht. Normalerweise bin ich ziemlich gut in info, aber wäre nett, wenn ihr mir erklären würdet, wie die Aufgabe geht. Die Aufgabe ist: Stellen Sie die Klassen Spiel und Gegenstand soweit wie oben beschrieben fertig, erzeugen Sie in der BlueJ-Umgebung mehrere konkrete Gegenstände und testen Sie den Konstruktor sowie die von Ihnen programmierte Ausgabe-Methode eingehend. Hinweis: Sie müssen sowohl den Konstruktor wie auch die anzeigen()-Methode erweitern, um diese Aufgabe zu lösen. Ich habe die folgenden 2 Klassen spiel und Gegenstand schon so wie es beschrieben war fertig gestellt, check den Rest aber irgendwie nicht. import java.awt.*; import javax.swing.*; public class Spiel extends JApplet { Gegenstand schwert; public void init() { schwert = new Gegenstand("Excalibur"); } public void paint(Graphics g) { g.drawString("Spiel V 1.01", 20, 20); schwert.anzeigen(g,20,50); } } import java.awt.*; public class Gegenstand { String bezeichnung; public Gegenstand(String bez) { bezeichnung = bez; } public void anzeigen(Graphics g, int x, int y) { g.drawString(bezeichnung,x,y); } } Bearbeitet 24. November 2010 von flashpixx Code-Tags eingefügt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 24. November 2010 Teilen Geschrieben 24. November 2010 Verwende bitte das nächste Mal die Code-Tags, die ich jetzt nachträglich eingefügt habe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaeyu Geschrieben 25. November 2010 Teilen Geschrieben 25. November 2010 (bearbeitet) //Edit: Ich würde erstmal die Klasse "Gegenstand" vervollständigen. Schau dir mal die UML Klasse auf der Seite genauer an... BlueJ-Lehrgang von Ulrich Helmich, Adventuregame Folge 1 Bearbeitet 25. November 2010 von Kaeyu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 25. November 2010 Autor Teilen Geschrieben 25. November 2010 meinst du so? import java.awt.*; public class GEGENSTAND { String bezeichnung; private double angriffswert, verteidigungswert, goldwert, zustand; public GEGENSTAND(int typ, String bez, int angriffswert, int verteidigungswert, int goldwert) { bezeichnung = bez; this.typ = typ; this.angriffswert = angriffswert*zustand; this.verteidigungswert = verteidigungswert*zustand; this.goldwert = goldwert*zustand; zustand = 100; } public void anzeigen(Graphics g, int x, int y) { g.drawString(bezeichnung,x,y); } } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaeyu Geschrieben 26. November 2010 Teilen Geschrieben 26. November 2010 Ja, z.B. so. Wie in der Aufgabe geschrieben, musst du jetzt allerdings deine "Anzeigen-Methode" erweitern, da sie im Moment nur die Bezeichnung des Items ausgibt. Gruß >Kae~ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 26. November 2010 Autor Teilen Geschrieben 26. November 2010 Danke für deine Hilfe, aber was genau muss ich bei anzeigen ändern? Muss ich dann angriffswert und so auch als String einfügen? import java.awt.*; public class Gegenstand { String bezeichnung, angrwert, vertwert, gwert; private double angriffswert, verteidigungswert, goldwert, zustand; public Gegenstand (String bez, int angriffswert, int verteidigungswert, int goldwert) { zustand = 100; bezeichnung = bez; this.angriffswert = angriffswert*zustand/100; this.verteidigungswert = verteidigungswert*zustand/100; this.goldwert = goldwert*zustand/100; angrwert = "this.angriffswert"; vertwert = "this.verteidigungswert"; gwert = "this.goldwert"; } public void anzeigen(Graphics g, int x, int y) { g.drawString(bezeichnung,x,y); g.drawString(angrwert,x+10,y+10); g.drawString(vertwert,x+10,y+10); g.drawString(gwert,x+10,y+10); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Der_Lampe Geschrieben 26. November 2010 Teilen Geschrieben 26. November 2010 ... String bezeichnung, angrwert, vertwert, gwert; private double angriffswert, verteidigungswert, goldwert, zustand; //warum angrwert, vertwert und gwert einmal als double und einmal als string? public Gegenstand (String bez, int angriffswert, int verteidigungswert, int goldwert) { zustand = 100; bezeichnung = bez; this.angriffswert = angriffswert*zustand/100; //da zustand als 100 initialisiert wurde kannst du das *zustand/100 weglassen this.verteidigungswert = verteidigungswert*zustand/100; this.goldwert = goldwert*zustand/100; angrwert = "this.angriffswert"; //so wird das nicht funktionieren es wird dann "this.angriffswert" wortwörtlich in dem String stehen vertwert = "this.verteidigungswert"; gwert = "this.goldwert"; } ich kenne die Aufgabenstellung zwar nicht aber mir erschließt sich aus deinem Code nicht warum du Werte des Gegenstands doppelt implementierst mein Tipp: deklariere alle Eigenschaften des Gegenstands als String (warum auch als int oder double wenn du es eh anders übergibst) und im Konstruktor schreib dann: public Gegenstand (String bez, String angriffswert, String vertwert, String gwert) { ... this.angriffswert=angriffswert; this.vertwert=verwert; this.gwert=gwert; ... } falls dies nicht der Aufgabenstellung entsprechen sollte ignorier den Post einfach Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 26. November 2010 Autor Teilen Geschrieben 26. November 2010 Bin jetzt doch noch allein drauf gekommen, trotzdem danke für eure Tipps. Wenn ich mich nicht wieder irre, müsste es so stimmen. import java.awt.*; public class GEGENSTAND { String bezeichnung; private double angriffswert, verteidigungswert, goldwert, zustand; public GEGENSTAND(String bez, int angriffswert, int verteidigungswert, int goldwert) { zustand = 100; bezeichnung = bez; this.typ = typ; this.angriffswert = angriffswert; this.verteidigungswert = verteidigungswert; this.goldwert = goldwert; } public void anzeigen(Graphics g, int x, int y) { g.drawString(bezeichnung + " hat den Angriffswert " + (int)angriffswert + ", den Verteidigungswert " + (int)verteidigungswert + " und ist " + (int)goldwert + " Gold wert.", x,y); } } Falls ich nochmal Probleme haben sollte, meld ich mich einfach wieder. Wers mal selbst machen will, der Link ist: BlueJ-Lehrgang von Ulrich Helmich, Adventuregame Folge 1 Gruß Dieter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 27. November 2010 Autor Teilen Geschrieben 27. November 2010 Hi! sorry fals ich nerve, aber ich stecke schon wieder fest. Die Aufgabe ist jetzt: "Schreiben Sie eine Methode ablegen() mit folgendem Funktionskopf: public Gegenstand ablegen(int typ) welche einen Gegenstand - sofern überhaupt angelegt - wieder entfernt und gleichzeitig als Parameter zurückgibt." Könnt ihr mir bitte sagen, was ich übersehen/falsch gemacht habe. Meine Lösung ist bis jetzt: import java.awt.*; public class GEGENSTAND { String bezeichnung; private double angriffswert, verteidigungswert, goldwert, zustand, faktor; private int typ; public GEGENSTAND(int typ, String bez, double angriffswert, double verteidigungswert, double goldwert) { zustand = 100; bezeichnung = bez; this.typ = typ; this.angriffswert = angriffswert; this.verteidigungswert = verteidigungswert; this.goldwert = goldwert; } public void anzeigen(Graphics g, int x, int y) { g.drawString(bezeichnung + " mit dem Angriffswert " + (int)angriffswert + ", den Verteidigungswert " + (int)verteidigungswert + " und ist " + (int)goldwert + " Gold wert.", x,y); } public void beschaedigen(int prozent) { zustand = zustand*(100-prozent)/100; angriffswert = angriffswert*(100-prozent)/100; verteidigungswert = verteidigungswert*(100-prozent)/100; goldwert = goldwert*(100-prozent)/100; } private void ursprungswerteFaktorBerechnen() { faktor = 100/zustand; } public double reparaturKosten() { ursprungswerteFaktorBerechnen(); return goldwert*faktor-goldwert; } public void reparieren() { ursprungswerteFaktorBerechnen(); angriffswert = angriffswert*faktor; verteidigungswert = verteidigungswert*faktor; goldwert = goldwert*faktor; zustand = 100; } public int gibTyp() { return typ; } public boolean istWaffe() { return (typ==1); } public boolean istSchild() { return (typ==2); } public boolean istRuestung() { return (typ==3); } } import java.awt.*; public class HELD { String name; double leben; GEGENSTAND waffe, schild, ruestung; public HELD(String name) { this.name = name; leben = 100; waffe = null; schild = null; ruestung = null; } public void anzeigen(Graphics g, int x, int y) { g.drawString("Der Held heißt " + name,x,y); g.drawString("Er hat " + (int)leben + " Lebenspunkte" ,x,y+20); g.drawString("Er hat folgende Ausrüstung: ",x,y+40); waffe.anzeigen(g,x,y+60); schild.anzeigen(g,x,y+80); ruestung.anzeigen(g,x,y+100); } public void anlegen(GEGENSTAND neu) { if (neu.istWaffe()) { waffe = neu; } else { if (neu.istSchild()) { schild = neu; } else { if (neu.istRuestung()) { ruestung = neu; } } } } public GEGENSTAND ablegen(int typ) { if (waffe.gibTyp()==typ) { return waffe; waffe = null; } else { if (schild.gibTyp()==typ) { return schild; schild = null; } else { if (ruestung.gibTyp()==typ) { return ruestung; ruestung = null; } } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 29. November 2010 Teilen Geschrieben 29. November 2010 Mich wundert zwar, dass BlueJ sowas nicht gleich als Warnung ausgibt, aber folgende fett markierten Zeilen werde niemals ausgeführt. Mit return beendest du eine Funktion und gibst den dahinter übergebenden Wert zurück. Das heißt aber auch, dass alles was in einem Block hinter dem return steht, nicht mehr ausgeführt werden kann. In deinem Fall heißt das, dass du zwar den abzulegenden Gegenstand zurückgibst, aber nie ablegst. public GEGENSTAND ablegen(int typ) { if (waffe.gibTyp()==typ) { return waffe; [B] waffe = null;[/B] } else { if (schild.gibTyp()==typ) { return schild; [B]schild = null;[/B] } else { if (ruestung.gibTyp()==typ) { return ruestung; [B]ruestung = null;[/B] } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 29. November 2010 Autor Teilen Geschrieben 29. November 2010 Danke, ich habs jetzt geändert. Stimmt das dann so? public GEGENSTAND ablegen(int typ) { GEGENSTAND gegenstand; if (waffe.gibTyp()==typ) { gegenstand = waffe; waffe = null; } else { if (schild.gibTyp()==typ) { gegenstand = schild; schild = null; } else { if (ruestung.gibTyp()==typ) { gegenstand = ruestung; ruestung = null; } else { gegenstand = null; } } } return gegenstand; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 29. November 2010 Teilen Geschrieben 29. November 2010 Das dürfte soweit erstmal funktionieren. Ich weiß jetzt nicht, inwieweit dein Tutorial noch darauf eingeht, aber wenn du deinen Code so belässt, bekommst du jedes Mal eine NullPointerException wenn du die Funktion anzeigen() auf deiner Klasse HELD aufrufst und einer deiner 3 Gegenstände vorher nicht angelegt wurde. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 30. November 2010 Autor Teilen Geschrieben 30. November 2010 Und wie kann ich das verhindern? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 In dem du entweder in der Methode überprüfst ob die jeweilige Variable null ist und dann die Methode nicht aufrufst. Oder anstatt beim löschen jede Variable auf null zu setzen, kannst du die Variable auch mit einem Dummy-Objekt belegen, dass beim Aufruf der Methode anzeigen() einfach nichts ausgibt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 1. Dezember 2010 Autor Teilen Geschrieben 1. Dezember 2010 Danke, es klappt jetzt. public GEGENSTAND ablegen(int typ) { if (waffe != null && waffe.gibTyp()==typ) { GEGENSTAND waffeNeu; waffeNeu = waffe; waffe = null; return waffeNeu; } else { if (schild != null && schild.gibTyp()==typ) { GEGENSTAND schildNeu; schildNeu = schild; schild = null; return schildNeu; } else { if (ruestung != null && ruestung.gibTyp()==typ) { GEGENSTAND ruestungNeu; ruestungNeu = ruestung; ruestung = null; return ruestungNeu; } else { return null; } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DieterS Geschrieben 6. Dezember 2010 Autor Teilen Geschrieben 6. Dezember 2010 Hi, hab leider schon wieder ein Problem. Könnt ihr mir sagen, warum bei der anzeigen-Methode der Klasse HELD zwar das Rechteck, aber nicht das Bild angezeigt wird. Ich kann den Fehler einfach nicht finden. import java.awt.*; import javax.swing.*; public class HELD { int x, y; String name; double leben, staerke, gesundheit; GEGENSTAND waffe, schild, ruestung; Image bild; public HELD(String name, int leben, String dateiname, JApplet p) { this.name = name; gesundheit = 100; this.leben = leben; waffe = null; schild = null; ruestung = null; bild = p.getImage(p.getCodeBase(), dateiname); } public void anzeigen(Graphics g, JApplet p) { g.fillRect(x*32+10,y*32+30,32,32); g.drawImage(bild, x*32+14, y*32+30, 24, 32, p); } public void plaziere(int x, int y) { this.x = x; this.y = y; } } import java.awt.*; import javax.swing.*; public class DUNGEON { FELD[][] feld; int breite, hoehe; HELD spieler; public DUNGEON(int breite, int hoehe, JApplet p) { spieler = null; this.breite = breite-1; this.hoehe = hoehe-1; feld = new FELD[20][20]; // alle Felder erzeugen for (int x = 0; x <= breite; x++) { for (int y = 0; y <= hoehe; y++) { feld[x][y] = new FELD(x*32+10,y*32+30,1); } } // Koordinaten und Typ für die Felder festlegen } public void aufbauen() { for (int x=1; x<=breite-1; x++) { for (int y=1; y<=hoehe-1; y++) { if (!( x==6 || x==12 || y==4 || y==8 || y==11 || y==14)) { feld[x][y].setzeTyp(0); } else { if (y==11 && (x==13 || x==14)) { feld[x][y].setzeTyp(0); } else { if (y==14 && !(x==6 || x==7|| x==8 || x==10 || x==11 || x==12)) { feld[x][y].setzeTyp(0); } } } } } // Bereiche erstellen feld[3][4].setzeTyp(2); feld[8][4].setzeTyp(2); feld[14][4].setzeTyp(2); feld[12][6].setzeTyp(2); feld[6][7].setzeTyp(2); feld[9][8].setzeTyp(2); feld[3][11].setzeTyp(2); feld[9][11].setzeTyp(2); feld[12][13].setzeTyp(2); feld[6][12].setzeTyp(2); feld[9][15].setzeTyp(3); // Türen plazieren } public void anzeigen(Graphics g, JApplet p) { for (int x = 0; x <= breite; x++) { for (int y = 0; y <= hoehe; y++) { feld[x][y].anzeigen(g, p); } } if (spieler != null) { spieler.anzeigen(g,p); } } public void hinterlegeGegenstand(int x, int y, GEGENSTAND neu) { feld[x][y].hinterlegeGegenstand(neu); } public void plaziereHeld(int x, int y, HELD neu) { spieler = neu; spieler.plaziere(x,y); } } import java.awt.*; import javax.swing.*; public class FELD { private int feldtyp, x, y; GEGENSTAND ding; public FELD(int x, int y, int feldtyp) { this.x = x; this.y = y; this.feldtyp = feldtyp; } public void anzeigen(Graphics g, JApplet p) { if(feldtyp==0) { g.setColor(new Color(255,255,255)); // Farbe für ein freies Feld } else { if (feldtyp==1) { g.setColor(new Color(130,130,130)); // Farbe für eine Mauer } else { if (feldtyp==2) { g.setColor(new Color(255,255,0)); // Farbe für eine offene Tür } else { if (feldtyp==3) { g.setColor(new Color(0,0,0)); // Farbe für eine geschlossene Tür } } } } g.fillRect(x,y,32,32); // zeichnet die Farbe des Feldes g.setColor(new Color(0,0,0)); g.drawRect(x,y,32,32); } public void setzeTyp(int typ) { feldtyp = typ; } } public class SPIEL extends JApplet { DUNGEON test; HELD spieler; public void init() { test = new DUNGEON(16,16,this); test.aufbauen(); spieler = new HELD("Peter",100, "Bilder/Schwert", this); test.plaziereHeld(1,1,spieler); } public void paint(Graphics g) { g.drawString("Adventure-Spiel", 10, 20); test.anzeigen(g, this); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.