Hulp nodig bij items in HashMap

Status
Niet open voor verdere reacties.
De flow van de code volgend met als voorbeeld de volgende regel: woodsNorth = new Room("outside the main entrance of the hounted house");

-Maak object Room aan
-In het object Room worden de volgende waardes gezet: this.itemDescription = "outside the main entrance of the hounted house";
- de rest van de items zijn op dit moment leeg. ( this.name = name doet niks aangezien je geen name als parameter meegeeft enz)

//wat andere settings van woodsNorth

regel 99:

- Nieuw object Item wordt aangemaakt (golden_key). Deze wordt niet geinitialiseerd dus is deze null
- aan de room woodsNorth wordt een nieuw item toegevoegt dmv de methode: addItem. de desbetreffende waardes zijn: name = "golden key", description = "a_golden_key_is_the_key_for_the_golden_door" en weight =1
- In het object Item wordt het volgende gedaan: this.name = name, etc.. alleen itemList wordt geinitialiseerd maar geen waardes aan toegevoegt. dit is dus een lege hashmap.


kortom er wordt nergens data in het de hashmap van het object Item gezet.

Ik weet niet waar je precies (en met welke data) je bedoeld hebt het object Item te vullen, maar dit wordt nergens gedaan. Overigens wordt de methode in Items->addItems(); nooit gebruikt. Had je misschien bedoeld deze aan te roepen in de constructor van het Item object ?
 
Laatst bewerkt:
De flow van de code volgend met als voorbeeld de volgende regel: woodsNorth = new Room("outside the main entrance of the hounted house");

-Maak object Room aan
-In het object Room worden de volgende waardes gezet: this.itemDescription = "outside the main entrance of the hounted house";
- de rest van de items zijn op dit moment leeg. ( this.name = name doet niks aangezien je geen name als parameter meegeeft enz)

this.itemDescription heeft niks te maken met de description van de kamer. Die staat in Game al, maar this.itemDescription is voor de Description van het item. Dus de description van golden_key = "a_golden_key_is_the_key_for_the_golden_door".
Dit staat in de klasse Item.

//wat andere settings van woodsNorth


regel 99:

- Nieuw object Item wordt aangemaakt (golden_key). Deze wordt niet geinitialiseerd dus is deze null
- aan de room woodsNorth wordt een nieuw item toegevoegt dmv de methode: addItem. de desbetreffende waardes zijn: name = "golden key", description = "a_golden_key_is_the_key_for_the_golden_door" en weight =1
- In het object Item wordt het volgende gedaan: this.name = name, etc.. alleen itemList wordt geinitialiseerd maar geen waardes aan toegevoegt. dit is dus een lege hashmap.


kortom er wordt nergens data in het de hashmap van het object Item gezet.


-Waar bedoel je regel 99?
- En ik wil aan de room woordsNorth inderdaad de golden_key toevoegen enkel dan geeft hij een "null" terug.
-Waar wordt een nieuwe object golden_key gemaakt die niet geinitialiseerd wordt?:confused:
-Dus ik zou deze gegevens ook weer uit de Klasse Item moeten halen?

Ik weet niet waar je precies (en met welke data) je bedoeld hebt het object Item te vullen, maar dit wordt nergens gedaan. Overigens wordt de methode in Items->addItems(); nooit gebruikt. Had je misschien bedoeld deze aan te roepen in de constructor van het Item object ?

Ja inderdaad, de bedoeling is dat de methode Items>addItems in de Klasse Item worden aangemaakt.
 
regel 99 van je class Game. daar doe je het volgende:

[cpp]
Item golden_key;
woodsNorth.addItem("golden key","a_golden_key_is_the_key_for_the_golden_door",1);
[/cpp]

wat je zou kunnen doen om het probleem op te lossen is het volgende:

in je Game class, method: createRooms regel 99:
[cpp]

Item golden_key = new Item("SomeName","Some_Description",1);
woodsNorth.addItem(golden_key);


[/cpp]

dan de methode in de Room class aanpassen:
[cpp]


public void addItem(Item item){

itemList.put(item.getName(), item);
}
[/cpp]

en als laatste in de Item class hetzelfde laten en dan in de constructor de addItems() methode aanroepen. Verder kan je deze classe ook uitbreiden zodat je er extern dingen aan toe kan voegen ipv de vaste items die in de addItems methode staan.
 
Bedankt voor de heldere uitleg!;)
Maar zou het ook kunnen dat ik de items allemaal maak in de klasse Items en dan in de kamers maak of moet ik an ook perse de items nog doen in Game/Room?
 
dat zou wel kunnen ja, het ligt er maar net aan hoe je het ontworpen hebt. Er zij misschien wel mooiere oplossingen voor het probleem. Had je de volledige source in een zip ofzo ?
 
Jazeker heb ik.
http://www.2shared.com/file/Qa_RX6cS/Items.html

Ik wil het liefst zo hebben: Je hebt een aantal items. Die items moeten in kamers komen. Deze items moet je op kunnen pakken en kunnen gebruiken. Deze items moeten dus ook in een inventory komen en daar moet ik dus ook rekening mee houden....
Maar tot nu toe krijg ik het al niet voor elkaar om de items in de kamers te krijgen.
 
Ik weet niet of ik vanavond nog tijd heb om er helemaal doorheen te gaan, ben zelf ook nog een project aan het afronden. Op z`n laatst wordt het morgen denk ik
 
Is goed!;)
Moet het vrijdag af hebben met nog veel meer opties dus kan ik nog lekker prusten maar alvast bedankt voor je moeite!;)
 
Ok ik heb nog even tijd gehad om te kijken en denk dat het wel zo werkt op deze manier.
Verder had ik nog wat vragen.
Waarom heb je eigenlijk binnen Item een hashmap met daarin items ? dit wordt toch namelijk al bijgehouden in de room ? Ik ben er van uit gegaan dat dit een foutje is geweest maar ik kan het mis hebben.

Ik heb het volgende aangepast:

In de class Item:
- De hashmap verwijderd.
- De methode addItems verwijderd.

In de class Room heb ik het volgende aangepast:
-itemDescription verwijderd (kamer kan toch meerdere items bevatten, dat kan toch niet met 1 string dan ?)
- getLongDescription method aangepast. deze geeft nu het aantal items in de kamer weer ipv 1 item.
- getItems methode aangemaakt. deze methode returned alle keys uit de hashmap die op dat moment in de kamer zitten (gescheiden dmv comma)

In de class Game:

- in de createRooms heb ik het laatste deel vanaf regel 99 weggehaald (Item golden_key, en //woodsNorth.addItem("golden_key", "a_golden_key_is_the_key_for_the_golden_door", 1))
- tijdelijke methode gemaakt die default waardes in de kamer gooit. deze is genaamt addDefaultValues.
-Deze methode gooit de items die eerst in de class Items stonden, in de desbetreffende kamer

[cpp]

private void addDefaultValues(Room room){
room.addItem("golden_key", "a_golden_key_is_the_key_for_the_golden_door", 1);
room.addItem("silver_key", "a_silver_key_is_the_key_for_the_silver_door", 1);
room.addItem("bronze_key", "a_bronze_key_is_the_key_for_the_bronze_door", 1);
room.addItem("manchete", "a_melee_weapon", 5);
room.addItem("golden_apple", "a_golden_apple_is_an_apple_for_health_regen", 2);
room.addItem("backpack", "a_backpack_increases_your_inventory_capacity", 2);
}

[/cpp]


de source kan je downloaden als je het wilt bekijken. ik heb in overige classes wat dingen uitgecomment zodat ik het kon debuggen (deze werkte nog niet).

http://dl.dropbox.com/u/3380837/Items.rar
 
Erg bedankt!
De bedoeling was dat er een aparte klasse Item kwam. Maar het leek mij dan ook logisch om item objecten te kunnen aanmaken in room... (niet logisch dus?) Ook kan er maximaal maar 1 item per kamer zijn.
Nu heb ik nog een laatste vraag voorlopig. De methode getItem, als ik die wil gebruiken in game(dat moet anders kan je die door middel van een command niet oproepen) krijg ik een non-static method cannot be referenced from a static context fout. Zou ik dan een variable moeten maken in de velden en constructor?

Ik waardeer je hulp enorm!
 
Jawel hoor dat is juist logisch, dat heb ik zo gelaten alleen heb je al voldoende informatie in de class Item zitten. De HashMap is daar overbodig. In de kamer zit namelijk al een hashmap<string,item> (vandaar dat ik er van uitging dat er meerdere items per kamer konden zijn. Als je per definitie maar 1 item in de kamer wilt hebben kan je ook die hashmap verwijderen in simpelweg vervangen door een instantie van Item.

verder om de getItems methode te gebruiken, dat is gewoon precies het zeflde als die getLongDescription() methode. je kan gewoon simpelweg zeggen:

System.out.println(currentRoom.getItems());
 
Bedankt! Ik heb nu weer een heel stuk af van het project, nog een vraagje. Als ik de methode public void pickUpItem() in Inventory wil doen, hoe zou ik dat dan moeten aanpakken? De methode moet het item in de kamer door middel van een commando oppakken en in de Arraylist stoppen, of zou ik hiervoor ook een Hashmap moeten gebruiken?
 
Ik zou wat minder hashmaps gebruiken :P Als het goed heb je een instantie van Item in je room zitten. die zou je dus kunnen opvragen vanuit je Game class en vervolgens naar je inventory kunnen sturen.

Het lijkt mij dat een Player een instantie van Inventory heeft. en dat de Game weer een instantie heeft van Player.
Wat je dus kunt doen is die methode in de class player zetten.

dan kun je dus vanuit je Game class het volgende doen.

player.pickup(room.getItem());

wat tevens ook logisch eruit ziet (als je de methode in inventory plaatst dan krijg je rare code, inventory.pickup() ziet er raar uit. pickup is meer een player attribuut)
 
Oke dit begrijp ik, maar het item moet dan ook opgeslagen worden in een Arraylist in de klasse Inventory, immers de gebruiker moet wel kunnen zien welke items hij bij zich heeft.
 
Hoe kan ik een item toevoegen aan een inventory met een ArrayList<Item> inv?
Ik heb het geprobeerd met:
Code:
public void pickUpItem()
    {
         if(Room == woodsNorth)
         {inv.add(beamer)};
          if else(Room == kitchen)
        {inv.add(golden_apple)}
    }

Enkel dit werkt niet, hij kan de variable Room niet vinden, en volgens mij is de variable achter de .add ook niet goed.... Enig idee hoe ik dit kan fixen?
 
zo uit m`n hoofd:

[cpp]

class Player{

private Inventory inv;
//overige code

public void pickUp(Item item){

inv.add(item);
}
}
[/cpp]


[cpp]

class Inventory{

private ArrayList<Item> list;

public void add(Item item){

list.add(item);
}

}

[/cpp]

[cpp]

class Game{

private Player player;
private Room currentRoom;
//overige code

//moet command pickUp ofzo zijn iig dit moet worden uitgevoerd dan.
public void command(){

/bij pickup het volgende uitvoeren.
player.Pickup(currentRoom.getItem());
}

}

[/cpp]

[cpp]

class Room{

private Item roomItem;

public Item getItem(){
return roomItem;
}
}


[/cpp]
 
Laatst bewerkt:
zo uit m`n hoofd:

[cpp]

class Player{

private Inventory inv;
//overige code

public void pickUp(Item item){

inv.add(item);
}
}
[/cpp]


[cpp]

class Inventory{

private ArrayList<Item> list;

public void add(Item item){

list.add(item);
}

}

[/cpp]

[cpp]

class Game{

private Player player;
private Room currentRoom;
//overige code

//moet command pickUp ofzo zijn iig dit moet worden uitgevoerd dan.
public void command(){

/bij pickup het volgende uitvoeren.
player.Pickup(currentRoom.getItem());
}

}

[/cpp]

[cpp]

class Room{

private Item roomItem;

public Item getItem(){
return roomItem;
}
}


[/cpp]


Ik heb alles netjes in mijn code gezet en als ik het commando pickup oproep ingame krijg ik een java.langnullpointerexception: null bij de methode
Code:
    //bij pickup het volgende uitvoeren.
    private void pickup()
    {
    player.pickUp(currentRoom.getItem());
   }
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan