2

我正在做一个类似于 Cows and Bulls 的 Java 游戏。但不是显示“Cow”和“Bull”,而是显示“MOO”或“moo”。生成一个 4 位数字,用户可以猜到。对于正确指定的每个数字(相同的数字,相同的位置),屏幕上会显示一个“MOO”。对于每个被猜到的具有相同数字但位置错误的数字,都会显示一个“moo”。我在执行返回多少“moo”的方法时遇到了麻烦。

public int getLittleMooCount(int guess)
{
    int count = 0;
    String guessString = Integer.toString(guess);
    String randomValueString = Integer.toString(randomValue);

    // Pads the number with zero if less than 4 digits, so length is always 4
    while(guessString.length() < 4)
    {
        guessString = "0" + guessString;
    }

    while(randomValueString.length() < 4)
    {
        randomValueString = "0" + randomValueString;
    }

    // checking to see if positions EXACTLY match. If so, it would return a MOO (the getBigMoo
    // Count is in my other method)
    for (int i = 0; i < 4; i++)
    {
        if (guessString.charAt(i) == randomValueString.charAt(i))
        {
            randomValueString = randomValueString.replace(randomValueString.charAt(i), 'X');
            guessString = guessString.replace(guessString.charAt(i), 'O');
        }
    }

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (guessString.charAt(j) == randomValueString.charAt(i))
            {
                count++;
                randomValueString = randomValueString.replace(randomValueString.charAt(i), 'X');
                guessString = guessString.replace(guessString.charAt(j), 'O');
            }

        }
    }

    return count;
}
  1. 测试输入
    1. 0011
    2. 2233
    3. 4455
    4. 6677
    5. 8899
    6. 1234
    7. 5678
    8. 9090

随机数为 5509 的结果

  1. 1 moo = 正确
  2. 没有=正确
  3. 1 moo = 错误!应该是两个哞。
  4. 没有=正确
  5. 1 MOO = 正确
  6. 没有=正确
  7. 1 MOO = 正确
  8. 2 moo = 正确

似乎它适用于某些数字,但对于其他数字,总是有一个测试数据是错误的。显然,出了点问题,但我尝试了一切,这令人沮丧!如果有帮助,我可以发布另一个示例。

我在这里先向您的帮助表示感谢!

编辑:好吧,我把它改成了一个字符数组,现在它什么也没做。我可以发誓我做对了。

int count = 0;
    String guessString = Integer.toString(guess);
    String randomValueString = Integer.toString(randomValue);

    char [] randomValueCharacter = randomValueString.toCharArray();
    char [] guessCharacter = guessString.toCharArray();


    while(guessString.length() < 4)
    {
        guessString = "0" + guessString;
    }

    while(randomValueString.length() < 4)
    {
        randomValueString = "0" + randomValueString;
    }

    for (int i = 0; i < 4; i++)
    {
        if (guessString.charAt(i) == randomValueString.charAt(i))
        {
            randomValueCharacter[i] = 'X';
            guessCharacter[i] = 'O';
        }
    }

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (guessString.charAt(j) == randomValueString.charAt(i))
            {
                count++;
                randomValueCharacter[i] = 'X';
                guessCharacter[j] = 'O';
            }

        }
    }

    return count;
}
4

1 回答 1

4

这是因为 String.replace()。此功能不会像您假设的那样替换特定位置的字符,它会替换给定字符的所有外观!因此,在找到前 5 个之后,两个 5 都被替换为 x。

JavaDoc

public String replace(char oldChar, char newChar) 返回一个新字符串,该字符串是用 newChar 替换此字符串中所有出现的 oldChar 所产生的。如果此 String 对象表示的字符序列中没有出现 oldChar 字符,则返回对该 String 对象的引用。否则,将创建一个新的 String 对象,该对象表示与此 String 对象所表示的字符序列相同的字符序列,但每次出现的 oldChar 都替换为出现的 newChar。

例子:

"你地窖里的牧豆树".replace('e', 'o') 返回 "你衣领里的蚊子" "男爵的战争".replace('r', 'y') 返回 "刺刀之道" "陪练with a Purple porpoise".replace('p', 't') 返回"starring with a turtle tortoise" "JonL".replace('q', 'x') 返回"JonL"(没有变化) 参数:oldChar -旧角色。newChar - 新角色。返回: 通过用 newChar 替换每次出现的 oldChar 从该字符串派生的字符串。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

您可以改用整数数组。


尝试这个

    int count = 0;
    String guessString = Integer.toString(4455);
    String randomValueString = Integer.toString(5509);

    char [] randomValueCharacter = randomValueString.toCharArray();
    char [] guessCharacter = guessString.toCharArray();


    while(guessString.length() < 4)
    {
        guessString = "0" + guessString;
    }

    while(randomValueString.length() < 4)
    {
        randomValueString = "0" + randomValueString;
    }

    for (int i = 0; i < 4; i++)
    {
        if (guessCharacter[i] == randomValueCharacter[i])
        {
            randomValueCharacter[i] = 'X';
            guessCharacter[i] = 'O';
        }
    }

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (guessCharacter[j] == randomValueCharacter[i])
            {
                count++;
                randomValueCharacter[i] = 'X';
                guessCharacter[j] = 'O';
            }

        }
    }

    return count;
}
于 2013-02-14T00:44:14.563 回答