Daniel
Daniel

Reputation: 339

Cannot find symbol in Java application

I am working on a simple text-based rpg battler program as an introduction to Java. I seem to have a decent understanding of the majority of code, but I have ran into a couple of issues.

The issues I am having are in the Project class.

In my switch statement I am trying to use the setSpells() and setArrows() methods and I am getting a "cannot find symbol" error message. I realize that this is probably due to something I have set up incorrectly in the sub-classes, but I am unsure what that is.

The second issue is in the print statement pulling the character name by use of c.getName(). The c part of that statement gives the same error message.

Is there something simple that I am misunderstanding in these situations? Any help resolving this would be appreciated. Thank you.

Here is my main project class file:

package project;

import java.util.Scanner;

public class Project {

public static void main(String[] args) {
    System.out.println("Welcome to Lands of the Sun\n");

    Scanner sc = new Scanner(System.in);
    String choice = "y";
    while (choice.equalsIgnoreCase("y"))
    {
        System.out.print("Please choose your class (wizard or elf): \n");
        String classChoice = sc.next();
        sc.nextLine();

        System.out.print("Please choose a name for your " + classChoice + ": ");
        String charName = sc.next();
        sc.nextLine();

        int healthVal = (int) (Math.random() * 10) + 1;

        switch (classChoice) {
            case "wizard":
                {
                    Character c = new Wizard();
                    c.setName(charName);
                    c.setGold(25);
                    c.setHealth(healthVal);
                    c.setSpells(10);
                    break;
                }
            case "elf":
                {
                    Character c = new Elf();
                    c.setName(charName);
                    c.setGold(25);
                    c.setHealth(healthVal);
                    c.setArrows(10);
                    break;
                }
        }

        System.out.print(c.getName());

        System.out.print("Continue? (y/n): ");
        choice = sc.nextLine();
        System.out.println();
    }
}

}

Here is my Character class:

package project;

public abstract class Character {
private String name;
private int gold;
private int health;
public static int count = 0;

public Character()
{
    name = "";
    gold = 0;
    health = 0;
}

public Character(String name, int gold, int health) {
    this.name = name;
    this.gold = gold;
    this.health = health;
}

public void setName(String name)
{
    this.name = name;
}

public String getName(){
    return name;
}

public void setGold(int gold)
{
    this.gold = gold;
}

public int getGold()
{
    return gold;
}

public void setHealth(int health)
{
    this.health = health;
}

public int getHealth()
{
    return health;
}
@Override
public String toString()
{
    return "Name: " + name + "\n" +
           "Gold: " + gold + "\n" +
           "Health: " + health + "\n";
}

public static int getCount()
{
    return count;
}

public abstract String getDisplayText();
}

Here is my Wizard sub-class:

package project;

public class Wizard extends Character {
private int spells;

public Wizard()
{
    super();
    spells= 0;
    count++;
}

public void setSpells(int spells)
{
    this.spells= spells;
}

public int getSpells(){
    return spells;
}

    @Override
public String getDisplayText()
{
    return super.toString() +
        "Spells: " + spells+ "\n";
}
}

And finally my Elf sub-class:

package project;

public class Elf extends Character{
private int arrows;

public Elf()
{
    super();
    arrows = 0;
    count++;
}

public void setArrows(int arrows)
{
    this.arrows = arrows;
}

public int getArrows(){
    return arrows;
}

    @Override
public String getDisplayText()
{
    return super.toString() +
        "Arrows: " + arrows + "\n";
}
}

Upvotes: 2

Views: 215

Answers (4)

Georgie
Georgie

Reputation: 61

I have made the some changes to your code.. here is the final code.

package h;

import java.util.Scanner;

public class he {

public static void main(String[] args) {
    System.out.println("Welcome to Lands of the Sun\n");
    Character c = new Wizard();
    Character e = new Elf();
    Scanner sc = new Scanner(System.in);
    String choice = "y";
    while (choice.equalsIgnoreCase("y"))
    {
        System.out.print("Please choose your class (wizard or elf): \n");
        String classChoice = sc.next();
        sc.nextLine();

        System.out.print("Please choose a name for your " + classChoice + ": ");
        String charName = sc.next();
        sc.nextLine();

        int healthVal = (int) (Math.random() * 10) + 1;

        switch (classChoice) {
            case "wizard":
                {

                    c.setName(charName);
                    c.setGold(25);
                    c.setHealth(healthVal);
                    c.setFireballs(10);
                    break;
                }
            case "elf":
                {
                    ;
                    e.setName(charName);
                    e.setGold(25);
                    e.setHealth(healthVal);
                    e.setArrows(10);
                    break;
                }
        }

        System.out.print(c.getName());

        System.out.print("Continue? (y/n): ");
        choice = sc.nextLine();
        System.out.println();
    }
}

}

Wizard class

public class Wizard extends Character { private int fireballs;

public Wizard()
{
    super();
    fireballs = 0;
    count++;
}

public void setFireballs(int fireballs)
{
    this.fireballs = fireballs;
}

public int getFireballs(){
    return fireballs;
}

    @Override
public String getDisplayText()
{
    return super.toString() +
        "Fireballs: " + fireballs + "\n";
}

    @Override
    public void setArrows(int i) {

    }

}

Elf class

public class Elf extends Character { private int arrows;

public Elf()
{
    super();
    arrows = 0;
    count++;
}

public void setArrows(int arrows)
{
    this.arrows = arrows;
}

public int getArrows(){
    return arrows;
}

    @Override
public String getDisplayText()
{
    return super.toString() +
        "Arrows: " + arrows + "\n";
}

    @Override
    public void setFireballs(int i){

    }

}

abstract class Character

public abstract class Character { private String name; private int gold; private int health; public static int count = 0;

public Character() {
    name = "";
    gold = 0;
    health = 0;
}

public Character(String name, int gold, int health) {
    this.name = name;
    this.gold = gold;
    this.health = health;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setGold(int gold) {
    this.gold = gold;
}

public void setHealth(int health) {
    this.health = health;
}

public int getHealth() {
    return health;
}

@Override
public String toString() {
    return "Name: " + name + "\n" + "Gold: " + gold + "\n" + "Health: "
            + health + "\n";
}

public static int getCount() {
    return count;
}

public abstract String getDisplayText();

public abstract void setFireballs(int i);

public abstract void setArrows(int i);

}

hope this helps...

Upvotes: 0

VoidWhisperer
VoidWhisperer

Reputation: 95

Your issue is with these lines

Character c = new Wizard();
....
Character c = new Elf();

The character class itself doesn't have the setFireballs or SetArrows methods. You need to define the object as a wizard or elf in order to get access to said methods... EG:

Elf c = new Elf();
Wizard c = new Wizard();
etc

Upvotes: 1

MadProgrammer
MadProgrammer

Reputation: 347314

When you create one of your Characters...

Character c = new Elf();

You are downcasting the instance to "act" like Character, this is very useful feature in Object Oriented Programming, but is causing you issues in this case, as Character does not have the methods you are looking for.

Instead, start by assigning the class to a concrete version of the instance...

Elf elf = new Elf();

Apply the properties you need and then assign it to a Character reference...

Character c = null;
//...
switch (classChoice) {
    //...
    case "elf":
    {
        Elf elf = new Elf();
        //...
        c = elf;
    }
}
c = elf;

for example...

Have a look at the section on Polymorphism for more details

Upvotes: 3

committedandroider
committedandroider

Reputation: 9291

Character c = new Wizard(); Character has neither a setFireBalls method nor a setArrows method.

Upvotes: 0

Related Questions