我一直在为java开发一个hangman代码并设法让它工作,但是当涉及重复字母的单词,例如“banana”,其中'a'重复时,我的代码似乎不起作用。到目前为止,我已经创建了一个循环,它从0循环到'genRadmLetter的数组长度。在循环内部,我创建了一个if语句,说明位置是否为-1,然后更新数组。否则打印'未找到信'。这是我正在讨论的特定代码:
int rpCount = 0;
for (int y = 0; y<genRadmLetter.length; y++){
int position = radmWord.indexOf(guessedLetter, rpCount);
if (position != -1){
genRadmLetter[RW] = guessedLetter;
System.out.println(genRadmLetter);
result = true;
}
}
}
if (result != true){
System.out.println("Wrong letter, try again.");
}
以下是我的全部代码:
import java.util.Scanner;
import java.util.Arrays;
public class Hangman{
public static void main(String []args){
Scanner Input = new Scanner(System.in);
String[] CollectionOfWords = {"","gravity","banana","gate","processor","momentum","earth","star","light","television","pan","cupboard"};
int radmNumber = (int) Math.ceil (Math.random() * CollectionOfWords.length);
int counter = 10;
String radmWord = CollectionOfWords[radmNumber];
System.out.println(radmWord);
char[] genRadmLetter = radmWord.toCharArray();
char[] genRadmLetter2 = radmWord.toCharArray();
for (int x = 0; x<genRadmLetter.length; x++){
genRadmLetter[x]='?';
}
System.out.println(String.valueOf(genRadmLetter));
System.out.println("Hello. Guess a letter.");
char guessedLetter = Input.next().charAt(0);
int RW = radmWord.indexOf(guessedLetter);
boolean result = false;
if (RW >= 0 ){
int rpCount = 0;
for (int y = 0; y<genRadmLetter.length; y++){
int position = radmWord.indexOf(guessedLetter, rpCount);
if (position != -1){
genRadmLetter[RW] = guessedLetter;
System.out.println(genRadmLetter);
result = true;
}
}
}
if (result != true){
System.out.println("Wrong letter, try again.");
}
while (counter != 0) {
if (RW >= 0 ){
{
int rpCount = 0;
for (int y = 0; y<genRadmLetter.length; y++){
int position = radmWord.indexOf(guessedLetter, rpCount);
if (position != -1){
genRadmLetter[RW] = guessedLetter;
System.out.println(genRadmLetter);
result = true;
}
}
}
}
if (RW == -1){
System.out.println("Wrong letter, try again.");
counter = counter - 1;
System.out.println("Score: " + counter);
}
boolean result2 = Arrays.equals(genRadmLetter, genRadmLetter2);
if (result2 == true){
break;
}
if (counter == 0){
break;
}
}
if (counter == 0){
System.out.println("You lose. The word was: " + radmWord);
}
else {
System.out.println("Well done, you have guessed the word.");
System.out.println("Your final score is: " + counter + "/10");
}
}
}
任何帮助表示赞赏!谢谢!
答案 0 :(得分:1)
RW
和rpCount
未在循环内更新,因此您总是:
如果您想使用indexOf
执行此操作,则需要每次都更新fromIndex
parameter。 (fromIndex
是它开始搜索的索引,所以如果它始终为0,它将始终找到第一个匹配项。)像这样:
int last = 0;
for(int y = 0; y < genRadmLetter.length; y++) {
int pos = radmWord.indexOf(guessedLetter, last);
if(pos > -1) {
genRadmLetter[pos] = guessedLetter; // use found index to replace
result = true;
last = pos + 1; // skip to the next letter
}
if(pos == radmWord.length() - 1) {
break; // it was the last letter
}
}
还需要新的break
条件(或者如果使用最后一个字母的索引+ 1调用indexOf
,则会出现超出范围的异常。)
因此,如果您正在进行基于遏制的替换,则不需要for(each index)
成语。您并未真正使用y
变量,而for(each index)
会导致对indexOf
的冗余调用。循环可以缩短为:
int pos = 0;
do {
pos = radmWord.indexOf(guessedLetter, pos);
if(pos > -1) {
genRadmLetter[pos] = guessedLetter;
result = true;
pos++;
}
} while(pos > -1 && pos < radmWord.length());
但请注意,如果数组只是并行,那么使用charAt
有一种更简单的方法:
for(int i = 0; i < genRadmLetter.length; i++) {
if(radmWord.charAt(i) == guessedLetter) {
genRadmLetter[i] = guessedLetter;
result = true;
}
}
答案 1 :(得分:0)
通过“不起作用”,我猜你的意思是它只是在'香蕉'中找到'a'的第一个实例。这是因为indexOf方法始终从第二个参数指定的索引开始返回指定字符的第一个实例。您正在指定rpCount,它已初始化为0,但从未更新,因此它只会找到第一个实例。
简单修复:
if (position != -1){
genRadmLetter[RW] = guessedLetter;
System.out.println(genRadmLetter);
result = true;
**rpCount = position;**
}