Так что я новичок в программировании и пытаюсь сделать текстовую RPG на java. Всякий раз, когда я пытаюсь вызвать имя персонажа в методе, отличном от того, в котором было задано имя персонажа, оно возвращается как null. Есть ли какие-то решения для этого? Я не уверен, какие части вырезать, потому что они могут быть важны, поэтому вот вся программа.
код:
import java.util.Random;
import java.util.Scanner;
import java.io.*;
public class RPG {
static int health;
static int enedamage;
static int Low = 10;
static int High = 100;
static Scanner kbReader = new Scanner(System.in);
static int eventnum = 0;
static String[] enemies = {"goblin", "bat", "skeleton", "beast", "guard", "demon"};
static String Char;
static String occup;
static String weap;
static int Enehealth;
static int weapondmg;
public static void main(String args[]) {
System.out.print("Input character name:");
String Char = kbReader.nextLine();
System.out.print("Input character occupation:");
String occup = kbReader.nextLine();
System.out.print("Input character weapon:");
String weap = kbReader.nextLine();
System.out.println("And so "+Char+" the brave "+occup+" sets out on their journey, brandishing their mighty "+weap);
System.out.println(Char+" the " + occup +" kills a " + enemies[(int)Math.round(Math.random()*5)]+" with their "+weap+"!");
weaponroller(100,90);
System.out.println(weapondmg);
eventroller(2,1);
event();
}
public static void event(){
if (eventnum == 1) {
System.out.println(Char+"walks into a deep dungeon; who knows what they'll encounter here...");
enemyroller(50,45,25,15);
System.out.println(Char+" encounters a "+enemies[(int)Math.round(Math.random()*5)]+"!");
}
if (eventnum == 2) {
System.out.println(Char+" walks into a dense forest; its misty echoes are unsettling...");
enemyroller(50,45,25,15);
System.out.println(Char+" encounters a "+enemies[(int)Math.round(Math.random()*5)]+"!");
}
}
public static void weaponroller(int a, int b) {
Random r = new Random();
High = a;
Low = b;
weapondmg = r.nextInt(High-Low) + Low;
}
public static void enemyroller(int a, int b, int c, int d){
Random r = new Random();
High = a;
Low = b;
enedamage = r.nextInt(High-Low) + Low;
High = c;
Low = d;
Enehealth = r.nextInt(High-Low) + Low;
}
public static void eventroller(int a, int b) {
Random r = new Random();
High = a;
Low = b;
eventnum = r.nextInt(High-Low) + Low;
}
public static void charrunner(int a, int b) {
Random r = new Random();
High = a;
Low = b;
health = r.nextInt(High-Low) + Low;
}
}
Несвязанное, но именование camelCase - это соглашение Java, которое способствует удобочитаемости. Хотя я не совсем понимаю, о чем вы спрашиваете. Мне также непонятно, почему вы продолжаете переопределять (неправильно названные) High и Low вместо того, чтобы просто использовать параметры.




С вашим кодом есть несколько проблем. Я попытаюсь объяснить, почему вы видите проблемы:
static - все, что объявлено static, в основном является глобальным значением для класса.main - все, что здесь объявлено, является «активным» только в контексте этого метода main. Так,String Char определяется как статическая (глобальная), но затем вы снова переопределяете ее внутри основного метода и назначаете ей все, что пользователь вводит с клавиатуры. Такое повторное использование имен переменных, также называемое слежка, разрешено, но вы должны четко понимать, какое из них вы используете. Если вы измените значение для одного, другой не узнает об изменении. Вот почему затенение вообще не рекомендуется, так как в коде легче ошибаться.main с областью действия Char имя символа, вводимое пользователем, но когда вы распечатываете имя символа внутри метода event, единственным Char в области действия является static, который никогда не инициализировался. Вот почему вы получаете значение null, когда пытаетесь его распечатать.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;
}
}
Создание всего
static- признак плохого объектно-ориентированного проектирования. Вот вам поля слежкаstatic. Удалите имя типа перед полем, в котором вы устанавливаете значения.String Char = kbReader.nextLine();означает, что полеChar- этоnull.