g_threepwood Skrevet 18. februar 2013 Del Skrevet 18. februar 2013 Jeg tar et programmeringskurs, og holder på med en oppgave. Vi bruker et program som heter BlueJ. I forrige oppgave definerte jeg en klasse Player til bruk i et RPG-spill, og i denne oppgaven skal vi bygge videre på denne klassen. Først opprettet jeg en ny klasse Item, som skal beskrive ting som Playeren kan plukke opp. Etter at klassen Item har blitt opprettet, skal vi tilbake i kildekoden til klassen Player. Oppgaven jeg trenger hjelp til går som følger: Klassen Player skal ha en liste (ArrayList) som skal kunne inneholde Items, samt hvor mange kg med items spilleren kan bære, og ha følgende metoder: ● buyItem: Legger inn et Item i listen og reduserer spillerens gullbeholdning med gjenstandens verdi, bare hvis totalvekten av Items etter å legge til en ny Item ikke overskrider spillerens kapasitet og spillerens gullbeholdning er større eller lik verdien til gjenstanden. Dette betyr at det må opprettes et nytt felt som holder rede på hvor mye penger spilleren har. ● findItem: Skal returnere et Item ved å søke etter navnet som en tekststreng. ● sellItem: Skal selge en gjenstand i listen og øke Playeren sin gullbeholdning, samtidig som den fjerner gjenstanden fra listen. Kan noen si meg helt konkret hva jeg skal gjøre? Lenke til kommentar
Persn Skrevet 18. februar 2013 Del Skrevet 18. februar 2013 Lage en klasse Item med variablene navn, vekt, salg og kjøpsverdi. Utvid klassen Player med en ArrayList<Items> Utvid klassen Player med en variabel for nåværende vekt som han bærer på, eventuelt en variabel med maksVekt til å sjekke at han ikke tar til seg mer items enn han kan bære. Utvid klassen Player med metoden buyItem. Utvid klassen Player med metoden findItem. Utvid klassen Player med metoden sellItem. Skal jeg bli mer konkret enn det gjør jeg oppgaven for deg, og det blir litt feil, det er tross alt din oppgave. Hvis du vil ha konkrete tilbakemeldinger på hva du skal gjøre er det også en forutsetning at du er litt mer konkret på nøyaktig hva du lurer på også Ellers er tvilsomt at noen gidder å hjelpe. Start øverst i punktlista jeg skreiv og kom tilbake med ett spørsmål når du sitter fast. PS: Det hjelper alltid om vi får se koden du allerede har skrevet. Lenke til kommentar
g_threepwood Skrevet 18. februar 2013 Forfatter Del Skrevet 18. februar 2013 Klassen Item har jeg allerede opprettet. Vi fikk i oppgave å opprette den med følgende felt private String name; private String description; private int value; private int weight; I klassen Player har jeg nå følgende felt: private String nick; private String type; private int health; private ArrayList<Item> items; Du sier: •Utvid klassen Player med en variabel for nåværende vekt som han bærer på, eventuelt en variabel med maksVekt til å sjekke at han ikke tar til seg mer items enn han kan bære. Hvordan gjør jeg dette? Legge til private int currentLoad; i listen over? Hvordan kan jeg sjekke at han ikke tar til seg fler items enn han kan bære? Lenke til kommentar
Persn Skrevet 18. februar 2013 Del Skrevet 18. februar 2013 Lag en privat metode som iterer gjennom arraylisten items og sett summen av itemsvekt lik f.eks currentLoad som du sier selv. Før og passe på at han ikke tar til seg for mange items kan du bare lage en sjekk som legger sammen currentLoad og vekten til den aktuelle itemen som vurderes til kjøping, hvis denne summen sprenger maks kapasitet så må sjekken returnere false. Lenke til kommentar
jevli Skrevet 20. februar 2013 Del Skrevet 20. februar 2013 (endret) du kan sjekke totalvekten på items'ene som du bærer på denne måten: // Items spilleren bærer private ArrayList<Item> items; // Metode for å sjekke vekten på alle items spilleren bærer public int currentWeight() { int sumWeight = 0; for (Item item : items) { sumWeight += item.getWeight(); } return sumWeight; } Tar også Javakurs med bruk av BlueJ. Hvilken linje går du, TS? Endret 20. februar 2013 av StAkkarr Lenke til kommentar
g_threepwood Skrevet 21. februar 2013 Forfatter Del Skrevet 21. februar 2013 Må jeg først definere sumWeight i både feltet og konstruktøren i Player-klassen? Lenke til kommentar
Persn Skrevet 21. februar 2013 Del Skrevet 21. februar 2013 Jeg trekker tilbake det jeg sa om å ha en variabel for å holde på maks vekt, det holder lenge med utregningsmetoden, da kan du bare bruke metoden når du skal sjekke opp i mot maks vekt istedet. Lenke til kommentar
g_threepwood Skrevet 22. februar 2013 Forfatter Del Skrevet 22. februar 2013 ● buyItem: Legger inn et Item i listen og reduserer spillerens gullbeholdning med gjenstandens verdi, bare hvis totalvekten av Items etter å legge til en ny Item ikke overskrider spillerens kapasitet og spillerens gullbeholdning er større eller lik verdien til gjenstanden. Dette betyr at det må opprettes et nytt felt som holder rede på hvor mye penger spilleren har. Kan denne metoden være korrekt, eller mangler den noe? /** * buy item. */ public void buyItem(Item item) { if(sumWeight + item.getValue() <= capacity) { }else if(money >= item.getValue()) { items.add(item); } else { System.out.println("Cannot buy item."); } } Lenke til kommentar
BrokenTomato Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 (endret) Du sjekker først om nåværende vekt + verdien til "item" er mindre enn eller lik capacity. Du ønsker sikkert og sjekke nåværende vekt + vekt på item. Altså: if(sumWeight + item.getWeight() <= capacity) Videre; Dersom Player har nok penger må du huske å trekke fra pengene som han har. Med andre ord; money = money - item.getValue(); items.add(item); Dette gir til slutt følgende: (Ser forresten at du har gjort noe rart med ifene dine som jeg har rydde opp i. Du har en else if som ikke gir mening. Du ønsker jo å sjekke om Player har nok penger etter at du vet at han har plass til å bære det) /** * buy item. */ public void buyItem(Item item) { if(sumWeight + item.getWeight() <= capacity) { if(money >= item.getValue()) { money = money - item.getValue(); items.add(item); } } else { System.out.println("Cannot buy item."); } } Endret 22. februar 2013 av BrokenTomato Lenke til kommentar
g_threepwood Skrevet 22. februar 2013 Forfatter Del Skrevet 22. februar 2013 (endret) Da vil denne stemme for metoden sellItem? /** * sell item */ public void sellItem(int index) { if(index >= 0 && index < items.size()) { items.remove(index); money = money + item.getValue(); } } Endret 22. februar 2013 av g_threepwood Lenke til kommentar
BrokenTomato Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 Det kommer litt ann på hvordan du bruker sumWeight. Dersom sumWeight er en variabel som skal oppdatere seg når du legger til og fjerner items må du huske og legge til / fjerne vekten på item når du kjøper og selger items. Lenke til kommentar
Persn Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 Da vil denne stemme for metoden sellItem? /** * sell item */ public void sellItem(int index) { if(index >= 0 && index < items.size()) { items.remove(index); money = money + item.getValue(); } } Det er litt mer tungvindt enn du behøver, pluss at du bruker objektet item som ikke eksisterer innenfor den metoden og du tar ikke rette for at vekten skal oppdateres. Jeg ville gjort noe sånt /** * sell item */ public void sellItem(Item item){ items.remove(item); money += item.getValue(); currentWeight -= item.getValue(); } Lenke til kommentar
GeirGrusom Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 Det er litt mer tungvindt enn du behøver, pluss at du bruker objektet item som ikke eksisterer innenfor den metoden og du tar ikke rette for at vekten skal oppdateres. Jeg ville gjort noe sånt /** * sell item */ public void sellItem(Item item){ items.remove(item); money += item.getValue(); currentWeight -= item.getValue(); } Muligens strengt tatt unødvendig, men kan være greit med en test om elementet finnes i listen også? public void sellItem(Item item){ if(!items.contains(item)) return; items.remove(item); money += item.getValue(); currentWeight -= item.getValue(); } Lenke til kommentar
g_threepwood Skrevet 22. februar 2013 Forfatter Del Skrevet 22. februar 2013 (endret) ● findItem: Skal returnere et Item ved å søke etter navnet som en tekststreng. Hvordan ville dere gått frem her? Læreboken gir et eksempel der man returnerer indexen til itemet man søker etter, men ved å overføre det til min oppgave får jeg feilmelding om incompatible type (index): /** * find item */ public int findItem(String searchString) { int index = 0; boolean searching = true; while(searching && index < items.size()) { String itemName = items.get(index); if(itemName.contains(searchString)) { searching = false; } else { index++; } } if(searching) { System.out.println("Your search yielded no results."); } } Endret 22. februar 2013 av g_threepwood Lenke til kommentar
Persn Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 Muligens strengt tatt unødvendig, men kan være greit med en test om elementet finnes i listen også? public void sellItem(Item item){ if(!items.contains(item)) return; items.remove(item); money += item.getValue(); currentWeight -= item.getValue(); } Vil ikke si at det er unødvendig nei, men tenkte at det var greit å ta en ting om gangen siden trådstarter opplagt lærer på veldig grunnleggende nivå Lenke til kommentar
Persn Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 (endret) ● findItem: Skal returnere et Item ved å søke etter navnet som en tekststreng. Hvordan ville dere gått frem her? Læreboken gir et eksempel der man returnerer indexen til itemet man søker etter, men ved å overføre det til min oppgave får jeg feilmelding om incompatible type (index): /** * find item */ public int findItem(String searchString) { int index = 0; boolean searching = true; while(searching && index < items.size()) { String itemName = items.get(index); if(itemName.contains(searchString)) { searching = false; } else { index++; } } if(searching) { System.out.println("Your search yielded no results."); } } Ifølge oppgaven skal du lage en metode som returnerer Item, derfor må du lage en metode public Item findItem(Item item){ //Sett inn kode her } Så går du igjennom arraylisten og sjekker om det finnes ett objekt der som er en match med det du tar inn i parameter og returner det hvis det finnes. Endret 22. februar 2013 av Persn Lenke til kommentar
quantum Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 (endret) /** * buy item. */ public void buyItem(Item item) { if(sumWeight + item.getWeight() <= capacity) { if(money >= item.getValue()) { money = money - item.getValue(); items.add(item); } } else { System.out.println("Cannot buy item."); } } Hvaslags feilmelding får brukeren her da, hvis den innerste if'en ikke slår til? Bruk én if og &&-operatoren isteden. Edit: Kan også lage en private boolean checkWeight(Item item) og en private boolean checkMoney(Item item) til bruk i if-testen, så ser det litt ryddigere ut. Endret 22. februar 2013 av quantum Lenke til kommentar
g_threepwood Skrevet 22. februar 2013 Forfatter Del Skrevet 22. februar 2013 Så index er helt ute av bildet her? Lenke til kommentar
Persn Skrevet 22. februar 2013 Del Skrevet 22. februar 2013 Så index er helt ute av bildet her? Det er alt etter hvordan du vil velge å løse oppgaven, jeg ville egentlig bare vurdert en for-løkke som sjekker hvert objekt i løkka etter en match. Jeg har forøvrig vært for kjapp igjen Koden skal være mer slik i følge oppgave. public Item findItem(String itemName){ //Sett inn kode her } Lenke til kommentar
g_threepwood Skrevet 22. februar 2013 Forfatter Del Skrevet 22. februar 2013 Mitt beste forslag er dette: /** * find item */ public Item findItem(String itemName) { for(Item item: items) { boolean searching = true; if(itemName.contains(hva skal stå her?)) { return itemName; } } } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå