JAVA FX中的Hangman显示错误的字母

时间:2015-09-28 13:10:55

标签: java

我在JAVAFX中对我的Hangman提出了一个问题。我需要随机选择,然后从我预定义的单词组中逐字逐句猜测。

问题在于代码必须用猜测字母替换短划线,在第一次击键时非常奇怪(错误)

从本质上讲,你猜的第一个字母,由于一些未知的原因,程序总是弹出一个不同的,自己喜欢的字母或字母(它可以是2或甚至在第一次击键后显示3个字母)。猜测从第二个字母开始,但第一次击键的问题一直在发生,我需要理解为什么?

我觉得这个问题可能与我的 Java Random class 有关,因为当我不使用它时一切正常,我的意思是当我设置一个秘密字时事先用正确猜到的字母替换它的破折号,然后效果很好。

带有和不带随机的代码示例请点击此处:

  1. 随机和数组。工作错误

    public class Main extends Application {
        String wordToGuess;
        String[] allTheWords = {
            "light", "yawning", "sleeping"
        };
        String g;
        String lettersGuessed;
        Random random = new Random();
        Label label1 = new Label();
        TextField tField1 = new TextField();@Override
        public void start(Stage primaryStage) {
            wordToGuess = allTheWords[random.nextInt(allTheWords.length)];
            tField1.setOnKeyReleased(e -> {
                g = tField1.getText().toLowerCase();
                tField1.setText("");
                lettersGuessed += g;
    
    
                label1.setText(fillTheWord());
            });
            VBox root = new VBox();
            root.setAlignment(Pos.CENTER);
            root.getChildren().addAll(label1, tField1);
            Scene scene = new Scene(root, 400, 400);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
        public String fillTheWord() {
            String randomValue = "";
            for (char l: wordToGuess.toCharArray()) {
                if (lettersGuessed.contains(Character.toString(l))) {
                    randomValue += l + "";
                } else {
                    randomValue += "_ ";
                }
            };
            return randomValue;
        }
        public static void main(String[] args) {
            launch(args);
        }
    }
    
  2. 没有随机数组。工作正常:

    public class Main extends Application {
        TextField tField1 = new TextField();
        Label label1 = new Label("your word");
        String theWord = "vitamine";
        String lettersGuessed = "";
    
        public void start(Stage primaryStage) {
            TextField tField1 = new TextField();
            VBox vbox1 = new VBox(20);
            vbox1.getChildren().addAll(label1, tField1);
            tField1.setOnKeyReleased(e -> {
                String g = tField1.getText().toLowerCase();
                tField1.setText("");
                lettersGuessed += g;
                label1.setText(fillTheWord());
            });
            Scene scene1 = new Scene(vbox1, 400, 400);
            primaryStage.setScene(scene1);
            primaryStage.show();
        }
    
        public String fillTheWord() {
            String rValue = "";
            for (char l: theWord.toCharArray()) {
                if (lettersGuessed.contains(Character.toString(l))) {
                    rValue += l + "";
                } else {
                    rValue += "_ ";
                }
            }
            return rValue;
        }
        public static void main(String[] args) {
            launch(args);
        }
    }
    
  3. 任何帮助非常非常有价值

    PS:我想用屏幕截图来说明我的问题,但缺乏Stackoverflow声誉阻止了我这样做。

2 个答案:

答案 0 :(得分:1)

您需要做的就是初始化lettersGuessed变量,String lettersGuessed="";您是在第二个版本中完成的,所以它运行得很好。

我希望它有所帮助。

答案 1 :(得分:0)

将两个程序加载并运行后,这就是我发现的......

lettersGuessed变量在第一次运行时未初始化为值。因此,它会搜索单词" null"中的所有字符,以及您输入的字符;您可以通过更改" wordToGuess"的值来看到这一点。字母表作为字符串。如果你这样做,你会注意到你按下的字符,加上字母n,u和l都被选为猜测。 enter image description here

就我而言,我打了G.

要解决此问题,您只需初始化您的lettersGuessed变量...

String lettersGuessed = "";

作为旁注,我相信这是因为在空字符串对象上调用了valueOf函数。调用该函数时,它返回一个" null"的字符串。如果对象为null。在这种情况下,它返回" null" +您键入的字符,然后在fillTheWord函数中检查,填写n,u和l值。