0
 public class Hangman {

    private String secret;
    private String disguise;
    private int guessCount;
    private int wrong;

    public Hangman() {
        secret="word";
        disguise="????";
        guessCount=0;
        wrong=0;
    }

    public void makeGuess(char input) {
        String temp;
        temp=disguise;
        for (int i=0; i<secret.length(); i++) {
            if (secret.charAt(i)==input) {
                disguise=disguise.replace(disguise.charAt(i), input);
            }
        }
        if (temp.equals(disguise))
            wrong++;
    }

私のコード、特に disguise=disguise.replace 行に問題があります。私のコードの目的は、ユーザーから推測して、偽装した記号を秘密裏に文字に置き換えることです。for ループは秘密の単語のすべての文字を調べ、ユーザーが入力した文字と秘密の単語の文字との一致を探します。一致する場合は、その位置にある変装した記号を入力からの文字に置き換えるプログラムが必要です。

代わりに、コードが変装したすべての文字を、秘密という単語に含まれているかどうかをユーザーが推測する文字に置き換えています。

Example:
????
w
wwww (disguise)
word (secret)

what I want:
????
w
w???
word

これは私のデモクラスです:

import java.util.Scanner;
public class HangmanDemo {

    public static void main(String[] args) {
        char input;
        Hangman game = new Hangman();
        Scanner keyboard = new Scanner(System.in);
        System.out.println(game.getDisguisedWord());
        for (int i=0;i<10;i++){
            String line=keyboard.nextLine();
            input = line.charAt(0);

            game.makeGuess(input);
            game.guessCount();
            game.getDisguisedWord();
            game.isFound();
            System.out.println(game.getDisguisedWord());
            System.out.println(game.getSecretWord());
        }
    }
}

クラスコーディングのreplaceステートメントの何が問題なのか誰かが指摘できれば、それは大歓迎です。

ありがとう

4

5 に答える 5

4

あなたの「偽装」には のみが含まれ?replace(char oldchar, char newChar)実際にはすべての出現を置き換えるためoldchar、文字列全体が置き換えられます。

本当に必要なのは、特定の位置で文字を置き換えることです。そのためには、 を使用できますStringBuilder#setCharAt。以下の私の例を参照してください。

public void makeGuess(char input) {
    StringBuilder temp = new StringBuilder(disguise);
    boolean wrongGuess = true;
    for (int i=0; i<secret.length(); i++) {
        if (secret.charAt(i) == input) {
            temp.setCharAt(i, input);
            wrongGuess = false;
        }
    }

    disguise = temp.toString();
    System.out.println(disguise);
    if (wrongGuess){
        wrong++;
    }
}
于 2013-06-25T02:26:08.537 に答える
0

ループ内の Replace 関数を a に置き換えるだけでdisguise[i] = input;、ループが継続するにつれて、必要に応じてすべての変更が行われます :)

ここでの問題は、Java Devil が示唆したように、すべての「?」を置き換えていることです。入力で!

編集:申し訳ありませんが、私が言ったとき.NETを考えていましたdisguise[i]

Disguise をStringBuilder使用として宣言するか、disguise.setCharAt(i, input);または Do disguise = disguise.substring(0,i) + input + disguise.substring(i+1, disguise.length());

2 番目のバージョンは文字列でも機能します。最初に0から変更したい位置のインデックスまで2つの部分文字列を作成し、次に新しい文字を追加して、2番目の部分文字列をi + 1から最後まで連結します

それが役に立てば幸い..

乾杯

于 2013-06-25T02:22:14.517 に答える
0

String.replace (char,char)ドキュメントを見ると、oldChar のすべてのインスタンスが newChar に置き換えられていることがわかります。これは、すべての「?」が 「w」に置き換えられます。代わりにやりたいことは、その特定の位置の文字だけを置き換えることです。

これを行うには、文字列の代わりに char[] を使用して、文字をインデックスで簡単に置き換えることができます。String から char[] を取得するには、合言葉に対して String.toCharArray()メソッドを呼び出すだけです。

public class Hangman {

    private String secret;
    private char[] disguise;
    private int guessCount;
    private int wrong;

    public Hangman() {
        secret="word";
        disguise="????".toCharArray(); // <-- Basically this changes
        guessCount=0;
        wrong=0;
    }

    public void makeGuess(char input) {
        boolean found = false;
        for (int i=0; i<secret.length(); i++) {
            if (secret.charAt(i)==input) {
                disguise[i] = input; // <-- Basically this changes
                found = true;
            }
        }
        if (!found)
            wrong++;
    }
于 2013-06-25T02:24:35.433 に答える