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

刽子手密码卡在三个不同的问题上

冷越泽
2023-03-14

我想做一个刽子手游戏。每转一圈,用户猜一个字母。如果他们猜对了,他们可以再猜一次。否则,它们剩余的可用猜测将减少1,猜测的字母将放入一个数组中。

当用户点击零剩余猜测时,程序应该询问他们是否想再次玩。如果他们回答“是”,则应重新启动游戏;如果他们回答“否”,则程序结束。

我遇到的问题是用于猜测的数组,以及重新启动游戏。

此外,程序启动时每隔一段时间都会出错。错误是

线程“main”java中出现异常。lang.NullPointerHangman 1处的异常。main(Hangman1.java:27)

尝试重新启动游戏时出现的错误是

线程“main”java中出现异常。lang.NullPointerHangman 1处的异常。main(Hangman1.java:101)

searchArray是一种方法,该方法假定获取字符数组的位置,并将其复制到星号数组中,然后返回星号数组,但似乎不起作用。运行debug看起来导致程序崩溃的问题是word有时会以null结尾,但只是有时候,我真的不知道为什么

import java.util.*;
import java.io.*;

public class Hangman1 {

    static Scanner keyboard = new Scanner(System.in);
    public static final int MAXSIZE = 15000;
    public static final int NUM_GUESS = 8;
    public static final int WORD_LENGTH = 20;

    public static void main(String[] args) {
        int random = pickrandom(MAXSIZE); 

        try {
            // Set up connection to the input file
            Scanner input = new Scanner(new FileReader("dictionary.txt"));

            instructions();
            keyboard.nextLine(); 
            clearScreen();

            String word = randomWord(input, random);

            System.out.println(word);
            String[] charArray = word.split("");

            System.out.print("\n");
            String[] asterisk = asteriskLine(word);

            String decision = "Y"; 
            //decision = keyboard.nextLine().toUpperCase();

            System.out.println("Word to guess :");
            for (int count = 0; count < word.length(); count++) { 
                System.out.print(asterisk[count]); 
            }
            System.out.print("\n");

            int tries = NUM_GUESS; 

            System.out.println("Enter a letter to guess or 9 to quit");
            String guess = keyboard.next();
            String[] wrongGuesses = new String [NUM_GUESS];

            int guessMade = 0;
            do {
                //System.out.println(tries); 
                while (!(guess.equals("9")) && !(guess.equals(word))  && (tries > 0))
                {
                    String letter = guess.substring(0,1); 

                    if (word.indexOf(letter) < 0) {
                        clearScreen();

                        tries--;

                        wrongGuesses = wrongGuesses(guessMade, wrongGuesses, letter);

                        printArray(asterisk, charArray, word, tries, wrongGuesses, guessMade);
                        guessMade++;
                        guess = keyboard.next();
                    }
                    else {  
                        clearScreen();
                        asterisk = searchArray(charArray, asterisk, guessMade, letter, word);
                        printArray(asterisk, charArray, word, tries, wrongGuesses, guessMade); 
                        guess = keyboard.next();
                    }

                    if (charArray == asterisk) {
                        System.out.println("You won!");
                    }

                    if (tries == 0) {
                        System.out.println("You have no more guesses left"); 
                    }

                }
                if (guess.equals("9")) {
                    System.out.println("Thanks for playing");
                }

                System.out.println("Play again? Y/N");

                decision = keyboard.next().toUpperCase();
                if (decision.equals("Y")) {
                    random = pickrandom(MAXSIZE);
                    word = randomWord(input, random);
                    charArray = word.split("");

                    System.out.print("\n");
                    asterisk = asteriskLine(word);
                    guess = keyboard.next();
                }


            } while (decision.equals("Y"));
            //System.out.println("Play again? Y/N");
            //decision = keyboard.nextLine().toUpperCase();
        }

        catch (FileNotFoundException e) {
            System.out.println("There was an error opening one of the files.");
        }
    }

    //Clears screen after introduction 
    private static void clearScreen() {
        for (int blanks = 0; blanks < 80; blanks++) {
            System.out.println();
        }
    }

    // This method returns a randomly selected integer
    // between 0 and count-1
    public static int pickrandom(int count) {
        Random generator = new Random();
        return generator.nextInt(count);
    }

    // Places asterisks in place of the letters in the word
    // Parameter is the string word. it holds mystery word

    public static String[] asteriskLine(String word) {
        int i;
        String[] asteriskArray = new String [word.length()];
        for (i = 0; i < word.length(); i++) {

            asteriskArray[i] = "* ";
        }
        return asteriskArray;
    }

    public static void instructions() {
        System.out.println("              H A N G M A N. "
            + "\n This is a word guessing game. "
            + "\n A word will be selected at random and kept hidden. You will try to figure out the secret word by"
            + "\n guessing letters which you think are in the word. "
            + "\n You will guess one letter at a time. "
            + "\n If the letter you guess is correct, the position(s) of the letter in the secret word will be shown. "
            + "\n You will be allowed "
            + NUM_GUESS
            + " wrong guesses  If you guess incorrectly "
            + NUM_GUESS
            + " times, you lose the game. "
            + "\n If you guess all of the letters in the word, you win."
            + "\n\n Press enter to continue ");
    }

    public static String randomWord(Scanner input, int random) {
        String[] dictionaryWords = new String [MAXSIZE];
        int usedsize = 0;
        while (usedsize < MAXSIZE && input.hasNextLine()) {
            dictionaryWords[usedsize] = input.nextLine();
            usedsize++; 
        }

        String word = dictionaryWords[random];
        return word;
    }

    //Replaces correct guess in blanks 
    public static String correctWord(String guess, String word, String asterisk, char letter) { 
        return null;
    }

    public static void printArray(String[] asterisk, String[] charArray, String word, int tries, String[] wrongGuesses, int guessMade) {
        System.out.println("Word to guess");
        for (int count = 0; count < word.length(); count++) { 
            System.out.print(asterisk[count]); 
        }

        System.out.println("\nGuesses remaining: " + tries);

        System.out.print("Incorrect letters tried: ");
        for (int count = 0; count <= guessMade; count++) { 
            System.out.print(wrongGuesses[count] + " "); 
        }
        System.out.println("\nEnter a letter to guess or 9 to quit");

    }

    public static String[] wrongGuesses(int guessMade, String [] wrongGuesses, String letter) {
        wrongGuesses[guessMade] = letter;
        return wrongGuesses;
    }

    public static String[] searchArray(String[] charArray, String[] asterisk, int guessMade, String letter, String word) {
        int[] a = new int[word.length()];
        for (int count = 0; count < word.length(); count++) { 
            if (letter == charArray[count]) {
                asterisk[count] = charArray[count]; 
            }
        }
        return asterisk;

    }
}

共有2个答案

裴意
2023-03-14

运行调试似乎导致程序崩溃的问题是字有时会以空告终,但只是有时,我真的不知道为什么

 public static String randomWord(Scanner input, int random) {
        String[] dictionaryWords = new String [MAXSIZE];
        int usedsize = 0;
        while (usedsize < MAXSIZE && input.hasNextLine()) {
            dictionaryWords[usedsize] = input.nextLine();
            usedsize++; 
        }

        String word = dictionaryWords[random];
        return word;
    }

有时随机会大于usedsize。所以你需要把这条线从循环之外移动

 int random = pickrandom(MAXSIZE); 

进此函数,并具有最大be usedsize(或usedsize-1)。

通过编写单元测试,您可以保护自己不受此错误的影响,并确定您应该使用usedsize还是usedsize-1。查看Junit教程。

在junit测试中,调用randomword并为其传递一个非常高的random值。然后

assert(word!= null)

当随机长度超过字典长度时,单词为空。

傅翰池
2023-03-14

您需要做的一件事是将所有单词一次且仅一次读取,并将它们全部存储到ArrayList中。您当前的代码尝试重新使用已使用的扫描仪对象,但这将失败。而是从ArrayList中获取随机单词

 类似资料:
  • 我已经被这段代码困扰了一段时间,非常感谢您的帮助。因此,基本上我的刽子手代码运行良好,但控制台中的显示,破折号应该反映哪些字母猜对了,哪些字母仍然需要猜对,这是完全错误的。我将在这里发布我的代码。由于时间很长,我将只发布相关的方法。我觉得问题似乎出在显示数组列表上,我无法持续更新它。

  • 在我的游戏中出现的问题是,当我试图在游戏中插入单词时,它不显示字母,它应该在正确的时候显示字母,如果它是错误的,它应该通过增加刽子手的一部分来惩罚我。 我创建了惩罚函数和函数,当它正确时显示用户输入的字母,请帮助!! 这是我的代码:http://pastebin.com/du98i88G 我认为在pygame中的函数` 中可能存在问题,而不是gameQuit:for event。事件get():i

  • 我被问题的结束函数部分卡住了,arr[start]/arr[end]以及我没能理解代码。问题如下: 给定一个大小为N的未排序数组A,只包含非负整数,求一个连续的子数组,该子数组加到给定的数组S上。 您不需要读取、输入或打印任何内容。任务是完成函数subarraySum(),它将arr、N和S作为输入参数,并返回一个列表,其中包含从左边开始的第一个子数组的开始和结束位置,其中sum等于S。列表中的两

  • 嗨,我是编程新手,我们的任务是制作一个刽子手游戏。现在我面临的问题是猜测。程序猜对了一切,并且工作正常。虽然它不会打印出中的字母,或者它会打印出1个字母,但当我猜正确时,上一个字母会被覆盖。 那么,有谁能伸出援助之手呢? 这是我的检查代码: }

  • 我是java新手,我正在尝试创建一个基本的刽子手游戏,我已经为这一轮创建了方法,但我一直在创建一个布尔值,该值将使游戏进入下一轮(如果玩家输入了错误的字母,他将失去一次猜测字母的尝试;他可能只会出错10次;如果猜测,他将继续游戏)。我的代码到目前为止,我甚至尝试通过if/else语句排除布尔值,但对我来说它似乎非常愚蠢。任何帮助都是有用的。非常感谢。

  • 我目前正在用java编写一个hangman控制台游戏,到目前为止还没有遇到任何问题。 我现在遇到了一个似乎无法解决的问题。 我有不同单词的数组容易,中等和困难,并根据选择的难度随机从他们得到一个单词。然后我把这个单词转换成*'s,这样玩家就看不到角色了。 然后向用户索要信件,程序会通知用户信件是对还是错。但问题是,如果*在单词中,我似乎无法将*改为字母。例如,如果单词是“蜜蜂”,玩家选择了b,我想