Java刽子手 - 重复的信件

时间:2014-03-21 20:38:36

标签: java

我一直在为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");
        }

    }

}

任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:1)

RWrpCount未在循环内更新,因此您总是:

  • 检查第一次出现。
  • 更换第一次出现。

如果您想使用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;**

}