Gå til innhold

Trenger hjelp med oppgave!


Anbefalte innlegg

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
Videoannonse
Annonse

  • 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

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

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

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 av StAkkarr
Lenke til kommentar

● 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

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 av BrokenTomato
Lenke til kommentar

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

 

 

 

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

● 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 av g_threepwood
Lenke til kommentar

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

 

 

● 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 av Persn
Lenke til kommentar

/**
* 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 av quantum
Lenke til kommentar

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 :p

Koden skal være mer slik i følge oppgave.

public Item findItem(String itemName){
 //Sett inn kode her
}

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...