Как вызвать строки между методами?

Так что я новичок в программировании и пытаюсь сделать текстовую 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;
    }


}

Создание всего static - признак плохого объектно-ориентированного проектирования. Вот вам поля слежкаstatic. Удалите имя типа перед полем, в котором вы устанавливаете значения. String Char = kbReader.nextLine(); означает, что поле Char - это null.

Elliott Frisch 18.10.2018 02:51

Несвязанное, но именование camelCase - это соглашение Java, которое способствует удобочитаемости. Хотя я не совсем понимаю, о чем вы спрашиваете. Мне также непонятно, почему вы продолжаете переопределять (неправильно названные) High и Low вместо того, чтобы просто использовать параметры.

Dave Newton 18.10.2018 02:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
42
1

Ответы 1

С вашим кодом есть несколько проблем. Я попытаюсь объяснить, почему вы видите проблемы:

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

Другие вопросы по теме