Zum Inhalt springen

Adventuregame


DieterS

Empfohlene Beiträge

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 von flashpixx
Code-Tags eingefügt
Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

    }


}


Link zu diesem Kommentar
Auf anderen Seiten teilen


...

    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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

                }                 

             } 

        }

    }


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

                }                 

             } 

        }

    }



Link zu diesem Kommentar
Auf anderen Seiten teilen

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; 

    }

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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; 

                }

             } 

        }   

    }

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

   }


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...