Как вызывать строки между методами? - PullRequest
0 голосов
/ 18 октября 2018

Итак, я новичок в программировании и пытаюсь сделать текстовую RPG в Java.Всякий раз, когда я пытаюсь вызвать имя персонажа в методе, отличном от того, где было установлено имя персонажа, он возвращается как ноль.Есть ли какие-то решения для этого?Я не уверен, какие биты вырезать, потому что они могут быть важны, поэтому вот вся программа.

код:

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;
    }


}

1 Ответ

0 голосов
/ 18 октября 2018

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

  • У вас есть как минимум две области видимости в классе 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;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...