确保只允许执行一个if-else语句

时间:2018-02-05 21:15:24

标签: java

我可以用什么样的陈述来解决我的问题。

我正在编写一个程序,它将需要四个randomNumbers和四个playerGuesses。如果第一个,第二个,第三个或第四个randomNumber分别与第一个,第二个,第三个或第四个playerGuess匹配,则每个匹配为它们授予一个红色引脚(因此最多4个,最小值为0)。如果playerGuess号码确实出现在randomNumber序列中,但是在错误的位置,则玩家将获得白色别针奖励。如果为randomNumber授予红色别针(意味着对正确位置的正确猜测),则不再为该数字奖励白色针脚。

示例:

与playerGuesses(0,2,2,1)匹配的randomNumber序列(0,1,2,3)将产生2个红色引脚和1个白色引脚。

下面的代码显示了确定红色和白色引脚的过程。请注意,randomNumber和playerGuesses都是四个整数的数组。

//Determining the amount of red and white pins
if (randomNumbers[0] == playerGuesses[0])
    {Red = Red+1;}
        else if (randomNumbers[0] == playerGuesses[1] || randomNumbers[0] == playerGuesses[2] || randomNumbers[0] == playerGuesses[3]) 
            {White = White+1;}
if (randomNumbers[1] == playerGuesses[1])
    {Red = Red+1;}
        else if (randomNumbers[1] == playerGuesses[0] || randomNumbers[1] == playerGuesses[2] || randomNumbers[1] == playerGuesses[3]) 
            {White = White+1;}
if (randomNumbers[2] == playerGuesses[2])
    {Red = Red+1;}
        else if (randomNumbers[2] == playerGuesses[0] || randomNumbers[2] == playerGuesses[1] || randomNumbers[2] == playerGuesses[3]) 
            {White = White+1;}
if (randomNumbers[3]==playerGuesses[3])
    {Red = Red+1;}
        else if (randomNumbers[3] == playerGuesses[0] || randomNumbers[3] == playerGuesses[1] || randomNumbers[3] == playerGuesses[2]) 
            {White = White+1;}

当多个if-else语句变为true时,会出现一个非常具体的问题。最好用一个例子来表示:

计算机生成:(4 9 7 7)

球员猜测:(1 7 1 1)

控制台返回:2个白色针脚,0个红色针脚。

在此示例中,没有触发确定红色引脚的if语句。因此,所有if-else语句都用于确定白色引脚。

问题在于" 7"在播放器的猜测中,触发第三个和第四个if-else语句,用于添加白色引脚,从而产生两个白色引脚。然而,这场比赛只是为了奖励一个白色别针。

你们有没有想过如何确保任何playerGuess只能在没有红色别针的情况下触发一个白色针脚。

(我希望提供回答我问题所需的所有信息!)

2 个答案:

答案 0 :(得分:0)

        if (randomNumbers [0] == playerGuesses [0])
{Red = Red+1;}
    else if (randomNumbers[0] == playerGuesses[1] || randomNumbers[0] == playerGuesses[2] || randomNumbers[0] == playerGuesses[3]) 
        {White = White+1;}
if (randomNumbers[1] == playerGuesses[1])
    {Red = Red+1;}
        else if (randomNumbers[1] == playerGuesses[2] || randomNumbers[1] == playerGuesses[3]) 
            {White = White+1;}
if (randomNumbers[2] == playerGuesses[2])
    {Red = Red+1;}
        else if ( randomNumbers[2] == playerGuesses[3]) 
            {White = White+1;}
if (randomNumbers[3]==playerGuesses[3])
    {Red = Red+1;}

这应该修复你的代码。你重新检查了一些条件,最多3次,如randomNumbers [0] == playerGuesses [1]。 当您检查时,这会影响实际满足条件的次数 不止一次。 使用您的示例和原始代码,

计算机生成:(4 9 7 7)

球员猜测:(1 7 1 1)

你的代码检查你的第三个else if语句中是否randomNumbers [2] == playerGuesses [3],然后 if randomNumbers [3] == playerGuesses [2]在你的第四个else if语句中。如你看到的, 这将检查相同的条件两次,因此将提供2个白色针脚而不是1个白色针脚。 重新制作的代码将确保这不会发生。

答案 1 :(得分:0)

我建议采用不同的方法, 逻辑更简单,if语句更少 它还解决了太多白色针脚的问题。

  1. 确定红色针脚的数量。
  2. 确定针脚总数(红色+白色):
    对于每个可能的数字(0,1,2,3,... 9)计算它的次数 发生在两个阵列中 这两个计数中较小的一个有助于 引脚总数。
  3. 计算白色针脚的数量(总计 - 红色)。

  4. public static void main(String[] args) {
        int[] randomNumbers = {4, 9, 7, 7};
        int[] playerGuesses = {1, 7, 1, 1};
        compare(randomNumbers, playerGuesses);
    }
    
    /**
     * Determine the amount of red and white pins
     */
    private static void compare(int[] randomNumbers, int[] playerGuesses) {
        int red = 0;
        for (int i = 0; i < randomNumbers.length; i++) {
            if (randomNumbers[i] == playerGuesses[i]) {
                red++;
            }
        }
        int total = 0;
        for (int x = 0; x < 10; x++) {
            total += Math.min(frequency(randomNumbers, x), frequency(playerGuesses, x));
        }   
        int white = total - red;
        System.out.println(white + " white pins, " + red + " red pins");
    }
    
    /**
     * Determine how many times the value x occurs in the array
     */
    private static int frequency(int[] array, int x) {
        int result = 0;
        for (int i = 0; i<array.length; i++) {
            if (array[i] == x) {
                result++;
            }
        }
        return result;
    }