Gå til innhold

Anbefalte innlegg

Hei!

 

Sitter å arbeider med obligatorisk oppgave 4 i INFO132 ved UiB, og jeg har kjørt meg litt fast på et par ting. Ville satt utrolig stor pris på hjelp!

 

For å gi oversikt: vi bruker boken Objects first with Java, a Practical Introduction Using BlueJ - og dermed programmet BlueJ. Her er en oversikt over klassene jeg så langt har:

 

66ce519f1893a69eccfd023cf56579cb.png

 

Oppgaven går ut på å jobbe litt med et enkelt RPG spill.

 

Oppgave 1

 

Oppgaven sier:

"Det skal legges inn to ulike gjenstander (Items) i spillet:

a. Våpen som en spiller kan utruste seg med for å øke skaden som kan utføres. En spiller kan kun være utrustet med ett våpen, men kan ha flere våpen liggende i samlingen gjenstandere og spilleren skal kunne bytte mellom disse.

b. Helsedrikker som spilleren kan drikke under kamp for å øke helsen.

 

Jeg har opprettet to subklasser til Item for hhv weapon og items. Har også lagt til verdier slik som damageBoost og healthBoost i tillegg til en enkel boolean som sier om det er et våpen eller ikke. I player-klassen skal jeg nå få lagt inn effektene av at gjenstander brukes ved at enten økes health, eller så settes min og max skade opp med bonusen til våpenet, samtidig som at nåværende bonus blir lagret slik at om det blir utrustet med et nytt våpen stackes ikke bonusene. For metoden useItem har jeg skrevet dette:

    public boolean useItem(String itemName) {
        Item item = findItem(itemName);
        if(item != null) {
              if(item.isWeapon = true) {
                    if(currentDamageBoost != 0){
                         setMinDamage(minDamage + weapon.getDamageBoost() - currentDamageBoost);
                         setMaxDamage(maxDamage + weapon.getDamageBoost() - currentDamageBoost);
                    } else {                     
                     setMinDamage(minDamage + weapon.getDamageBoost());
                     setMaxDamage(maxDamage + weapon.getDamageBoost());
                    }
                   System.out.println("You equiped a " + item.getName() +" which increases your damage with "+ weapon.getDamageBoost() +".");
                   currentDamageBoost = item.getDamageBoost();   
              } else if(item.isPotion = true) {
                   changeHealth(getHealth() + potion.getHealthBoost());
                   System.out.println("You the Potion "+ item.getName() +" which gave you "+ potion.getHealthBoost() +" more hitpoints.");
              } else {
               System.out.println("You equip the weapon, but notice no effect other than better confidence!");
            } return true;
        } else {
            return false;
        }
    }

1 - Dette kompilerer ikke da jeg får feilmelding vet at jeg skriver weapon.getDamageBoost(). Før jeg innså at jeg kanskje burde bruke arv her og opprette egen klasse hadde jeg en litt stor item-klasse hvor denne funksjonen lå - og det fungerte fint. Men det gjør det ikke nå... hvorfor?

2 - Våpen kan godt ligge igjen, så det er ingen behov for å fjerne våpenet. Derimot så er det naturlig at Potion blir fjernet fra spillerens backpack når den drikkes. Hvordan skriver jeg det?

 

I tillegg så er jeg litt stuck i hvordan jeg skal få lest hvilken gjenstand som skal brukes... hvordan skrives dette?

 

runGame() i klassen BattleGround ser så langt slik ut:

    private boolean runGame() {
        String input = inputReader.getInput().trim();
        if(input.equalsIgnoreCase("flee")) {
            run();
            return false;
        } else if (input.equalsIgnoreCase("attack")) {
            return attack();
        } else if (input.equalsIgnoreCase("help")) {
            System.out.println("Command -- Action");
            System.out.println("attack -- to attack your enemy");
            System.out.println("flee -- to flee from the battle (notice you have to pay 50 gold");
            System.out.println("use - to use a special item from your backpack");
            System.out.println("help -- to get more information about possible commands");
            return true;
        } else if (input.equalsIgnoreCase("info")) {
            System.out.println(hero.toString());
            return true;
        } else if (input.equalsIgnoreCase("use")) {
            hero.useItem();
            return true;
        } else {
            System.out.println("Please choose 'attack' or 'flee', or type 'help' to get a list of all possible commands.");
            return true;
        
        }
    }

Opppgave 4

Oppgaven sier: "toString() må endres slik at den skriver ut all relevant informasjon om PLayer (og samlingen av items) Subklasser skal overskrive subklassens toString(),, men likevel benytte seg av toString() fra superklassen i implementasjonen da dette reduserer kodeduplisering."

 

Jeg har ikke refaktorert toString() til Character enda, da jeg ikke vet hvordan.

toString i Player:

    /**
     * @return a string with player information
     */
    @Override
    public String toString() {
        String string = "Name: " + name + " Type: " + type + "\n";
        if(isAlive()) {
            string += "Is alive with health: " + health;
        } else {
            string += "Is dead.";
        }
        string += "\n"+ name + "'s backpack contains the following items: \n";

        for(Item item : backpack.values()) {
            string += item;
        }
        return string;
    }

    

toString() i klassen monster:

    
    /**
     * @return a string with monsters information
     */
    @Override
    public String toString() {
        String string = "Name: " + name + ", min damage: " + minDamage + ", max damage: " + maxDamage + "\n";
        if(isDead()) {
            string += "Is dead.";
        } else {
            string += "Is alive with health: " + health;
        }
        return string;
    }

Hvordan gjør jeg det oppgaven sier?

 

 

På forhånd tusen takk for svar!

Endret av Camorra
Lenke til kommentar
Videoannonse
Annonse

Om jeg forstår det rett her så skal "Character" klassen overstyre toString for å printe ut generell informasjon om alle Characters. Jeg antar da at denne klassen inneholder "Name" og ting som er totalt generisk for alle som arver fra denne klassen (Visst det ikke er tilfellet bør du omorganisere).

 

Det du må gjøre er å overstyre toString som du har gjort i Player klassen, og hive ut info om det som kun Character definerer.

 

Feks slik:

@Override public String toString() {
    StringBuilder result = new StringBuilder();
    String newLine = System.getProperty("line.separator");

    //determine fields declared in this class only (no fields of superclass)
    Field[] fields = this.getClass().getDeclaredFields();

    //print field names paired with their values
    for (Field field : fields) {
      result.append("  ");
      try {
        result.append(field.getName());
        result.append(": ");
        //requires access to private field:
        result.append(field.get(this));
      }
      catch (IllegalAccessException ex) {
        System.out.println(ex);
      }
      result.append(newLine);
    }

    return result.toString();
  }

På denne måten (fant denne info her, da jeg ikke bruker java nok til å vite om denne metoden) får du veldig greit navnene på variabelen samt dens verdi. Om du vil definere det på en annen måte så gjør du det jo bare steg for steg selvsagt.

 

Når du har denne klar for Character klassen, så får du fatt i toString i Player klassen på denne måten:

/**
     * @return a string with player information
     */
    @Override
    public String toString() {

        /*
        * Disse bør nå befinne seg i Character sin "toString()"
        String string = "Name: " + name + " Type: " + type + "\n";
        if(isAlive()) {
            string += "Is alive with health: " + health;
        } else {
            string += "Is dead.";
        }
        */
        String string = super.toString(); // Her henter du Character sin toString()
        string += "\n"+ name + "'s backpack contains the following items: \n";

        for(Item item : backpack.values()) {
            string += item;
        }
        return string;
    }

Noe slik du tenkte?

Endret av Oyand
  • Liker 2
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...