Gå til innhold

Anbefalte innlegg

Hvis du ser på koden her så får vi feilmelding på character.attack(treatedString);.

Attack-metoden i Character er limt inn nedenfor. 

Feilmeldingen sier "Can not find symbol - variable character". Hvordan får vi linket attack i Character til battle? Vi har forresten "Character character" som parameter i attack-metoden. Character er en superklasse til to subklasser (player & opponent), men ikke til denne spillklassen.

 

 

BATTLE-KODE I SPILLKLASSEN

public void battle() {

while(this.player.isAlive() && this.currentOpponent.isAlive()) {
String input = reader.getInput();
if(input.contains("attack")) {
newRound();
} else if(input.contains("tactic")){
String treatedString = input.replace("tactic ", "");
character.attack(treatedString);
} else if (input.contains("run")) {
run();
break;
} else if(input.contains("drink")){
String treatedString = input.replace("drink ", "");
player.usePotion(treatedString);
} else if(input.contains("equip")){
String treatedString = input.replace("equip ", "");
player.changeWeapon(treatedString);
} else {
System.err.println("What? Choose 'attack', 'drink', 'equip' or 'run'");
}
}
endGame();
}

 

 

 

ATTACK-METODE I CHARACTER:

 public int attack(Character character) {

       int damage = this.random.nextInt(getMaxDamage() + 1 - getMinDamage()) + getMinDamage();
        if(this.tactic.equals("bold")) {
            damage *= 1.2;
            character.changeHealth(-damage);
        }
        else if(this.tactic.equals("agile")) { 
            if (random.nextFloat() > 0.84)
                damage = 0;
                character.changeHealth(-damage);
        }
        else if(this.tactic.equals("defensive")){
            damage *= 0.8;
            character.changeHealth(-damage);
        }
        
        
        if(character.getTactic().equals("bold")){
            damage *= 1.2;
            character.changeHealth(-damage);
        }
        else if (character.getTactic().equals("agile")) {
            random.nextFloat();
            if (random.nextFloat() > 0.84)
                damage = 0;
                character.changeHealth(-damage);
        } else if(character.getTactic().equals("defensive")) {
            damage *= 0.8;
            character.changeHealth(-damage);
        }
        //character.changeHealth(-damage);
        return damage;
    }

 

Lenke til kommentar
Videoannonse
Annonse

Bruke kodetags og indenting værsåsnill, mye lettere å lese.

public void battle() {
  ...
  endGame();
}

Uansett, det er litt vanskelig å se uten at du viser hele klassen "Spillklassen", men har du faktisk laget character noensteds? Feilmeldingen er litt småtypisk for når man prøver å bruke variabler som ikke finnes.

  • Liker 1
Lenke til kommentar

Sorry, er litt ny på dette..
 

Her er hele "Spillklassen":

public class FieldOfHonor {
    private Player player;
    private ArrayList<Opponent> opponents;
    private Opponent currentOpponent;
    private Random random;
    private InputReader reader;

    /**
     * Initializes a FieldOfHonor with a player, a list of opponents,
     * a Random-object and a random opponent.
     * 
     * @param player - the player who will shoot 'em up
     * @param opponents - target practice
     */
    public FieldOfHonor(Player player, ArrayList<Opponent> opponents) {
        this.player = player;
        this.opponents = opponents;
        this.random = new Random();
        this.currentOpponent = selectRandomOpponent();
        this.reader = new InputReader();
    }

    /**
     * The gameLoop give the player an opportunity to play again against another player if he/she wins the first round.
     * This loop works as long as there is opponents left
     */
    public void gameLoop() {
       printWelcome();
        while(this.opponents.size() > -1) {
            String input = reader.getInput();
            if(input.contains("yes")) { 
                System.out.println("hei");
                selectRandomOpponent();
                battle();
            } 
    }
    endGame();
   }

    /**
     * Starts the battle and handles input from the player. Controls which methods are called
     * during battle.
     */
    private void battle() {
        while(this.player.isAlive() && this.currentOpponent.isAlive()) {
            String input = reader.getInput();
            if(input.contains("attack")) {
                newRound();
            } else if(input.contains("tactic")){
                String treatedString = input.replace("tactic ", "");
                character.attack(treatedString);
            } else if (input.contains("run")) {
                run();
                break;
            } else if(input.contains("drink")){
                String treatedString = input.replace("drink ", "");
                player.usePotion(treatedString);
            } else if(input.contains("equip")){
                String treatedString = input.replace("equip ", "");
                player.changeWeapon(treatedString);
            } else {
                System.err.println("What? Choose 'attack', 'drink', 'equip' or 'run'");
            }
        }
        endGame();
    }

    /**
     * Handles one round of attacking. The player attacks the opponent and the opponent
     * attacks back if it is still alive after the player attack
     */
    private void newRound() {
        int dmgToOpponent = this.player.attack(this.currentOpponent);
        System.out.println(this.player.getName() + " attacks " + this.currentOpponent.getName());
        System.out.println(this.currentOpponent.getName() + " looses " + dmgToOpponent + " hp");
        System.out.println(this.currentOpponent.getName() + " now has " + this.currentOpponent.getHealth() + " hp");
        System.out.println();
        if(this.currentOpponent.isAlive()) {
            int dmgToPlayer = this.currentOpponent.attack(this.player);
            System.out.println(this.currentOpponent.getName() + " attacks " + this.player.getName());
            System.out.println(this.player.getName() + " looses " + dmgToPlayer + " hp");
            System.out.println(this.player.getName() + " now has " + this.player.getHealth() + " hp");
        }
    }

    /**
     * Handles what happens if the player runs away. Takes 25 reputation from the player.
     */
    private void run() {
        int reputationLoss = 25;
        this.player.setReputation(this.player.getReputation() - reputationLoss);
        System.out.println(this.player.getName() + " runs from the duel and looses " + reputationLoss + " reputation.");
    }

    /**
     * Takes appropriate action based on the status of the player and opponent after
     * the battle.
     */
    private void endGame() {
        if(player.isAlive() && this.currentOpponent.isAlive()) {
            System.out.println ("Game over");
        } else if (this.player.isAlive()) {
            int pointsWon = this.random.nextInt(91) + 10;
            this.player.setReputation(this.player.getReputation() + pointsWon);
            System.out.println(this.player.getName() + " wins the game and an extra " + pointsWon + " reputation");
            System.out.println("Do you want to play again against another opponent? Type 'yes' or 'run'.");
        } else if(this.currentOpponent.isAlive()) {
            System.out.println("You died and left the game");
        } 
    }


    /**
     * Prints a welcome message at the start of the battle
     */
    private void printWelcome() {
        System.out.println("Welcome to the Field of Honor!");
        System.out.println("Your opponent is " + this.currentOpponent.getName() + "!");
        System.out.println("Choose a tactic. You can choose between bold, agile or defensive!");
    }

    /**
     * Selects a random opponent from the list of opponents
     * and removes it from the list.
     * 
     * @return a random opponent
     */
    private Opponent selectRandomOpponent() {
        return this.opponents.remove(this.random.nextInt(this.opponents.size()));
    }
}
Lenke til kommentar

Det du først fikk som svar stemte. 

 

Dette er memberne i klassa de 

    private Player player;
    private ArrayList<Opponent> opponents;
    private Opponent currentOpponent;
    private Random random;
    private InputReader reader;

merk deg du har ikke med

private Character character;

ta med den og initier den i constructoren din. 

Da kan du bruke character.attack(....)

 

Håper dette fikser feilen din. :)

 

Er dette noe oblig greier, for klasse navnene her går igjen på forumet her :)?

 

Lykke til :)

Lenke til kommentar

Det du først fikk som svar stemte. 

 

Dette er memberne i klassa de 

    private Player player;
    private ArrayList<Opponent> opponents;
    private Opponent currentOpponent;
    private Random random;
    private InputReader reader;

merk deg du har ikke med

private Character character;

ta med den og initier den i constructoren din. 

Da kan du bruke character.attack(....)

 

Håper dette fikser feilen din. :)

 

Er dette noe oblig greier, for klasse navnene her går igjen på forumet her :)?

 

Lykke til :)

 

Tusen takk for hjelpen :D Ja, holder på en oppgave i grunnkurs i programmering ved UiB :)

Nå fikk vi opp en ny feil på:

 

else if(input.contains("tactic")){

String treatedString = input.replace("tactic ", "");

character.attack(treatedString);

 

Det kommer opp at det er forventet en annen form enn String, men skjønner ikke helt hva det skal være.. 

Lenke til kommentar

Hvis du ikke har endra på koden i attack-metoden siden første post så er det skrevet der at inn-argument til attack er en integer, altså et tall. Da vil det fungere svært dårlig å sette inn en annen datatype sånn som du gjør, string.

 

EDIT: Mener Character, ikke integer.

Endret av Persn
Lenke til kommentar

 

Det du først fikk som svar stemte. 

 

Dette er memberne i klassa de 

    private Player player;
    private ArrayList<Opponent> opponents;
    private Opponent currentOpponent;
    private Random random;
    private InputReader reader;

merk deg du har ikke med

private Character character;

ta med den og initier den i constructoren din. 

Da kan du bruke character.attack(....)

 

Håper dette fikser feilen din. :)

 

Er dette noe oblig greier, for klasse navnene her går igjen på forumet her :)?

 

Lykke til :)

 

Tusen takk for hjelpen :D Ja, holder på en oppgave i grunnkurs i programmering ved UiB :)

Nå fikk vi opp en ny feil på:

 

else if(input.contains("tactic")){

String treatedString = input.replace("tactic ", "");

character.attack(treatedString);

 

Det kommer opp at det er forventet en annen form enn String, men skjønner ikke helt hva det skal være.. 

 

 

Tror problemet ditt ligger i parameteren til attack i Character klassa de.

 public int attack(Character character)

Du prøver å sende med et String objekt til en funksjon som tar et objekt av type Character som parameter.

 

Tenker det enten er lurt å endre parameter typen til String i attact(), eller at du sender med et objekt av Type Character.

 

Jeg veit ikke hvordan Character klassen din ser ut så kan ikke komme med et klart hint :)

Lenke til kommentar

 

 

Det du først fikk som svar stemte. 

 

Dette er memberne i klassa de 

    private Player player;
    private ArrayList<Opponent> opponents;
    private Opponent currentOpponent;
    private Random random;
    private InputReader reader;

merk deg du har ikke med

private Character character;

ta med den og initier den i constructoren din. 

Da kan du bruke character.attack(....)

 

Håper dette fikser feilen din. :)

 

Er dette noe oblig greier, for klasse navnene her går igjen på forumet her :)?

 

Lykke til :)

 

Tusen takk for hjelpen :D Ja, holder på en oppgave i grunnkurs i programmering ved UiB :)

Nå fikk vi opp en ny feil på:

 

else if(input.contains("tactic")){

String treatedString = input.replace("tactic ", "");

character.attack(treatedString);

 

Det kommer opp at det er forventet en annen form enn String, men skjønner ikke helt hva det skal være.. 

 

 

Tror problemet ditt ligger i parameteren til attack i Character klassa de.

 public int attack(Character character)

Du prøver å sende med et String objekt til en funksjon som tar et objekt av type Character som parameter.

 

Tenker det enten er lurt å endre parameter typen til String i attact(), eller at du sender med et objekt av Type Character.

 

Jeg veit ikke hvordan Character klassen din ser ut så kan ikke komme med et klart hint :)

 

 

Vi kan desverre ikke ta vekk Character character uten å ødlegge veldig masse annet av koden.. Men vet du en annen mulighet enn å bruke treatedString? :)

Lenke til kommentar

Men vet du en annen mulighet enn å bruke treatedString? :)

Tenker det enten er lurt å endre parameter typen til String i attact(), eller at du sender med et objekt av Type Character.

 

Alternativt kan du vurdere igjen å skrive om input til å ta string. Det er ikke så mye som må skrives om som du gir utrykk for, det er kun koden inni attack() som må endres, og den metoden er ikke så stor at du burde bruke mye jobb som grunnlag for å ikke gjøre det   ;)

Lenke til kommentar

Kode som kanskje er til hjelp nedenfor. Du ser at jeg har fjernet kall på funskjoner som starter på chacter.<funksjonNAvn>. Dette er fordi du har tilgang på disse inni klassen Chacter allerede. 

public int attack(String command) {
       int damage = random.nextInt(getMaxDamage() + 1 - getMinDamage()) + getMinDamage();
        String bold = "bold";
		String agile = "agile";
		String defensive = "defensive";
		if(command.equals(bold)) {
            damage *= 1.2;
            changeHealth(-damage);
        }
        else if(command.equals(agile)) { 
            if (random.nextFloat() > 0.84)
                damage = 0;
                changeHealth(-damage);
        }
        else if(command.equals(defensive)){
            damage *= 0.8;
            changeHealth(-damage);
        }
        
        //character.changeHealth(-damage);
        return damage;
    }

Når du jobber inni en klasse så har du tilgang til alle dens klasse medlemmer, (variablene du deklarerer på klasse nivå som du finner over construtoren som regel) alle funskjoner (private, public og protected). 

 

Når du sender med et objekt av en klasse så sender du med en intance av den klassen. Husk at en instance av en klasse opperer på sine egne data (som illustrert nedenfor) 

public class Joachim extends JLabel {
  private boolean awesome;
 
  public Joachim(bool awesome) {
      this.awesome = awesome; 
  }



}


// omitted

public void main(String[] args) {
     // ulike instancer av Joachim 
    new Joachim(false);
    new Joachim(true);
}

I en istance er jeg awesome og en annen ikke. Når du sender med et Character objekt til Character klassa og benytter dette objektet sine funksjoner så er det denne instancen av objektet du jobber med. Dette er meget vanskelig å forstå i starten når man lærer programmering, men det lærer man etterhvert :). Når du er i en klasse så kan du helt fritt kalle på alle dens klasse medlemmer og funksjoner.

 

I koden ovenfor bruker jeg this nøkkelord på grunn av shadowing. Shadowing er når du sender med parametere med samme navnet som klasse medlemmene og for å skille parameterne med samme navn fra klasse medlemmene så bruker man this forran for å si at det er klassemeddlemmene jeg snakker om nå. Alternativt er å benytte parametere med ulike navn enn klassemedlemmene, men programmere er late og finne på nye variabelnavn tar litt tid.

 

Det er noen andre spesialtilfeller man vil bruke this enn shadowing, f.eks. om jeg ville retunere en klasse kunne jeg sagt

return this; 
Endret av Joachim Hansen
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...