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("nnn-------Battle!-------nnn"); System.out.println("You've encountered a wild " + monster + " level " + level + "!nn"); 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--nnn"); 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
Answer
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, e.g. is recommended, but I guess you are not there yet.