Comment définir la valeur d'un enum par la saisie de l'utilisateur
Je suis de la tentative de créer une méthode qui me permette de renvoyer la valeur de l'enum définies par les utilisateurs de l'entrée. Je decalred un enum, alors j'essaie de régler les enum par les utilisateurs à l'entrée. Je ne peux pas utiliser mon GetPlayerClass méthode pour renvoyer la valeur de Player_Class. Quelqu'un peut-il me dire si c'est la bonne façon d'utiliser un enum pour définir une valeur ou est-il une manière que je peux permettre à l'utilisateur de sélectionner à partir de l'énumération de la liste et permettez-moi de sortir de leur choix.
Mon code est ci-dessous.
TLDR:
Je suis "enum " stupide" et ne peuvent pas comprendre comment définir la valeur d'une variable à partir d'un enum et puis renvoyer cette valeur plus tard. S'il vous plaît consulter mon code et laissez-moi savoir ce que je fais de mal.
//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;
}
J'ai mis à jour le code ci-dessous
J'essaie maintenant d'ressemble.
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();
}
Mais le retour de la Base_Class Player_Class ne fonctionne pas.
public String getPlayerClass() {
return Player_Class;
}
Quand j'essaie de revenir Player_Class il échoue avec l'erreur impossible de trouver le symbole.
Que pourrais-je encore fait de mal?
Mise à JOUR!!!! "TOUT LE CODE!!!"
/*
*
*
*/
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();
}
}
- Juste en regardant votre code, vous êtes déclarant
Player_Class
à l'intérieur d'un interrupteur, ce qui signifie que vous avez portée à l'interrupteur; cependant, vous essayez d'y accéder dans une fonction distincte qui ne fonctionnent pas car la variable n'est pas dans la portée. - Il suffit de mettre la classe de joueur en haut à l'extérieur de l'interrupteur. Merci!
Base_Class player = Base_Class.valueOf("Barbarian");
est possible aussi.- Mise à jour de question, comme il est toujours à la peine.
- est Player_Class une variable de membre? (peut-être que vous pourriez inclure plus de code)
- J'ai ajouté TOUT le code. Veuillez voir mon edit.
- vous avez déclaré une variable locale nommée Player_Class et lui a attribué. si vous utilisez un IDE, s'il vous plaît activer toutes les mises en garde (comme "l'occultation variable membre").
- J'ai juste apporté une réponse à clarifier de quoi je parlais.
Vous devez vous connecter pour publier un commentaire.
Il va continuer à échouer aussi longtemps que vous le déclarez et l'accès à cette variable dans différentes étendues (c'est à dire deux fonctions). Si vous souhaitez l'affecter dans un champ, et l'accès à un autre vous allez avoir besoin pour rendre une variable de membre d'un emballage de classe.
Votre question est trompeur, parce que vous ne voulez pas assigner un enum l'entrée des l'utilisateurs, vous voulez choisir le bon enum basée sur la saisie de l'utilisateur.
Je vous offre un cas simplifié d'origine de votre problème dans ideone où vous pouvez voir de quoi je parle dans l'action.
http://ideone.com/IZNykB
REMARQUE: Pour préciser davantage, vous avez qu'à regarder où vous la portée des variables en Java. La portée de la variable appartient au bloc de code dans lequel il a défini. Un bloc de code code enveloppé dans
{}
accolades. Depuis que vous avez déclaréPlayer_Class
à l'intérieur d'un commutateur, il appartenait à la portée de l'interrupteur et n'existe pas en dehors d'elle, c'est pourquoi la méthode consulté il ne revenait pas de ce que vous vouliez. Lorsque vous avez déplacé la déclaration dePlayer_Class
de l'interrupteur, mais toujours à l'intérieur desetPlayerClass
tout ce que vous avez a été étendue à l'ensemble de la fonctionsetPlayerClass
maissetPlayerClass
etgetPlayerClass
ne partagent pas la portée et, par conséquent, vous étiez toujours pas à obtenir le résultat que vous recherchez.Dans mon exemple ci-dessus, j'ai résolu ce problème en utilisant une variable membre privée sur le
Player
classe appeléeplayerClass
que je peux attribuer et de retour à partir de plusieurs points à l'intérieur de la classe parce que la variable est définie à l'instance, j'ai créé desPlayer
classe.cela devrait fonctionner (pas besoin d'un bloc de commutateurs):
Ce n'est pas la façon dont vous utilisez
enum
s. Les énumérations sont fixes, les apatrides, les objets que vous ne serait jamais à instancier (c'est pourquoi leurs constructeurs sont privés, parce que le compilateur le fait pour vous.Aussi, sur un côté - Utilisez des lettres majuscules pour les noms de classe, et les minuscules pour les champs et les méthodes. Aussi, l'utilisation camelCase, pas underscore_case - c'est la façon dont la plupart des tous les programmeurs Java le faire et de le faire de cette façon il sera plus facile pour vous de lire d'autres de code et pour les autres de lire votre code.
Je mettrais BaseClass dans un fichier séparé, de sorte que vous pouvez l'utiliser partout. Alors utilisez simplement la pratique
values()
tableau. Voici comment j'allais le faire:BaseClass.java
Player.java
Vous pouvez utiliser quelque chose de similaire à ci-dessous un exemple de code. il s'exécute correctement dans mon environnement, vous pouvez essayer vous-même.