我已经研究了这个主题一段时间,但没有成功。 我确实找到了StringBuilder,它的工作原理很神奇,但是就我所知。 这是使子手程序按其应有的方式工作的方式:
if(strGuess.equalsIgnoreCase("t")){
mainword.replace(0,1,"T");
gletters.append('T');
}
else if(strGuess.equalsIgnoreCase("e")){
mainword.replace(1,2,"E");
gletters.append('E');
}
else if(strGuess.equalsIgnoreCase("c")){
mainword.replace(2,3,"C");
gletters.append('C');
}
else if(strGuess.equalsIgnoreCase("h")){
mainword.replace(3,4,"H");
gletters.append('H');
}
else if(strGuess.equalsIgnoreCase("n")){
mainword.replace(4,5,"N");
gletters.append('N');
}
else if(strGuess.equalsIgnoreCase("o")){
mainword.replace(5,6,"O");
mainword.replace(7,8,"O");
gletters.append('O');
}
else if(strGuess.equalsIgnoreCase("l")){
mainword.replace(6,7,"L");
gletters.append('L');
}
else if(strGuess.equalsIgnoreCase("g")){
mainword.replace(8,9,"G");
gletters.append('G');
}
else if(strGuess.equalsIgnoreCase("y")){
mainword.replace(9,10,"Y");
gletters.append('Y');
}
else{
JOptionPane.showMessageDialog(null,"Sorry, that wasn't in the word!");
errors++;
gletters.append(strGuess.toUpperCase());
}
SetMain = mainword.toString();
GuessedLetters = gletters.toString();
WordLabel.setText(SetMain);
GuessedLabel.setText(GuessedLetters);
GuessText.setText(null);
GuessText.requestFocusInWindow();
但是,我不能对每个单词的每个字母都执行此操作,那么是否有一种简单有效的方法来执行此操作? 我想要的是具有某种形式的循环,这样无论什么单词我都只需使用一次。 因此,这个词可能是技术(如上),苹果,泡菜,圣诞节或你好等。
我已经尝试过使用for循环,但我认为答案就在于此。 如果有人可以解释charAt()方法以及如何/在何处使用它,那将是很好的。 我最接近提高效率的是:
for(i = 0; i < GuessWord.length(); i++) {
if (GuessWord.charAt(i) == guess2) {
mainword.replace(i,i,strGuess.toUpperCase());
}
那么,如果您可以将其用作基础并加以解决,例如进行修复? 或告诉我一些我没有想到的事情。
您的for循环/ charAt代码块有什么问题?
@ZackMacomber,我猜测if条件永远不会满足,因为单击按钮时什么也没发生。 如果用户正确猜到,应该替换字母
这是一个好问题。 显然有重复的代码,因此如何用可重用的代码替换所有代码。 实际上,您可以省去所有代码。
整个代码块只能替换为一行(适用于每个单词)!
String word ="TECHNOLOGY"; // This is the word the user must guess
mainword = word.replaceAll("[^" + gletters +"]","_");
这使用replaceAll()和正则表达式表示正则表达式,表示"尚未猜到的任何字母",并将其替换为下划线字符"_"。 请注意,字符串是不可变的,并且replaceAll()方法返回修改后的字符串-它不会修改调用的字符串。
这是一些测试代码来展示它的实际作用:
public static void main(String[] args) {
String word ="TECHNOLOGY"; // what the user must guess
StringBuilder gletters = new StringBuilder("GOTCHA"); // letters guessed
String mainword = word.replaceAll("[^" + gletters +"]","_");
System.out.println(mainword);
}
输出:
T_CH_O_OG_
通过word.replaceAll,变量" word"代表什么?
您无需像执行操作那样将单词存储为"代码";只需创建一个名为" word"的String变量即可保存用户必须猜测的值。
我觉得您的回答是最有帮助的,您正在做些什么。好的,所以我要使用JLabel.setText(mainword)而不是System.out.print。那行吗?而且我将StringBuilder设置为用户猜测的问题,而不是某些字符
当然-我只是用它来简单地显示它。像现在一样使用mainword和gletter变量。它会工作。您的代码其余部分可以进一步简化,但是麻烦您留给您:)
好的,最后一个问题,我将如何使用单词数组(此子手游戏中使用的单词im)代替它?换句话说,由于String word =" TECHNOLOGY",是否必须制作String word2?
在这种情况下,请使用String[] words; int wordIndex = 5; mainword = words[wordIndex].replaceAll...
@ user1803676是,wordIndex是当前正在播放的单词的索引。例如wordIndex = (int)(Math.random() * words.length);
好消息!它有效,但是一次只能写一封信。因此,对于"苹果"一词,猜测a和值是:a _ _ _ _猜测p和值是:_ p p _ _我希望它是累计的。救命?
@ user1803676,您必须清除猜测或在每个循环中创建一个新对象。我保证它有效-尝试对"apple".replaceAll("[^ap]","_");进行硬编码,您会看到输出为app__
foundword = words[randvalue].replaceAll("[^" + xletters +"]","_");是我在for循环中所拥有的,其中foundword是一个字符串,words [randvalue]是来自我的字符串数组的随机单词,而xletters是用户猜测的字母。而且一次只能处理一个字母。我无法累积
@JavaProdigy xletters必须是到目前为止猜到的所有字母。您需要在其上添加猜中的字母,因此请替换它。 xletters应该在循环外部定义。
xletters被定义为for循环上方的StringBuilder xletters = new StringBuilder(strGuess);。那我会为此使用append()方法吗?