# Variable die eine Klasse enthält ändern Problem



## Manderda (24. Jun 2010)

Hallo nochmal,
Hätte da mal wieder ne Frage.
Also:
Ich hab mal ne Frage welche Lösungsvorschläge ihr Für mein Problem habt.
Ich möchte die Variable aktuellerNPC ändern diese enthält den NPC der aktuell verwendet werden soll.
Nun weiß ich nicht genau wie ich das mit den Räumen vereinen soll.
Hier ist erstmal mein Quelltext:

```
class Spiel 
{
    private Raum aktuellerRaum; //der Aktuell verwendete Raum
    private NPC aktuellerNPC;    // der Aktuell verwendete NPC
    private String x; //eine Hilfsvariable
  
    public Spiel() 
    {
        NPCerstellen();
        raeumeAnlegen();
    }

    private void raeumeAnlegen()
    {
        Raum Test
        TestRaum = new Raum("Test Beschreibung", ); //hier sollte dann noch die Information zu dem NPC hinzu
    }
    private void NPCerstellen() //erstellt einen NPC
    {
        NPC Test;
        
        Test = new NPC();
        Test.befuellen("hallo","Hallo, ich bin ein Test NPC."); //befüllt eine HashMaP
        Test.befuellen("kaufen", "Ich kann noch nichts verkaufen.");
    }
    private void wechsleRaum(Befehl befehl) //Befehl ist 
    {
        if(!befehl.hatZweitesWort()) //unwichtig
        {
            // Gibt es kein zweites Wort, wissen wir nicht, wohin...
            System.out.println("Wohin möchten Sie gehen?");//unwichtig
            return; //unwichtig
        }

        String richtung = befehl.gibZweitesWort(); //erstmal unwichtig
    
        naechsterRaum = aktuellerRaum.nextRaum(richtung);
        Raum naechsterRaum = null;

        x = aktuellerRaum.gibnpc(); //Variable x als Platzhalter
        if ( x.equals(null)) //soll gucken ob x null ist
         {
             aktuellerNPC = null;
         }
         else 
         {
             aktuellerNPC = x; //hier liegt mein Problem, Ich kriege es nicht hin hier den NPC der Variable aktuellerNPC hinzuzufügen
         }
            

        

        if (naechsterRaum == null) //unwichtig
        {
            System.out.println("Dort ist keine Tür!");//unwichtig
        }
        else {//unwichtig
            aktuellerRaum = naechsterRaum; //unwichtig
            System.out.println("Sie " + aktuellerRaum.gibBeschreibung()); //unwichtig
            System.out.print("Ausgänge: "); //unwichtig
            System.out.println(aktuellerRaum.gibAusgaenge()); //unwichtig
            System.out.println(); //unwichtig
        }
    }
}
```

Und hier von der Klasse raum

```
import java.util.*;

class Raum 
{
    private String beschreibung;
    private HashMap<String, Raum> ausgaenge;
    private String npc;

   
    public Raum(String beschreibung, String npc) //habe jetzt erstmal String genommen, geht aber so nicht
    {
        this.beschreibung = beschreibung;
        this.npc = npc;
        ausgaenge=new HashMap<String, Raum>();
    }

    
    public void setzeAusgang(String richtung, Raum ausgang)
    {
        ausgaenge.put(richtung, ausgang);
    }

    
    public String gibBeschreibung()
    {
        return beschreibung;
    }
    
    public String gibnpc ()
    {
        return npc;
    }
}
```
Bei Fragen gerne fragen^^
MfG

Edit: Methode erstelleNPC hinzugefügt


----------



## Final_Striker (24. Jun 2010)

[c]aktuellerNPC.setWasAuchImmer(x);[/c] ?


----------



## gman (24. Jun 2010)

Hi,

deine Klasse "Raum" hat als Datentyp für einen NPC "String". Nimm doch denselben Datentyp/Klasse
wie in der Klasse "Spiel" (NPC). Dann müsste die Zuweisung klappen.


----------



## Manderda (24. Jun 2010)

also verstehe deine kurze Antwort nicht ganz^^ 
aber ich kann ja nicht 
	
	
	
	





```
aktuellerNPC.irgentwas
```
machen, da ich ja in einem Raum einen NPC anhängen will und dafür dem Aktuellen Raum  eine Information anhängen will wo drin steht ob und welcher NPC in dem Raum vorhanden ist. Nur ich weiß nicht in welcher Form diese Information sein muss damit ich dann die Variable "aktuellerNPC" dahin ändern kann. Hoffe so wird es etwas klarer...


----------



## gman (24. Jun 2010)

Ändere den Datentyp von "npc" in der Klasse "Raum" auf "NPC" und füge noch eine Setter-Methode
dafür hinzu, oder vielleicht reicht auch  das Setzen des npc im Konstruktor.

Setter-Methode:


```
public NPC setNpc(NPC newNpc){
    this.npc = newNPC;
}
```


----------



## Manderda (24. Jun 2010)

@ gman: Wenn ich das mache un dann in Zeile 16 von der Klasse Spiel nach dem Komma "Test" schreibe, also wie der NPC heißt sagt mir der Kompiler das er die Variable nicht kennt
und wenn noch ne Frage, wie soll ich die Methode gibnpc dann ändern, da es ja kein String mehr ist. Void geht ja nicht wirklich da man dort kein return machen kann.

Edit:
Die Setter Methode versteh ich nicht ganz, wo sollte die den hin. und das alleinige Umstellen im Konstuktor von Raum auf NPc reicht leider nicht.


----------



## gman (24. Jun 2010)

- "Test" ist ein String, der Konstruktor von Raum erwartet nach der Änderung aber natürlich ein "NPC"

[JAVA=16]
Raum Test = new Raum("Test Beschreibung", new NPC(<Argumente des Konstruktors>));
[/code]

Da ich die Klasse "NPC" nicht kenne, weiß ich auch nicht was für Argumente der Konstruktor erwartet :noe:

- gibnpc: Wenn du den Datentyp von "npc" auf "NPC" änderst, musst du natürlich in der Methode
auch "NPC" als Rückgabedatentyp angeben.

- Die Setter-Method gehört natürlich in die Klasse "Raum" rein, den dort willst du doch den NPC ändern.


----------



## Manderda (24. Jun 2010)

also in etwa so:

```
public Raum(String beschreibung, NPC npc) 
    {
        this.beschreibung = beschreibung;
        this.npc = npc;
        ausgaenge=new HashMap<String, Raum>();
    }

    public NPC gibnpc ()
    {
        return npc;
    }
```

Das hat er bei mir jedenfalls kompiliert.
Wenn das so Richtig ist hät ich da noch ne Frage.
Bei der Klasse Spiel in Zeile 16:
[JAVA=16]
TestRaum = new Raum("Test Beschreibung", Test);
[/code]

muss das da so, weil Test ja in diesem Fall ein NPC ist und ich ihm den Raum anhängen will, bei mir kommt jedoch eine Fehler Meldung das er die Variable Test nicht kennt.


----------



## gman (24. Jun 2010)

Naja, bisher hast du ja einfach nur "Test" dahin geschrieben. Du musst aber ein Objekt vom Typ "NPC"
übergeben. Da ich mal davon ausgehe das du zu dem Zeitpunkt noch kein solches Objekt hast, musst
du wie im vorherigen Post beschrieben ein neues Objekt erzeugen.
Und wie gesagt musst du dir den Konstruktor der Klasse "NPC" anschauen.


----------



## Manderda (24. Jun 2010)

Zu dem Teitpunkt existirt doch schon ein Objekt mit den Namen Test von der Klasse NPC, da ich im Konstructor von Spiel die Methode NPCerstellen() aufrufe wo ein NPC mit dem Namen Test erstellt wird.

Hier mal der Konstruktor der Klasse NPC:

```
import java.util.HashSet;

public class NPC
{
    private Eingabeleser leser; //eingabeleser
    private Beantworter beantworter; //Beantworter
 
    /**
     * Erzeuge ein NPC.
     */
    public NPC()
    {
        leser = new Eingabeleser(); //eingabeleser
        beantworter = new Beantworter(); //neuer Beantworter
        
    }
```

also werden dort eigentlich keine Argumente erwartet.


----------



## gman (24. Jun 2010)

Ah, jetzt seh ich es. Die Variable "Test" (übrigens Variabennamen mit Kleinbuchstaben anfangen) ist nur
in der Methode "NPCerstellen" gültig. Erstelle also eine weitere Instanzvariable vom Typ "NPC" und
lösche die Zeilen 20-22 in der Klasse "Spiel":


```
private testNpc; //und alle "Test" in "testNpc" ändern
```


----------



## Manderda (24. Jun 2010)

??wieso Existiert die Variable Test nur in der Methode NPCerstellen ?? die Variablen aus der klasse Raumerstellen bleiben doch bestehen oder nicht?

E1:Ok ich weiß jetzt nicht ob das geklappt habe, ich habe jetzt einfach eine Instanzvariable erstellt also
[JAva]private NPC Test ;[/Java]

E2: ...zu früh gefreut.... sobald ich in einen Raum gehe, wo der NPC nicht vorhanden ist kommt die Fehler meldung "NullpointerException" bei Zeile 41 in der Klasse Spiel
E3: Ok Fehlermeldung weg. Aber trozdem kann ich aus jedem Raum mit Test reden....


----------



## gman (24. Jun 2010)

Grundsätzlich scheint es jetzt ja zu funktionieren, aber jetzt musst du dir halt anschauen wie du
den Spielverlauf in Code umsetzt. D.h. wie die Räume zusammenhängen und was für NPCs in den
Räumen drin sind. Bis jetzt hast du ja nur den NPC "Test" angelegt.


----------



## Manderda (25. Jun 2010)

also das mit dem NPC einem Raum zuordnen Funktioniert ja jetzt, jedoch hackelt es jetzt bei der Abfrage ob ein NPC in dem Raum ist. 
Hier mal mein Lösungsansatzt:
[Java]
         x = aktuellerRaum.gibnpc(); 
         if ( x.equals(null))
         {
             aktuellerNPC = null;
         }
         else 
         {
             aktuellerNPC = x;
         }
[/code]

aktuellerRaum.gibNPC(); 
ist das hier:

```
public NPC gibnpc ()
    {
        return npc;
    }
```

Es tritt beim Kompelieren kein Fehler auf aber ich kann aus Jeden Raum mit Test reden.

Edit:
Hier noch mal die Klasse von mit NPCreden , wo ja auch noch ne Abfrage sein muss

```
private void mitNPCreden(Befehl befehl)
    {
      if(!befehl.hatZweitesWort()) {
            // Gibt es kein zweites Wort, wissen wir nicht, wohin...
            System.out.println("Mit wem möchten Sie reden?");
            return;
      }
      
      if ( aktuellerNPC.equals(null))
         {
            spielen();
         }
        
      aktuellerNPC.starten();
    }
```

E2: ich habe mal Testweise mal ein weiteren NPC erstellt und jetzt tritt was komisches auf... Wenn ich sage redenmit.testenpc2 (der 2te NPC) kommen die Antworten von dem NPC test.


----------



## gman (25. Jun 2010)

Weist du der Variablen "aktuellerRaum" denn auch mal einen Raum mit einem anderen NPC zu? Eventuell
ist es immer nur der eine Raum mit dem Test-NPC?


----------



## Manderda (26. Jun 2010)

Ich habe einen Neuen Raum erstellt und diesen den neuen  NPC zugeordnet.
Das komische ist nur, das ich auch wenn ich sage redenmit neuentestnpc (eben der neue TestNPC) er dan trozdem die HashMap vpn alten TestNPC abfragt, das ist was ich nicht verstehe. wieso er obwohl ich sage rede mit neuentestnpc sage er einfach Handelt als ob es der NPC Test wäre.

Bin immoment nicht zuhause und kann leider nicht auf meine Daten zugreifen von daher wird es heute etwas schwer hier etwas zu machen...


----------



## Manderda (26. Jun 2010)

Wuhu ich habs geschaft^^ ich hab der Klasse NPC noch nen String mitgegeben, wo der Name drinne steht und dan einfach die Eingabe mit diesen String verglichen.

funktionirt jetzt alles
Danke an gman ohne dich hät ich es nicht geschafft


----------

