我想要做的是拿一个隐藏的字符串,然后每次用户按下提示按钮时以随机顺序逐字显示。目前,每次按下提示按钮时,整个解决方案会在解决方案的每个字符上显示一次。
我试图这样做,以便在按下提示按钮时,字符串解决方案中的随机字符出现在正确的位置。我不确定如何将生成的字符的位置与字符串位置进行比较。
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;,依此类推,直到整个单词出现在屏幕上
感谢任何帮助!
答案 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");
}
}