1

ユーザー入力によって設定された列挙型の値を返すことができるメソッドを作成しようとしています。列挙型をデカールしてから、ユーザーの入力によって列挙型を設定しようとしました。GetPlayerClass メソッドを使用して Player_Class の値を返すことができません。これが列挙型を使用して値を設定する正しい方法であるかどうか、またはユーザーが列挙型リストから選択して選択できるようにする方法があるかどうかを教えてください。

私のコードは以下です。

TLDR: 私は「列挙型」で、列挙型から変数の値を設定し、後でその値を返す方法を理解できません。私のコードを見て、私が間違っていることを教えてください。

  // The PCs base class
    private enum Base_Class {
        Barbarian, Bard, Cleric, Druid, Fighter, Monk, 
        Paladin, Ranger, Rogue, Sorcerer, Wizard
    };


 // Setting the base class
 public void setBaseClass() {
        do {
            System.out.println("Available Classes: ");
            System.out.println("Please select a cooresponding number for class.");
            int i = 1;
            for(Base_Class value: Base_Class.values()){
                System.out.println(i+": "+value.name());
                i++;
            }
            try {
                Base_Class_Choice = user_input.nextInt();
                switch(Base_Class_Choice) {
                    case 1:
                        Base_Class Player_Class;
                        Player_Class = Base_Class.Barbarian;
                        break;
                    case 2:
                        break;
                    default:
                        break;
                }
            } catch (Exception e) {
                System.out.println("You must choose a valid class. Try numbers.");
                user_input.next();
            }
        } while (Base_Class_Choice == 0);
    }

    /**
     * Return my players class
     * @return
     */
    public String getPlayerClass() {
        return Player_Class;
    }

以下のコードを更新しました。私の試行領域は次のようになりました。

    try {
                Base_Class_Choice = user_input.nextInt();
                Base_Class Player_Class = Base_Class.values()[Base_Class_Choice - 1];
            } catch (Exception e) {
                System.out.println("You must choose a valid class. Try numbers.");
                user_input.next();
            }

しかし、Base_Class Player_Class のリターンは機能しません。

    public String getPlayerClass() {
        return Player_Class;
    }

Player_Class を返そうとしても、シンボルが見つからないというエラーで失敗します。私はまだ何が間違っているのでしょうか?

アップデート!!!!「すべてのコード!!!」

/*
 * 
 * 
 */
package rpgmanager;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 *
 * @author Aaron
 */
public class Character {
        // The person playing the character
        private String Player_Name;
        // The PCs First Name
        private String First_Name;
        // The PCs Last Name
        private String Last_Name;
        // The PCs Race
        private enum Race {
            Dwarf, Halfling, Elf, Human, Gnome, HalfOrc, HalfElf
        };
        // The PCs base class
        private enum Base_Class {
            Barbarian, Bard, Cleric, Druid, Fighter, Monk, 
            Paladin, Ranger, Rogue, Sorcerer, Wizard
        };
        private Base_Class Player_Class;
        // Base Class Choice for switch case
        private int Base_Class_Choice = 0;
        // The PCs Height
        private int Height = 0;
        // The PCs Weight
        private int Weight = 0;
        // The PCs Age
        private int Age = 0;
        // The PCs base level
        private int Base_Level;
        // Sets up the scanner for inputs
        Scanner user_input = new Scanner(System.in);
        // Create a Buffered reader for input
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // This instantiates a new character
        public Character() {

        }

        /**
         * Sets the PCs first name
         */
        public void setPlayerName() {
            System.out.print("Players Name: ");
            try {
                Player_Name = reader.readLine(); 
            } catch (IOException ioe) {
                System.out.println("The Player Name input failed to set.");
                System.out.println(ioe);
            }
        }

        /**
         * Sets the PCs first name
         */
        public void setFirstName() {
            System.out.print("First Name: ");
            try {
                First_Name = reader.readLine();
            } catch (IOException ioe) {
                System.out.println("The PCs First Name input failed to set.");
                System.out.println(ioe);
            }
        }

        /**
         * Sets the PCs last name
         */
        public void setLastName() {
            System.out.print("Last Name: ");
            try {
                Last_Name = reader.readLine();
            } catch (IOException ioe) {
                System.out.println("The PCs Last Name input failed to set.");
                System.out.println(ioe);
            }
        }

        /**
         * Sets the height of the PC
         */
        public void setHeight() {
            do {
                System.out.print("Height (inches): ");
                try {
                    Height = user_input.nextInt();
                    if(Height < 1) {
                        System.out.println("Not a valid number.");
                    }
                } catch(Exception e) {
                    System.out.println("You must use a number greater than 0!");
                    user_input.next();
                }
            } while (Height < 1);
        }

        /**
         * Sets the weight of the PC
         */
        public void setWeight() {
            do {
                System.out.print("Weight (pounds): ");
                try {
                    Weight = user_input.nextInt();
                    if (Weight < 1) {
                        System.out.println("Not a valid number.");
                    }
                } catch (Exception e) {
                    System.out.println("You must use a number greater than 0!");
                    user_input.next();
                }
            } while (Weight < 1);
        }

        /**
         * Sets the age of the PC
         */
        public void setAge() {
            do {
                System.out.print("Age (whole years): ");
                try {
                    Age = user_input.nextInt();
                    if (Age < 1) {
                        System.out.println("Not a valid number.");
                    }
                } catch (Exception e) {
                    System.out.println("You must use a number greater than 0!");
                    user_input.next();
                }
            } while (Age < 1);
        }

        /**
         * Sets the base level of the PC
         */
        public void setBaseLevel() {
            do {
                System.out.print("Starting Level: ");
                try {
                    Base_Level = user_input.nextInt();
                    if (Base_Level < 1 || Base_Level > 25) {
                        System.out.println("Not a valid number.");
                    }
                } catch (Exception e) {
                    System.out.println("You must choose a valid level between 1 and 25!");
                    user_input.next();
                }
            } while (Base_Level < 1 || Base_Level > 25);
        }

        public void setBaseClass() {
            do {
                System.out.println("Available Classes: ");
                System.out.println("Please select a cooresponding number for class.");
                int i = 1;
                for(Base_Class value: Base_Class.values()){
                    System.out.println(i+": "+value.name());
                    i++;
                }
                try {
                    Base_Class_Choice = user_input.nextInt();
                    Base_Class Player_Class = Base_Class.values()[Base_Class_Choice - 1];
                } catch (Exception e) {
                    System.out.println("You must choose a valid class. Try numbers.");
                    user_input.next();
                }
            } while (Base_Class_Choice == 0);
        }

        /**
        * Gets the PCs first name
        * @return 
        */
        public String getFirstName() {
            return First_Name;
        }

        /**
         * Gets the PCs last name
         * @return 
         */
        public String getLastName() {
            return Last_Name;
        }

        /**
         * Gets the PCs height
         * @return 
         */
        public int getHeight() {
            return Height;
        }

        /**
         * Gets the PCs age
         * @return 
         */
        public int getAge() {
            return Age;
        }

        /**
         * Gets the PCs base level (1-25)
         * @return
         */
        public int getBaseLevel() {
            return Base_Level;
        }

        /**
         * Gets the PCs player name
         * @return
         */
        public String getPlayerName() {
            return Player_Name;
        }

        /**
         *
         * @return
         */
        public Base_Class getPlayerClass() {
            return Player_Class;
        }

        /**
         *  Creates a new character
         */
        public void createCharacterNew() {
            this.setPlayerName();
            this.setFirstName();
            this.setLastName();
            this.setHeight();
            this.setWeight();
            this.setAge();
            this.setBaseLevel();
            this.setBaseClass();
        }
}
4

4 に答える 4

2

異なるスコープ (つまり 2 つの関数) でその変数を宣言してアクセスしている限り、失敗し続けます。あるスコープで割り当て、別のスコープでアクセスする場合は、ラッピング クラスのメンバー変数にする必要があります。

ユーザー入力に列挙型を割り当てたくないため、ユーザー入力に基づいて適切な列挙型を選択したいため、質問は誤解を招きます。

元の問題の簡単なケースを ideone で提供します。ここで、私が話していることを実際に確認できます。

import java.util.Scanner;

class Player {
    private BaseClass playerClass;

    public void setPlayerClass() {
        Scanner in = new Scanner(System.in);
        StringBuilder output = new StringBuilder("Select a class:\n");
        BaseClass[] classes = BaseClass.values();
        for (int i = 0, len = classes.length; i < len; i++) {
            output.append("\t").append(i + 1).append(": ")
                  .append(classes[i].name()).append("\n");
        }
        output.append(" >> ");
        System.out.print(output.toString());
        int playerChoice = in.nextInt();
        in.close();
        switch (playerChoice) {
            case 1:
                playerClass = BaseClass.Barbarian;
                break;
            case 2:
                playerClass = BaseClass.Cleric;
                break;
            case 3:
                playerClass = BaseClass.Mage;
                break;
            case 4:
                playerClass = BaseClass.Fighter;
                break;
        }
    }

    public BaseClass getPlayerClass() {
        return playerClass;
    }

    public static void main(String[] args) {
        Player p = new Player();
        p.setPlayerClass();
        System.out.println("Player selected: " + p.getPlayerClass().name());
    }
}

enum BaseClass {
    Barbarian, Cleric, Mage, Fighter;
}

http://ideone.com/IZNykB

注:さらに明確にするために、Java で変数のスコープを設定する場所に注意する必要があります。変数が定義されたコードのブロックに属するスコープ。{}中括弧で囲まれたコードであるコードのブロック。最初にスイッチ内で宣言しPlayer_Classたため、スイッチのスコープに属し、スイッチの外には存在しなかったため、アクセスしたメソッドが必要なものを返さなかったのはなぜですか。の宣言をPlayer_Classスイッチの外に移動しましたが、まだsetPlayerClassすべての内部でそれを関数全体にスコープしていましたが、setPlayerClassスコープsetPlayerClassgetPlayerClass共有していないため、探していた結果が得られませんでした。

上記の例では、変数がクラスの作成したインスタンスにスコープされているため、クラス内の複数のポイントから割り当てて返すことができるPlayerという名前のクラスでプライベートメンバー変数を使用してこれを解決しました。playerClassPlayer

于 2013-04-30T15:43:57.160 に答える
1

これは機能するはずです(スイッチブロックは必要ありません):

Player_Class = Base_Class.values()[Base_Class_Choice - 1];
于 2013-04-30T14:35:12.833 に答える
0

これは s の使い方ではありませんenum。列挙型は固定された状態のないオブジェクトであり、インスタンス化することはありません (これが、コンストラクターがプライベートである理由です。コンパイラーがそれを行うためです。

また、余談ですが、クラス名には大文字を使用し、フィールドとメソッドには小文字を使用してください。また、underscore_case ではなく camelCase を使用してください。これは、ほとんどすべての Java プログラマーが行う方法であり、その方法で行うと、他のコードが読みやすくなり、他の人があなたのコードを読みやすくなります。

BaseClass を別のファイルに入れて、どこでも使用できるようにします。次に、便利values()な配列を使用します。これが私がそれを行う方法です:

BaseClass.java

public enum BaseClass {
    BAR ("Barbarian"), BRD ("Bard"), CLR ("Cleric"), DRU ("Druid"),
    FGT ("Fighter"), MON ("Monk"), PAL ("Paladin"), RAN ("Ranger"),
    ROG ("Rogue"), SOR ("Sorceror"), WIZ ("Wizard");

    private String fullName;
    private BaseClass(String fullName) { this.fullName = fullName; }

    public String getFullName() {
        return fullName;
    }
    // Here you can add other useful methods
};

Player.java

// snip

public void setBaseClass() {
    do {
        System.out.println("Available Classes: ");
        System.out.println("Please select a cooresponding number for class.");
        int i = 1;
        for(BaseClass value: BaseClass.values()){
            System.out.println(i+": "+value.name());
            i++;
        }
        try {
            int baseClassChoice = user_input.nextInt();
            if (i < 1 || i >= BaseClass.values()) {
                System.out.println("That is not a valid choice. Please try again");
                continue;
            }
            Player_Class = BaseClass.values()[i-1];
        } catch (Exception e) {
            System.out.println("You must choose a valid class. Try numbers.");
            user_input.next();
        }
    } while (Base_Class_Choice == 0);
}
于 2013-04-30T14:42:40.873 に答える
0

以下のサンプル コードのようなものを使用できます。私の環境では問題なく動作するので、試してみてください。

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

enum BaseClass {
    Barbarian(1), Bard(2), Cleric(3), Druid(4), Fighter(5), Monk(6), Paladin(7), Ranger(8), Rogue(9), Sorcerer(10), Wizard(11);

    private int numericValue;
    private static final Map<Integer, BaseClass> intToEnum = new HashMap<Integer, BaseClass>();
    static {
        for (BaseClass type : values()) {
            intToEnum.put(type.getNumericValue(), type);
        }
    }

    private BaseClass(int numericValue)
    {
        this.numericValue = numericValue;
    }

    public int getNumericValue()
    {
        return this.numericValue;
    }

    public static BaseClass fromInteger(int numericValue)
    {
        return intToEnum.get(numericValue);
    }
};

public class Game {
    public static void main(String[] args) throws IOException
    {
        Scanner input = new Scanner(System.in);
        BaseClass choice;

        do {
            System.out.println("Available Classes: ");
            System.out.println("Please select a cooresponding number for class.");

            for (Base_Class value : Base_Class.values()) {
                System.out.println(value.getNumericValue() + " : " + value);
            }

            choice = BaseClass.fromInteger(input.nextInt());
            if (choice == null) {
                System.out.println("Please select a valid class");
            }
        } while (choice == null);

        System.out.println("Successfully chosen: " + choice);
        input.close();
    }
}
于 2013-04-30T15:37:11.047 に答える