简体   繁体   中英

How can I change a variable value in the main class from a different class?

I am coding a small game for my amusement and I'm having an issue with getting a variable to be changed in one class from a value in another. I have actually done this in another class that wasn't the main. The error I am getting when running is that I need main() to be main(String[] args) which I changed to main(int wgold) .

import java.io.*;


class player {
    public static void main (String[] args) throws IOException { // <<<<<<<<<<<<<<<<<<<<< Need to have this get the value sent
        String Name, cmd;
        int gold, quit, spaces, weint, randGold;

        gold = 0;
        cmd = "none";
        quit = 0;
        spaces = 0;
        weint = 0;

        /* Ideas for new commands:
        attack - Attacks monster you have run into. - 100%
        eat - Heals you. - 0%
        run - Gets you away from a battle. - 100%
        walk - Moves you one space and you can: find something (gold, food, ect...) or run into a monster. - 50%
        */

        while (quit == 0) {
            gold += wgold; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< This is the setting of the gold after the battle >>>>>>>>>>>>>>>>>>>>>>>
            wgold = 0;
            if (cmd.equalsIgnoreCase("none")) {
                System.out.println("-------Commands-------\n");
                System.out.println("distance - Displays the amount of spaces you have walked.");
                System.out.println("gold - Shows the amount of gold you have.");
                System.out.println("quit - Exits the program.");
                System.out.println("walk - Moves you one space.\n");
                System.out.println("--End of command list--\n");
                cmd = "wait";
                BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in));
                System.out.print("Command: ");
                System.out.flush();
                cmd = stdin.readLine();
            }

            if (cmd.equalsIgnoreCase("gold")) {
                System.out.println("\nGold: " + gold + "\n");
                cmd = "none";
            }else if (cmd.equalsIgnoreCase("walk")) {
                spaces += 1;
                weint = misc.random(1000); // Sets a random number out of 1000 for a percentage.
                if ((weint >= 0) & (weint < 300)) {
                    enemies obj = new enemies();
                    obj.main();
                    cmd = "none";
                } else if ((weint >= 300) & (weint < 500)) {
                    randGold = misc.random(10); // Sets the random amount of gold found while walking.
                    if (randGold <= 0) {
                        randGold = 1;
                    }
                    System.out.println("\nYou have walked one space and found " + randGold + " gold piece(s).\n");
                    gold += randGold;
                    cmd = "none";
                } else if ((weint >= 500) & (weint <= 1000)) {
                    System.out.println("\nYou have walked one space.\n");
                    cmd = "none";
                }
            } else if (cmd.equalsIgnoreCase("distance")) {
                System.out.println("\nSpaces you have moved: " + spaces + ".\n");
                cmd = "none";
            } else if (cmd.equalsIgnoreCase("quit")) {
            System.out.println("Quitting the program...");
            quit = 1;
            } else {
                System.out.println("\nCommand not recognized.\n");
                cmd = "none";
            }
        }
    }
}

class battle {
    public static void main(String monster, int level, int mhp, int drop) throws IOException { // (String monster) gets the return value of the monster sent by the enemies class.
        int end, hp, str, smhp, exp;
        Long hit;
        String cmd;

        end = 0;
        hp = 10;
        str = 1;
        exp = 0;
        smhp = mhp;
        cmd = "none";

        System.out.println("\n\n\n-------Battle!-------\n\n\n");
        System.out.println("You've encountered a wild " + monster + " level " + level + "!\n\n");

        while(end == 0) {
            if(cmd.equalsIgnoreCase("none")) {
                System.out.println("----Commands----\n");
                System.out.println("attack - Attacks the enemy.");
                System.out.println("run - Runs from battle.\n");
                System.out.println("--End of command list--\n\n\n");
                System.out.println("-----Status----\n");
                System.out.println("HP: " + hp + "/10");
                System.out.println("Strength: " + str + "\n");
                System.out.println("---Wild " + monster + " stats---");
                System.out.println("Wild " + monster + " HP: " + mhp + "/" + smhp + "\n");
                cmd = "wait";

                BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
                System.out.print("Command: ");
                System.out.flush();
                cmd = stdin.readLine();
            }

            if(cmd.equalsIgnoreCase("run")) {
                System.out.println("\nYou have escaped from the battle!\n");
                end = 1;
            } else if(cmd.equalsIgnoreCase("attack")) {
                hit = Math.round(misc.random(str) * .7);

                System.out.println("You hit: " + hit);
                mhp -= hit;

                if(hit >= 1) {
                    exp += hit * 12;
                }

                cmd = "none";
                //Add HP for monsters / attack command. Not all here but you know where...
            } else {
                System.out.println("\nCommand not recognized.\n");
                cmd = "none";
            }

        if(mhp <= 0) {
            System.out.println("You have won!");
            System.out.println("You found: " + drop + " coins!");

            player obj = new player(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< This is where the value is sent to the player class
            obj.main(drop);

            if(exp >= str * 80) {
                str += 1;
                System.out.println("Congradulations! You now have " + str + " strength.");
            }
            end = 1;
        }

        }
    }
}

class enemies {
    public static void main() throws IOException {
        String monster;
        int drop, level, mint, mhp;

        mint = misc.random(10);

        if (mint >= 7) {
            monster = "Goblin";
        } else {
            monster = "Wizard";
        }

        battle obj = new battle(); // calls the battle class

        level = misc.random(3); // Makes a random level for the enemy.

        mhp = level + 3;

        drop = misc.random(level);

        if(drop <= 0) {
            drop = 1;
        }

        drop = drop * 3;

        obj.main(monster, level, mhp, drop); // sends the String monster to the battle class.
    }
}

I know my code is a mess and there are probably a lot of things I could have done differently but I am just learning at the moment. Any help would be very appreciated.

This code is also available here: http://pastebin.com/kjuD3GJd

You need a reference to the instance to the Main class. Something along the following code scetch (will contain typos)

public class Main{
    public static void main (String[] args){
        new Main().start();
    }
    public void start(){
        new OtherClass(this).doSomething();
    }

    public void whatever(){...}
}

public class OtherClass{
    private final Main main; 
    public OtherClass(Main aMain){
        main = aMain;
    }
    public void doSomething{
        main.whatever();
    }
}

Inside the whatever method you can access all the state of the Main instance. Of course you can pass parameters as well.

Regarding your other implicit question: To start a program you have to use a static void main(String[] args) method. Anything else wont work. Of course you can have arbitrary other methods including some with the same name, although I would recommend to use unique names for starters. This avoids the compiler confusing you about which method it is complaining.

As a an add-on some advice on asking questions here: Copy(*) your code to a fresh project. Then remove everything not necessary to understand your problem. In 9 out of 10 cases you'll find the solution to your problem in the process. In the last case you have a code sample that people are actually looking at, resulting in much better answers.

(*) instead of copying the use of a version control system, eg is recommended, but I guess you are not there yet.

You don't need a main method for every class. You could solve the problem by renaming the method to any other thing and then calling it.

Static methods don't need an object instance:

public class MainClass {
    /* args is the array of string commands passed as arguments
       when the program is invoked */
    public static void main(String[] args) {
        MyClass objRef = new MyClass();
        System.out.println(MyClass.myStaticMethod());
        //System.out.println(MyClass.nonStaticMethod()); // Cannot access a non-static method without an instance.
        System.out.write(objRef.nonStaticMethod());
    }

}

class MyClass {
    public static int myStaticMethod() {
        return 1;
    }

    public int nonStaticMethod() {
        return 2;
    }
}

There should be only one public class per file, and this file must have the same name as the public class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM