用刽子手错误替换单词中的字母

时间:2013-06-25 02:10:05

标签: java string object char

 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.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());
        }
    }
}

如果有人可以在类编码中指出我的替换语句有什么问题,那将非常感激。

由于

5 个答案:

答案 0 :(得分: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++;
    }
}

答案 1 :(得分:1)

你的遗憾词是全部????所以无论你输入什么,代码disguise.charAt(i)总是?所以每一个?将被替换

你想要的是secret.charAt(i),如下所示

public void makeGuess(char input) {
    String temp;
    temp=disguise;
    char[] disquiseChars = disquise.toCharArray();  //added
    for (int i=0; i<secret.length(); i++) {
        if (secret.charAt(i)==input) {
           //disguise=disguise.replace(secret.charAt(i), input); 
           //Change in above line, but this still wont work, try this now
           disquiseChars[i] = input;
        }
    }
    disquise = disquiseChars;
    if (temp.equals(disguise))
        wrong++;
}

不是最优雅的解决方案,但应该做到这一点

编辑:以下是检查他们是否已经猜过一封信的快速方法,但只是猜到了我现在意识到的正确信件

public void makeGuess(char input) {
    if(diquise.contains(String.valueOf(input))
    {
        System.out.println("You have already guessed " + input);
        wrongGuess++; // if you decide
        return;
    }
    String temp;
    temp=disguise;
    char[] disquiseChars = disquise.toCharArray();
    for (int i=0; i<secret.length(); i++) {
        if (secret.charAt(i)==input) 
        {
           disquiseChars[i] = input;
        }
    }
    disquise = disquiseChars;
    if (temp.equals(disguise))
        wrong++;
}

答案 2 :(得分:0)

只需用disguise[i] = input;替换循环中的Replace函数,并在循环继续时,根据需要进行所有更改:)

这里的问题就像Java Devil建议的那样,你正在取代所有'?'输入!

编辑:抱歉,当我说disguise[i]时,我在想.NET。

将伪装声明为StringBuilder使用disguise.setCharAt(i, input);或执行 disguise = disguise.substring(0,i) + input + disguise.substring(i+1, disguise.length());

第二个版本也适用于字符串。您将首先从0创建2个子字符串到您要更改的位置的索引,然后添加新字符&amp;将第二个子串从i + 1连接到末尾

希望有所帮助......

干杯

答案 3 :(得分:0)

查看String.replace(char,char)文档,您将看到它将newChar的每个实例替换为newChar。这意味着每一个&#39;?&#39;将被替换为&#39; w&#39;。你想要做的只是替换给定位置的角色。

为此,您可以使用char []而不是字符串,并可以通过索引轻松替换字符。要从字符串中获取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++;
    }

答案 4 :(得分:0)

String chartAt(i)返回字符而非索引。如果替换字符,则所有字符的出现都将被替换。

如果您浏览Java文档,那么您必须了解为什么replace(char,char)方法不能替换单个字符。以下qoute来自Java Docs。

  

public String replace(char oldChar,char newChar)

     

返回替换所有出现的新字符串   newChar在这个字符串中使用newChar。如果字符oldChar没有   发生在由此String对象表示的字符序列中,   然后返回对此String对象的引用。否则,一个新的   创建表示字符序列的String对象   与此String对象表示的字符序列相同,   除了每次出现的oldChar都被一个事件所取代   of newChar。