Есть несколько проблем с вашим кодом.Я попытаюсь объяснить, почему вы видите проблемы:
- У вас есть как минимум две области видимости в классе RPG выше:
static
scope - Все, что объявлено static
- это, по сути, глобальное значение для класса. main
scope - все, что здесь объявлено, «активно» только в контексте этого метода main
.Итак,
- Вы создаете экземпляры переменных несколько раз, с одним и тем же именем 1017 *, в разных областях (в данном случае, static и main).Например, ваша переменная
String Char
определена как статическая (глобальная), но затем вы снова переопределяете ее внутри основного метода и назначаете ее независимо от того, что пользователь вводит с клавиатуры.Такое повторное использование имен переменных, также называемых shadowing , разрешено, но вы должны четко понимать, какое из них вы используете.Если вы измените значение для одного, другой не будет знать об изменении.Вот почему теневое копирование, как правило, не рекомендуется, так как в вашем коде проще ошибаться. - В вашем примере кода вы назначаете
main
scoped Char
имя символа, введенное пользователем,но когда вы печатаете имя персонажа внутри метода event
, единственная область действия Char
- это static
, , которая никогда не инициализировалась .Вот почему вы получаете значение null
, когда пытаетесь его распечатать. - CamelCase для переменных не согласован, что приводит к путанице в коде.Имена классов должны быть написаны заглавными буквами (например,
RPG
- это хорошо), но имена переменных должны быть в верблюжьей оболочке и в идеале не сокращаться, поэтому ясно, что они представляют (characterName
вместо Char
) static
Использование переменных не рекомендуется при программировании на Java / OO, так как вы можете делать практически все с правильно определенными частными / открытыми переменными.Однако для простого примера, такого как этот, можно использовать их.
Чтобы исправить упомянутую проблему, вместо повторного создания Char
имени в методе main
, выследует просто использовать глобальный Char
и присвоить ему значение, введенное пользователем.
Вот мой взгляд на «фиксированный» класс RPG.
import java.util.Random;
import java.util.Scanner;
public class RPG {
static int health;
static int enemyDamage;
static int eventnum = 0;
static String[] enemies = {"goblin", "bat", "skeleton", "beast", "guard", "demon"};
static String character;
static String occupation;
static String weapon;
static int enemyHealth;
static int weaponDamage;
public static void main(String args[]) {
Scanner kbReader = new Scanner(System.in);
System.out.print("Input character name:");
character = kbReader.nextLine();
System.out.print("Input character occupation:");
occupation = kbReader.nextLine();
System.out.print("Input character weapon:");
weapon = kbReader.nextLine();
System.out.println("And so " + character + " the brave " + occupation + " sets out on their journey, brandishing their mighty " + weapon);
System.out.println(character + " the " + occupation + " kills a " + enemies[(int) Math.round(Math.random() * 5)] + " with their " + weapon + "!");
weaponRoller(100, 90);
System.out.println(weaponDamage);
eventRoller(2, 1);
event();
}
public static void event() {
if (eventnum == 1) {
System.out.println(character + " walks into a deep dungeon; who knows what they'll encounter here...");
enemyRoller(50, 45, 25, 15);
System.out.println(character + " encounters a " + enemies[(int) Math.round(Math.random() * 5)] + "!");
}
if (eventnum == 2) {
System.out.println(character + " walks into a dense forest; its misty echoes are unsettling...");
enemyRoller(50, 45, 25, 15);
System.out.println(character + " encounters a " + enemies[(int) Math.round(Math.random() * 5)] + "!");
}
}
public static void weaponRoller(int a, int b) {
Random r = new Random();
weaponDamage = r.nextInt(a - b) + b;
}
public static void enemyRoller(int a, int b, int c, int d) {
Random r = new Random();
enemyDamage = r.nextInt(a - b) + b;
enemyHealth = r.nextInt(c - d) + d;
}
public static void eventRoller(int a, int b) {
Random r = new Random();
eventnum = r.nextInt(a - b) + b;
}
public static void charrunner(int a, int b) {
Random r = new Random();
health = r.nextInt(a - b) + b;
}
}