Java 追加时返回null的字符串

Java 追加时返回null的字符串,java,Java,我的任务是制作一个猜字游戏。你只有5次试着猜这个词。用户一次输入一个字母,试图找出我的秘密单词“juice”,但你应该使用一个提示词构造,如果正确,每次猜测都会用正确的字母替换星号 输出应该是这样的: public class SecretWord { private String secretWord; private String hintWord; private int numberOfTurns; //Default Constructors public SecretWord()

我的任务是制作一个猜字游戏。你只有5次试着猜这个词。用户一次输入一个字母,试图找出我的秘密单词“juice”,但你应该使用一个提示词构造,如果正确,每次猜测都会用正确的字母替换星号

输出应该是这样的:

public class SecretWord {
private String secretWord;
private String hintWord;
private int numberOfTurns;

//Default Constructors
public SecretWord()
{
    this.secretWord = "juice";
    for (int i = 0; i < secretWord.length(); i++)
    {
        this.hintWord+="*";
    }
    this.numberOfTurns = 0;
}
//Accessors
public String getSecretWord()
{
    return this.secretWord;
}
public String getHintWord()
{
    return this.hintWord;
}
public int getNumberOfTurns()
{
    return this.numberOfTurns;
}
//Mutators
public void setSecretWord ()
{
    this.secretWord = "juice";
}
public void setHintWord ()
{
    char[] correctLetters = new char[secretWord.length()];
    for (int i = 0; i<secretWord.length();i++)
    {
        hintWord+="*";
        correctLetters[i] += '*';
    }
}
public void setNumberOfTurns (int i)
{
    this.numberOfTurns = 5;
}
//Methods
public void guessLetter(char guess)
{
    String tempHintWord="";
    for (int i = 0; i < secretWord.length(); i++)
    {
        if (secretWord.charAt(i) == guess)
        {
            tempHintWord += guess;
        }
        else
        {
            tempHintWord += hintWord.charAt(i);
        }
    }
    hintWord = tempHintWord;
}
public class SecretWordGame {

//Constant for number of tries
public static final int NUM_TRIES = 5;

public static void main (String[] args)
{
    Scanner keyboard = new Scanner(System.in);

    //Starts game
    boolean quit = false;
    while (quit == false)

    {
        System.out.println("Welcome to the word guessing game! You have " +
                +NUM_TRIES+" tries to guess the secret word!");

                SecretWord myWord = new SecretWord();
        System.out.println("The current hint is \n"+myWord.getHintWord());

        while (myWord.getNumberOfTurns() <NUM_TRIES)
        {
            System.out.println("Guess a lowercase letter");

            //Gets the first letter of what is entered

            char guess = keyboard.nextLine().charAt(0);

            //Updates the hint by calling guess letter method

            myWord.guessLetter(guess);

            System.out.println(myWord.getHintWord());

            System.out.println("Guess the secret word");

            String myGuess = keyboard.nextLine();
            //Checks correct guess
            if (myGuess.equals(myWord.getSecretWord()))
            {
                System.out.println("You win!");
                break;
            }
            else
            {
                System.out.println("Keep trying!");
            }

            myWord.setNumberOfTurns(myWord.getNumberOfTurns()+1);
        }
        //Prompts user to play again

        System.out.println("Game over! Try again?");

        String userInput = keyboard.nextLine();
        if(userInput.equalsIgnoreCase("no"))
        {
            quit = true;
        }
        else
        {
            System.out.println("Let's go again!");
        }
    }
    System.out.println("Goodbye!");
}
欢迎来到猜字游戏!你有5次机会猜出这个秘密单词! 当前的提示是


猜一个小写字母

u

*u***

猜猜这个秘密

塔特尔

继续努力

猜一个小写字母

t

*u***

猜猜这个秘密

突变

继续努力

。。。持续5次,然后你要么赢,要么输

我的输出不允许您尝试猜测,提示词显然是乱七八糟的,因为它在5个星号的前面是空的。。我不知道如何修复它。

当前的提示是

空的*****

猜一个小写字母

j

七月*

猜猜这个秘密

朱特

继续努力

游戏结束!再试一次

这是我的班级:

public class SecretWord {
private String secretWord;
private String hintWord;
private int numberOfTurns;

//Default Constructors
public SecretWord()
{
    this.secretWord = "juice";
    for (int i = 0; i < secretWord.length(); i++)
    {
        this.hintWord+="*";
    }
    this.numberOfTurns = 0;
}
//Accessors
public String getSecretWord()
{
    return this.secretWord;
}
public String getHintWord()
{
    return this.hintWord;
}
public int getNumberOfTurns()
{
    return this.numberOfTurns;
}
//Mutators
public void setSecretWord ()
{
    this.secretWord = "juice";
}
public void setHintWord ()
{
    char[] correctLetters = new char[secretWord.length()];
    for (int i = 0; i<secretWord.length();i++)
    {
        hintWord+="*";
        correctLetters[i] += '*';
    }
}
public void setNumberOfTurns (int i)
{
    this.numberOfTurns = 5;
}
//Methods
public void guessLetter(char guess)
{
    String tempHintWord="";
    for (int i = 0; i < secretWord.length(); i++)
    {
        if (secretWord.charAt(i) == guess)
        {
            tempHintWord += guess;
        }
        else
        {
            tempHintWord += hintWord.charAt(i);
        }
    }
    hintWord = tempHintWord;
}
public class SecretWordGame {

//Constant for number of tries
public static final int NUM_TRIES = 5;

public static void main (String[] args)
{
    Scanner keyboard = new Scanner(System.in);

    //Starts game
    boolean quit = false;
    while (quit == false)

    {
        System.out.println("Welcome to the word guessing game! You have " +
                +NUM_TRIES+" tries to guess the secret word!");

                SecretWord myWord = new SecretWord();
        System.out.println("The current hint is \n"+myWord.getHintWord());

        while (myWord.getNumberOfTurns() <NUM_TRIES)
        {
            System.out.println("Guess a lowercase letter");

            //Gets the first letter of what is entered

            char guess = keyboard.nextLine().charAt(0);

            //Updates the hint by calling guess letter method

            myWord.guessLetter(guess);

            System.out.println(myWord.getHintWord());

            System.out.println("Guess the secret word");

            String myGuess = keyboard.nextLine();
            //Checks correct guess
            if (myGuess.equals(myWord.getSecretWord()))
            {
                System.out.println("You win!");
                break;
            }
            else
            {
                System.out.println("Keep trying!");
            }

            myWord.setNumberOfTurns(myWord.getNumberOfTurns()+1);
        }
        //Prompts user to play again

        System.out.println("Game over! Try again?");

        String userInput = keyboard.nextLine();
        if(userInput.equalsIgnoreCase("no"))
        {
            quit = true;
        }
        else
        {
            System.out.println("Let's go again!");
        }
    }
    System.out.println("Goodbye!");
}
公共类SecretWord{
私密字串;
私人字符串hintWord;
私人整数匝数;
//默认构造函数
公开密文()
{
this.secretWord=“juice”;
for(int i=0;ifor(int i=0;i
SecretWord
hintword
默认初始化为
null
。因此,当您向其追加
+=“*”
时,它会将当前值转换为
“null”
,然后添加
“*”
。如果您在声明它的
位置初始化hintword
它会解决这个问题。

SecretWord
类中,您不会初始化
hintWord


因此,当执行
hintWord+=“*”;
时,hintWord为
null
,然后隐式转换为字符串
“null”
,与
“*”
*”

连接,您应该在构造函数中使用它之前设置hintWord。将其设置为“”应该可以工作。hintWord不是
null
它的
“null*****”
正如您对代码的期望。如果您想知道原因,请在setHintWord()上放置一个断点方法并逐步执行代码。@PeterLawrey你知道为什么它不会像预期的那样在5个字母的猜测后停止吗?你总是设置
this.numberOfTurns=5;
,然后忽略传入的值。同样,这是你可以在调试器中看到的。你知道为什么它在5个字母的猜测后不会像预期的那样停止吗etNumberOfTurns忽略其参数
i
,而是始终将变量的值设置为5。它在while循环结束时被调用。这会导致while条件的下一次检查返回false,循环退出。你知道为什么它不会像预期的那样在5个字母的猜测后停止吗?@ChrisM,
setNumberOfTurns(inti)
不会将
numberOfTurns`设置为
i
,并且NUM\u TRIES被声明为final。因此,任何一个都不会更改值。