当前位置: 首页 > 知识库问答 >
问题:

Java Hangman-错误检查

杜俊远
2023-03-14

对于我的刽子手游戏,我想有一堆错误信息来检查输入的不止一个字母,猜测同一个字母两次,等等。到目前为止我的完整代码:

    import java.awt.Color;
    import java.awt.Font;
    import java.util.Random;
    import javax.swing.JOptionPane;
    import javax.swing.UIManager;
    import javax.swing.plaf.FontUIResource;

    public class MainFrame extends javax.swing.JFrame {

        public MainFrame() {
            initComponents();
        }
        //declare variables
        static String secretWord = "";
        double result = 0;
        StringBuilder mainWord = new StringBuilder();
        StringBuilder xletters = new StringBuilder(); // letters guessed
        String[] words = {"technology", "computer", "camera", "graphic", "digital", "media", "technician",
            "photography", "troubleshoot", "pixels", "application", "download"};
        Random r = new Random();
        int randValue = r.nextInt(12);
        String guessWord = words[randValue];
        int errors = 0;
        public static int wins = 0, losses = 0;
        String foundWord = null;
        private void GuessButtonActionPerformed(java.awt.event.ActionEvent evt)         {                                            
            String strGuess = GuessText.getText(); //user input           
            String letter = strGuess;
            xletters.append(strGuess.toUpperCase());
            String GuessedLetters = xletters.toString();

            try {
    //replace underscores with letters as they are guessed
                do {
                    for (int i = 0; i < 1; i++) {
                        secretWord = secretWord + letter.charAt(0);
                        foundWord = words[randValue].replaceAll("[^" + secretWord + "]", "_ ");
                        //if user entered more than one letter
                        if (strGuess.length() > 1) {
                            JOptionPane.showMessageDialog(null, "Only one letter at a time!");
                            xletters.append("");
                            GuessedLetters = null;
                            GuessText.setText(null);
                            GuessText.requestFocusInWindow();
                        } //if letter isn't in word
                        else if (guessWord.indexOf(strGuess) == -1) {
                            JOptionPane.showMessageDialog(null, "Sorry, that wasn't in the word.");
                            errors++;
                            if (errors == 1) {
                                Hangman0.setVisible(false);
                            }
                            if (errors == 2) {
                                Hangman1.setVisible(false);
                            }
                            if (errors == 3) {
                                Hangman2.setVisible(false);
                            }
                            if (errors == 4) {
                                Hangman3.setVisible(false);
                            }
                            if (errors == 5) {
                                Hangman4.setVisible(false);
                            }
                            if (errors == 6) {
                                Hangman5.setVisible(false);
                            }
                            if (errors == 7) {
                                Hangman6.setVisible(false);
                            }
                            if (errors == 8) {
                                Hangman7.setVisible(false);
                            }
                            if (errors == 9) {
                                Hangman8.setVisible(false);
                            }
                            if (errors == 10) {
                                Hangman9.setVisible(false);
                                JOptionPane.showMessageDialog(null, "You lost! The word was: " + guessWord);
                                losses++;
                                DirectionsFrame DFrame = new DirectionsFrame();
                                DFrame.setVisible(true);
                                setVisible(false);
                                MainFrame MFrame = new MainFrame();
                                MFrame.dispose();
                                xletters.delete(0, 100);
                                secretWord = "";
                                foundWord = null;
                                strGuess = null;
                                String strLosses = Integer.toString(losses);
                                String strWin = Integer.toString(wins);
                                DirectionsFrame.WinsLabel.setText(strWin);
                                DirectionsFrame.LossesLabel.setText(strLosses);
                            }
                }
            }
                    WordLabel.setText(foundWord.toUpperCase());
                    GuessedLabel.setText(GuessedLetters);
                    GuessText.setText(null);
                    GuessText.requestFocusInWindow();
                } while (foundWord == null);
                if (foundWord.equalsIgnoreCase(guessWord)) {
                    JOptionPane.showMessageDialog(null, "Yay!");
                    wins++;
                    DirectionsFrame DFrame = new DirectionsFrame();
                    DFrame.setVisible(true);
                    setVisible(false);
                    MainFrame MFrame = new MainFrame();
                    MFrame.dispose();
                    xletters.delete(0, 100);
                    secretWord = "";
                    foundWord = null;
                    String strWin = Integer.toString(wins);
                    String strLosses = Integer.toString(losses);
                    DirectionsFrame.WinsLabel.setText(strWin);
                    DirectionsFrame.LossesLabel.setText(strLosses);
                }
            } catch (StringIndexOutOfBoundsException e) {
                JOptionPane.showMessageDialog(null, "Please enter a letter.");
                GuessedLabel.setText(GuessedLetters);
                GuessText.setText(null);
                GuessText.requestFocusInWindow();
            }
        }                                           


        private void GetButtonActionPerformed(java.awt.event.ActionEvent evt) {
            //print out underscores to begin game
            for (int i = 0; i < guessWord.length(); i++) {
                mainWord.append("_ ");
            }
            String SetMain = mainWord.toString();
            mainWord.append(secretWord);
            WordLabel.setText(SetMain);
            GuessButton.setEnabled(true);
            GetButton.setEnabled(false);
        }

我遇到的最大问题是检查用户是否输入了相同的字母两次。所以你只能猜一次字母表中的一个字母。此外,它检查用户输入的多个字母是否有错误的代码,我相信,因为如果我不希望它将这些字母添加到猜测字母框中,它会以任何方式添加这些字母。(即,用户猜测“hf”,在猜测的字母中出现“hf”,在这里它应该是空的)

我觉得答案在于indexOf()方法,但我不完全确定if条件会说什么。。。

我正在使用Netbean IDE 7.2编译我的代码。请帮帮忙!谢谢。

共有3个答案

颜鸿云
2023-03-14

我想为你的信件检查做的是:用用过的信件列一个清单。每次玩家尝试一个字母时,你都会用for循环检查该字母是否在你的列表中。如果不是,则将其添加到列表中。这是一个例子:

List<String> usedletters = new List<String>(26);

boolean checkLetterUsed(String input){
    boolean tempvariable = false;
    for(String letter: usedletters){
        if(letter==input){
            tempvariable = true;
        }
    }
    if(tempvariable){
        return true;
    }else{
        usedletters.add(input);
        return false;
    }
}
越学义
2023-03-14

为了查看他们是否已经猜到了什么,您可以先猜一个空字符串,当他们猜到时,您可以将该字母添加到字符串中:

String guesses = "";
...
guesses+= letter;

看起来您已经在做类似的事情了,但请确保只添加字母,而不是为其创建新字符串。这样,您每次都可以检查猜测字符串是否已经包含新猜测的字母(if(guesss.contains(letter))。

另外,我不知道为什么你有一个只有一个迭代的for循环,但是在多字母的情况下,你可以尝试打破循环,或者如果你失败了,继续

颜高朗
2023-03-14

如果您想知道某件东西是否已经被使用过,则会出现一个Set。例如,在刽子手游戏中使用字母时,您需要设置

Set<String> lettersUsed = new HashSet<String>();

如果您想知道是否已经选择了某些内容:

String inputLetter = "Z";  // test for the letter Z

if (!lettersUsed.contains(inputLetter)) {
    lettersUsed.add(inputLetter);

    // process letter in word
} else {
    // letter has already been used!
}

如果只允许初始设置的特定字母集,请执行以下操作:

if (lettersAllowed.contains(inputLetter)) {
   lettersAllowed.remove(inputLetter);

   // process letter in word
} else {
   // letter is not allowed (anymore)
}

 类似资料:
  • 我几乎完成了一个基本的刽子手游戏,但我在课堂上遇到了“makeGuess”方法的困难。我试图测试用户输入(他们的一个字符猜测)与秘密单词,并更新伪装的单词,如果他们的猜测是正确的或不正确的。任何正确方向的建议或指点都将不胜感激。每次运行时都会出现以下错误: 这是刽子手课: } 这是我的演示课 }

  • 问题内容: 假设您有一个像这样的函数: 而您通常以这种方式使用它: 在这里检查错误的惯用方式是什么?更具体的问题: 如果我们可以假设永远是零,反之亦然? 我们首先要检查什么:(无)或(确认不是零)? 在某些情况下可以是真的吗? 谢谢! 问题答案: 比较 《错误处理编程指南》中从方法返回的处理错误对象: 重要提示: 方法的返回值指示成功或失败。尽管在方法可通过直接返回nil或NO指示失败的情况下,保

  • 我为跳棋游戏创建了两个类。一个是木板,另一个是碎片。我所面临的困难是,对于这些碎片,我似乎无法让它们移动,也无法让它们正确地停留在那个位置,事实上,由于我不了解这里到底出了什么问题,我无法再前进了。有人能纠正我做错了什么吗。 这是拼图课

  • My mechanic told me, I couldn’t repair your brakes, so I made your horn louder. — Steven Wright 通常,当出现问题时,我们会在继续运行前先停止它并修复错误。然而, 当以守护进程模式运行时,Puppet 会忽略配置清单的编译错误, 仅从缓存中应用最近一次已知可运行的版本。这个行为是由 usecacheonf

  • 问题内容: 调用Web服务时,我使用以下方法检查超时,但是我想专门检查是否返回超时错误。我该怎么做:S 我有这个: 问题答案: 作为go1.6的,从超时所有错误应符合与正确设置。您需要检查的只是: 在旧版本中,通过http包检查超时更为困难。 如果您在基础连接上设置了“截止日期”,则可以使用Timeout()获得一个。 您可以获得一个(显然不会导出)实现该接口的文件。 如果url包内有问题(初始连

  • 问题内容: 我想检查子流程是否成功完成执行或失败。目前,我已经提出了一个解决方案,但是我不确定它是否正确和可靠。是否保证每个进程仅将错误输出到stderr : 注意:我对仅重定向/打印输出不感兴趣。我已经知道该怎么做。 或者: 和: 问题答案: 您需要对流程的输出做任何事情吗? 该方法在这里可能有用。在这里查看python文档:https : //docs.python.org/2/library