如何根据猜测

时间:2018-04-16 15:59:26

标签: java

我想要做的是拿一个隐藏的字符串,然后每次用户按下提示按钮时以随机顺序逐字显示。目前,每次按下提示按钮时,整个解决方案会在解决方案的每个字符上显示一次。

我试图这样做,以便在按下提示按钮时,字符串解决方案中的随机字符出现在正确的位置。我不确定如何将生成的字符的位置与字符串位置进行比较。

  public String letterGenerator(int count, String word) {
//String word is taken from another function and it is based on the current displayed card and associated answer
    StringBuilder string = new StringBuilder();
    Random rng = new Random();

    char[] letters = word.toCharArray();
    char[] answers = new char[letters.length];

   int selected = rng.nextInt(letters.length);

    for (int i = 0; i < word.length(); i++) {
        if (i == selected) {
                letters[i] = answers[i];
            }
        string.append(letters);
    }
    return string.toString();
}

例如,如果答案是&#34;钱包&#34;此代码输出解决方案为&#34; walleta walleta walleta walleta walleta walleta walleta walleta&#34; (它显示输出8次,因为它每个字符打印一次解决方案,包括空格)

每次按下提示按钮应该做的是按随机顺序显示每个字符,如下所示: 按1:&#34; _ _ _ l_ _ _&#34; 按2:&#34; a _ _ l_ _ _&#34; 按3:&#34; a _ _ l _e _&#34;,依此类推,直到整个单词出现在屏幕上

感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

嗯,对于循环的每次迭代,你append(letters)为你的输出,而letters all 你的字母的数组,而不仅仅是其中一个。所以当然你最终得到了你得到的输出。

但我认为你可以用更优雅,更面向对象的方式设计它。而不是两个字符数组的答案和显示,可能只做一个'字母'数组。这意味着您创建了一个自定义class Letter,它可以保存信息是否“已解决”。像这样:

public class Letter{
   char character;
   boolean solved;
   // ... Constructor, Getters, Setters
}

然后,您可以将您的字母数组传递给选择尚未解决的随机字母的方法,只需将其solved属性切换为true即可。用于向用户显示内容的代码将是这样的:

for(Letter letter : letterArray){
   System.out.print(letter.isSolved() ? letter.getCharacter() : "_");
}

答案 1 :(得分:0)

如果我理解正确,那么这里有一些事情需要改变;

1)您想要记住最后显示的提示,但您已将其存储在本地变量中。 您想要一种存储显示字母的方法。你如何做到这一点取决于你的类的其余部分是如何设置的,但要么作为方法返回或设置全局变量的一部分传回它应该做

2)由于您记住以前的提示,因此您需要确保选择了&#39;以前没有透露过。也许存储之前显示过的字母位置并与之进行比较。

3)我会把循环的内部更多地作为

for (int i = 0; i < word.length(); i++) {
    if(i == selected){
        string.append(letters[i]);
    }else{
        string.append("_");
    }
}

我希望这会有所帮助

编辑: 我已经改变了for循环,现在它可以按你的意愿工作了。对不起,我应该更加小心。

至于存储先前显示的字母,如果您使用的是Singleton类,则可以将此值存储在另一个列表中。我的建议是保留一个显示值的ArrayList,然后做类似的事情;

List<Integer> revealed = new ArrayList<>();
Random rng = new Random();

public int getNextSelected(int length){
    int selected = rng.nextInt(length);
    if(revealed.contains(selected)){
        return getNextSelected(length);
    }
    return selected;
}

public String letterGenerator(int count, String word) {
    ...
    int selected = getNextSelected(letters.length);
    for (int i = 0; i < word.length(); i++) {
        if (i == selected){
            string.append(letters[i]);
        } else if (revealed.contains(i)) {
            string.append(letters[i]);
        } else{
            string.append("_");
        }
    }
    revealed.add(selected);
    return string.toString();
}

这应该做你需要的。有很多方法可以清理代码,user3237736的建议非常好,因为它遵循“告诉不要问”的问题。原则,但班级的设计决定取决于你

答案 2 :(得分:0)

public class SOEN_student {
public static void letterGenerator(String word) {
    //String word is taken from another function and 
    //it is based on the current displayed card and associated answer
        StringBuilder string;
        Random rng = new Random();
        char[] letters = word.toCharArray();
        char[] answers = new char[letters.length];
        boolean[] visited=new boolean[letters.length];
        int selected;
        for (int i = 0; i < word.length(); i++) {
            do{
                selected=rng.nextInt(letters.length);
            }while(visited[selected]);
            string=new StringBuilder();
            for(int j=0;j<word.length();j++){
                if(visited[j] | j==selected){
                    visited[selected]=true; 
                    string.append(letters[j]);
                }else{
                    string.append("_");
                }
            }
            System.out.print(string.toString()+" ");
        }
    }
public static void main(String... args){
        letterGenerator("a wallet");
    }
}