无法将 java hangman 执行到 return 带有正确字母的空格(例如“_ _ r _”)

Trouble implementing java hangman to return blanks with correct letters (e.g. "_ _ r _")

我一直在 Java BlueJ 中为一个学校项目开发一个基于文本的刽子手游戏并且大部分都成功了,但是我 运行 在这部分遇到了一些困难.

我正在努力让玩家每次猜对一个字母时,它都会打印出空格(星号)并插入正确的字母。现在,我让它打印出你猜到的字母,并用正确的空格数打印出正确的猜测。 我现在唯一的问题是它在游戏开始时打印的空白数量不正确。

如何解决这个空格问题?

import java.util.*;

public class Hangman {
    Word w = new Word();
    private String word = w.chooseWord();
    private int count = 0;
    String guess;

public String getWord() {
    String w = word;
    return w;
}

public int countLetters() {
    for (int i = 0; i < word.length(); i++) {
        if (Character.isLetter(word.charAt(i))) {
            count++;
        }
    }
    return count;
}

public String Blanks() {
    countLetters();
    int num = 0;
    String spaces = "";
    String blankSpace = "*";
    while (num < count) {
        spaces = spaces + blankSpace;
        num++;
    }
    return spaces;
}

String wordSoFar = Blanks();

public int countOccurrences() {
    int count = 0;
    for (int i = 0; i < word.length(); i++) {
        if (word.substring(i, i + 1).equals(guess)) {
            count++;
        }
    }
    return count;
}

public String wordSoFar() {
    for (int i = 0; i < word.length(); i++) {
        if (word.substring(i, i + 1).equals(guess)) {
            wordSoFar = wordSoFar.substring(0, i) + guess + wordSoFar.substring(i + 1 , wordSoFar.length());
        }
    }
    return wordSoFar;
}  

public void Guess() {
    //Removed code that draws hangman due to it making this really long

    boolean correct = false;
    Scanner scan = new Scanner(System.in);
    int numIncorrectGuesses = 0;
    int numCorrectGuesses = 0;

    while (numCorrectGuesses != word.length() && numIncorrectGuesses < 6) {  
        guess = scan.next().substring(0,1);

        if (word.contains(guess)) {
            correct = true;
            numCorrectGuesses += countOccurrences();
            System.out.println(wordSoFar());
        } else {
            correct = false;
            numIncorrectGuesses++;
        }

    //Removed code that draws hangman due to it making this really long

    if (numCorrectGuesses == word.length()) {
        System.out.println("You win");
    } else {
        System.out.println("You lose");
    }
}

正在添加驱动程序class:

public class runGame {
    public static void main(String[]args) {
        Hangman game = new Hangman();
        System.out.println(game.getWord());
        System.out.println(game.Blanks());
        game.Guess();
    }
}

Class 选词:

import java.util.*;

    public class Word {
        //String[] bank = {removing word bank due to length};

        public String chooseWord() {
            Random r = new Random();
            return new String(bank[r.nextInt(bank.length)]);
        }
    }

这是一个疯狂的例子(第一行只是为了测试;最终游戏不会显示这个词。单字符行是我的猜测):

object
************
    _______
   |/      |
   |
   |
   |
   |
   |
___|___
o
o*****
b
ob****
j
obj***
e
obje**
c
objec*
t
object
You win

你必须删除行

wordSoFar = Blanks();

从 wordSoFar() 函数开始。而是在 guess() 函数的开头执行。每次你猜一个新字符时,你都会用空白初始化它。每次调用 Blank() 函数时,它都会增加计数(因为它是一个 class 变量),最终会增加“_”的数量。

现在针对您当前的双 * 问题,在 Hangman class 中为 wordSoFar 写一个 getter。

public String getWordSoFar() {
    return wordSoFar
}

并且在主函数中

public class runGame {
    public static void main(String[]args) {
        Hangman game = new Hangman();
        System.out.println(game.getWord());
        System.out.println(game.getWordSoFar());
        game.Guess();
    }
}

还有一个想法,countLetter() 函数应该在计数之前将计数初始化为 0。

public int countLetters() {
    int count = 0;
    for (int i = 0; i < word.length(); i++) {
        if (Character.isLetter(word.charAt(i))) {
            count++;
        }
    }
    return count;
}

您可以将其转换为字符数组,而不是使用字符串

char[] wordArray = word.toCharArray();
char[] blankArray = new char[wordArray.length];
Arrays.fill(blankArray,'_');

猜测应该是一个字符,因为用户应该只能猜出一个字母

那么为了这个

public String wordSoFar(){
    for(int i = 0; i < wordArray.length(); i++){
        if(wordArray[i] == guess){
            blankArray[i] = wordArray[i];
        }
    }
    return blankArray;
}

blankArray 不断拼凑。您可以测试它是否已通过

解决
if(String(blankArray)==String(wordArray)){}