0

絞首刑執行人プロジェクトで論理的な問題が発生しました。ユーザーからの手紙を受け取り、その手紙が秘密の単語に含まれているかどうかを検索します。ユーザーが秘密の単語の中で推測した文字が複数出現する場合、問題は私がそれをプログラムした方法です。それはただ通過し、それらすべてを示します。これは私が望んでいるものではありません。正しく推測された文字のステータスを一度に1つずつ更新したいだけです。

後にブレークを設定するなど、いくつかの異なることを試しましたstatus(guessCh,が、イテレータは文字が一致してそこで停止する最初の出現に移動します。

これに対する簡単な修正はありますか?

private void compare(String str)
{
    guessCh = str.charAt(0);
    char secretCh = '0';
    for (int i = i2; i < secretWord.length(); i++)                                           // Cuts the secret word into individual chars to process. 
    {
        secretCh = secretWord.charAt(i);
//      Compare the two strings.
        if (guessCh == secretCh)                                                            
        {
            status(guessCh, i);                                                               // Sends the letter & placement to status().  
        }

    }

}

n

private String status(char guessCh, int placement)
{
/*  Update and return status. */

    if (guessCh >='A' && guessCh <= 'Z')
    {
        status = new StringBuffer(status).deleteCharAt(placement).toString();
        status = new StringBuffer(status).insert(placement,guessCh).toString();
        println("That guess is correct.");
        canvas.displayWord(status);
        return status;
    }

    return status;
}
4

3 に答える 3

2

比較メソッド内からステータス変数を使用して、以前のソリューションをテストできます。

    if (guessCh == secretCh && status.charAt(i) != secretCh)
    {
        status(guessCh, i);
        break;
    }
于 2012-09-30T20:17:33.447 に答える
1

私が読める (そして理解できる) ことから、あなたが直面している基本的な問題はfor、compare メソッドのループが原因です。

(私の例では大文字と小文字が区別されることに注意してください。それを考慮する必要があります)

私が提案できる2つの基本的なアプローチがあります...

1 つ目は、1 回のチェックですべての出現を照合することです...

private char guessCh;
private String secretWord;
private String status;
private String secretBuffer;

public TestStringCompare() {

    secretWord = "This is a test";
    // This is a copy of the secret word, this ensures that
    // we always have a copy of the original.
    secretBuffer = secretWord;
    status     = "______________";
    guessCh = 'i';

    compare("i");

}

private void compare(String str) {

    while (secretBuffer.contains(str)) {

        int foundAt = secretBuffer.indexOf(str);
        status(str.charAt(0), foundAt);
        // We want to remove the "guess" from our check string
        // so it doesn't cause a false positive in the future
        StringBuilder sb = new StringBuilder(secretBuffer);
        sb.replace(foundAt, foundAt + 1, "_");

        secretBuffer = sb.toString();
        System.out.println(secretBuffer);


    }

}

private String status(char guessCh, int placement) {
    /*  Update and return status. */

    if (Character.isLetter(guessCh)) {
        status = new StringBuffer(status).deleteCharAt(placement).toString();
        status = new StringBuffer(status).insert(placement, guessCh).toString();
        System.out.println("That guess is correct.");
        System.out.println(status);
    }

    return status;
}

どちらが生成されますか:

That guess is correct.
__i___________
Th_s is a test
That guess is correct.
__i__i________
Th_s _s a test

または、推測の最初の出現を置き換えます(私が理解していることから、あなたが求めているものです)

public class TestStringCompare {

    public static void main(String[] args) {
        new TestStringCompare();
    }
    private char guessCh;
    private String secretWord;
    private String status;
    private String secretBuffer;

    public TestStringCompare() {

        secretWord = "This is a test";
        secretBuffer = secretWord;
        status     = "______________";
        guessCh = 'i';

        compare("i");

    }

    private void compare(String str) {

        if (secretBuffer.contains(str)) {

            int foundAt = secretBuffer.indexOf(str);
            status(str.charAt(0), foundAt);
            // Some where here you need to remove the "guess" character
            // to ensure that it doesn't get repeated...
            StringBuilder sb = new StringBuilder(secretBuffer);
            sb.replace(foundAt, foundAt + 1, "_");

            secretBuffer = sb.toString();
            System.out.println(secretBuffer);


        }

    }

    private String status(char guessCh, int placement) {
        /*  Update and return status. */

        if (Character.isLetter(guessCh)) {
            status = new StringBuffer(status).deleteCharAt(placement).toString();
            status = new StringBuffer(status).insert(placement, guessCh).toString();
            System.out.println("That guess is correct.");
            System.out.println(status);
        }

        return status;
    }
}

これを生成するのは...

That guess is correct.
__i___________
Th_s is a test
于 2012-09-30T20:51:08.293 に答える
0

これはある種の宿題だと思いますが、とにかく、indexOfを使用してみませんか

于 2012-09-30T20:07:41.633 に答える