0

我有下面的代码,它不适用于最后两个条件语句:else-if 和 else。使用 strcmp,我认为如果 player1 和 player2 都具有相同的字符串,那么这个 else-if 主体将被启用,但它没有。相反,它再次循环并要求输入剪刀、石头或纸。此外,输入汉堡包和石头之类的东西,不会激活其他部分,而是要求剪刀、石头和纸输入。

update1:​​根据调试器,据我所知,这似乎是因为之前的 else-if 之一已用尽。如果我为 player1 输入纸,为 player2 输入纸,那么它会输入:'else if(strcmp(player1, "paper") == 0)'。但它不会打印任何东西,因为它的主体中没有另一张纸。然后,它在 while 循环中再次循环(再次要求输入:石头、纸或剪刀),永远不会达到:'else if(strcmp(player1,player2) == 0)'

update2:如果我将 'else if(strcmp(player1,player2) == 0) 放在最顶部,则以 'if' 语句开始。该程序有效。但是,由于类似的情况, else 仍然无法正常工作。将它放在顶部是行不通的,因为它应该包含任何其他不是剪刀、石头或纸的措辞。

#include <stdio.h>
#include <string.h>

int main(void) {
    
    char player1[25];
    char player2[25];
    
    while(1){
        
        printf("please type one of the following: rock, paper or scissors. Player1 goes first\n");
        scanf("%24s%24s",player1,player2);
        

        if(strcmp(player1, "rock") == 0)
        {
            if (strcmp(player2, "scissors") == 0)
                printf("player 1 wins, rock crushes scissors\n");
            else if(strcmp(player2, "paper") == 0)
                printf("player 2 wins, paper covers rock\n");
        }
        
        else if(strcmp(player1, "scissors") == 0)
        {
            if(strcmp(player2, "paper") == 0)
                printf("player 1 wins, scissor cuts paper\n");
            else if(strcmp(player2, "rock") == 0)
                printf("player 2 wins, rock crushes scissors\n");

        }
        
        else if(strcmp(player1, "paper") == 0)
        {
            if(strcmp(player2, "rock") == 0)
                printf("player 1 wins, paper covers rock\n");
            else if(strcmp(player2, "scissors") == 0)
                printf("player 2 wins, scissor cuts paper\n");

        }
        
        else if(strcmp(player2, "rock") == 0)
        {
            if (strcmp(player1, "scissors") == 0)
                printf("player 2 wins, rock crushes scissors\n");
            else if(strcmp(player1, "paper") == 0)
                printf("player 1 wins, paper covers rock\n");

        }
        
        else if(strcmp(player2, "scissors") == 0)
        {
            if(strcmp(player1, "paper") == 0)
                printf("player 2 wins, scissor cuts paper\n");
            else if(strcmp(player1, "rock") == 0)
                printf("player 1 wins, rock crushes scissors\n");

        }
        
        else if(strcmp(player2, "paper") == 0)
        {
            if(strcmp(player1, "rock") == 0)
                printf("player 2 wins, paper covers rock\n");
            else if(strcmp(player1, "scissors") == 0)
                printf("player 1 wins, scissor cuts paper\n");

        }

        else if(strcmp(player1,player2) == 0)
        {
            printf("nobody wins, let’s sing it again!\n");
        }

        else
        {
            printf("incorrect input, try again\n");
        }
        
    }

        return 0;
}
4

2 回答 2

1

我会对其进行一些更改以使 if-else 更清晰一些。使用 switch 可以清楚地看到获胜的逻辑。

const char * const answers[] = {"rock", "scissors", "paper"};
#define ROCK 0
#define SCISSORS 1
#define PAPER 2
#define NOTFOUND 3

int main(void) {
    
    char player1[25];
    char player2[25];
    
    while(1){
        
        printf("please type one of the following: rock, paper or scissors. Player1 goes first\n");
        if(scanf("%24s%24s",player1,player2) != 2) 
        {
            printf("Wrong input\n");
            continue;
        }

        int pl1, pl2;

        for(pl1 = 0; pl1 < 3; pl1++)
        {
            if(!strcmp(player1, answers[pl1])) break;
        }

        for(pl2 = 0; pl2 < 3; pl2++)
        {
            if(!strcmp(player2, answers[pl2])) break;
        }

        if(pl1 == NOTFOUND || pl2 == NOTFOUND)
        {
            printf("Wrong input\n");
            continue;
        }
        
        if(pl1 == pl2)
        {
            printf("Draw\n");
            continue;
        }

       
        if (pl1 == ROCK)
        {
            if (pl2 == SCISSORS)
                printf("player 1 wins, rock crushes scissors\n");
            else if(pl2 == PAPER)
                printf("player 2 wins, paper covers rock\n");
        }

/*      change below acordingly 

        if(strcmp(player1, "scissors") == 0)
        {
            if(strcmp(player2, "paper") == 0)
                printf("player 1 wins, scissor cuts paper\n");
            else if(strcmp(player2, "rock") == 0)
                printf("player 2 wins, rock crushes scissors\n");

        }
        
        if(strcmp(player1, "paper") == 0)
        {
            if(strcmp(player2, "rock") == 0)
                printf("player 1 wins, paper covers rock\n");
            else if(strcmp(player2, "scissors") == 0)
                printf("player 2 wins, scissor cuts paper\n");
        }
    
        if(strcmp(player2, "rock") == 0)
        {
            if (strcmp(player1, "scissors") == 0)
                printf("player 2 wins, rock crushes scissors\n");
            else if(strcmp(player1, "paper") == 0)
                printf("player 1 wins, paper covers rock\n");

        }
            
        if(strcmp(player2, "scissors") == 0)
        {
            if(strcmp(player1, "paper") == 0)
                printf("player 2 wins, scissor cuts paper\n");
            else if(strcmp(player1, "rock") == 0)
                printf("player 1 wins, rock crushes scissors\n");

        }
        
        if(strcmp(player2, "paper") == 0)
        {
            if(strcmp(player1, "rock") == 0)
                printf("player 2 wins, paper covers rock\n");
            else if(strcmp(player1, "scissors") == 0)
                printf("player 1 wins, scissor cuts paper\n");

        }
        */
    }

    return 0;

但实际上,如果不需要,我想避免使用 if-else 梯子:

const char * const answers[] = {"rock", "scissors", "paper"};
#define ROCK 0
#define SCISSORS 1
#define PAPER 2
#define NOTFOUND 3

#define MAKERESULT(a,b) ((a)*10 + (b))

int main(void) {
    
    char player1[25];
    char player2[25];
    
    while(1){
        
        printf("please type one of the following: rock, paper or scissors. Player1 goes first\n");
        if(scanf("%24s%24s",player1,player2) != 2) 
        {
            printf("Wrong input\n");
            continue;
        }

        int pl1, pl2;

        for(pl1 = 0; pl1 < 3; pl1++) if(!strcmp(player1, answers[pl1])) break;
        for(pl2 = 0; pl2 < 3; pl2++) if(!strcmp(player2, answers[pl2])) break;

        switch(MAKERESULT(pl1,pl2))
        {
            case MAKERESULT(ROCK,SCISSORS):
                printf("player 1 wins, rock crushes scissors\n");
                break;
            case MAKERESULT(ROCK,PAPER):
                printf("player 2 wins, paper covers rock\n");
                break;
            case MAKERESULT(SCISSORS, PAPER):
                printf("player 1 wins, scissor cuts paper\n");
                break;
            case MAKERESULT(SCISSORS,ROCK):
                printf("player 2 wins, rock crushes scissors\n");
                break;
            case MAKERESULT(PAPER, ROCK):
                printf("player 1 wins, paper covers rock\n");
                break;
            case MAKERESULT(PAPER,SCISSORS):
                printf("player 2 wins, scissor cuts paper\n");
                break;
            case MAKERESULT(ROCK,ROCK):
            case MAKERESULT(SCISSORS, SCISSORS):
            case MAKERESULT(PAPER, PAPER):
                printf("Draw\n");
                break;
            default: 
                printf("Wrong input\n");
                break;
        }
    }
    return 0;
}
于 2021-05-26T23:05:10.337 回答
1

当你有一个 if/else 链时,恰好其中一个块将被执行,它将是第一个条件为真的块(或者最后一个,else如果没有的话)。

为了更好地说明,请使用以下代码:

if (condition1) {
  // do thing 1
} else if (condition2) {
  // do thing 2
} else if (condition3) {
  // do thing 3
} else {
  // do thing 4
}

这实际上是多个if链接在一起的语句。如果我们添加一些多余的大括号,它实际上是如何工作的会更加明显:

if (condition1) {
  // do thing 1
} else {
    if (condition2) {
      // do thing 2
    } else {
        if (condition3) {
            // do thing 3
        } else {
            // do thing 4
        }
    }
}

从这里可以看出,只有满足的第一个条件才会被输入。

这就是为什么strcmp(player1,player2) == 0永远不会进入该块的原因。如果 player1 输入有效字符串,则将输入前 3 个条件中的一个,而不会输入其他条件。

您需要移动strcmp(player1,player2) == 0条件并添加else前 3 个块中的每个块。您还可以删除检查玩家 2 值的外部块,因为它们已经包含在检查玩家 1 值的块中。

    if(strcmp(player1, "rock") == 0)
    {
        if(strcmp(player1,player2) == 0)
            printf("nobody wins, let’s sing it again!\n");
        else if (strcmp(player2, "scissors") == 0)
            printf("player 1 wins, rock crushes scissors\n");
        else if(strcmp(player2, "paper") == 0)
            printf("player 2 wins, paper covers rock\n");
        else
            printf("incorrect input, try again\n");
    }
    else if(strcmp(player1, "scissors") == 0)
    {
        if(strcmp(player1,player2) == 0)
            printf("nobody wins, let’s sing it again!\n");
        else if(strcmp(player2, "paper") == 0)
            printf("player 1 wins, scissor cuts paper\n");
        else if(strcmp(player2, "rock") == 0)
            printf("player 2 wins, rock crushes scissors\n");
        else
            printf("incorrect input, try again\n");
    }
    else if(strcmp(player1, "paper") == 0)
    {
        if(strcmp(player1,player2) == 0)
            printf("nobody wins, let’s sing it again!\n");
        else if(strcmp(player2, "rock") == 0)
            printf("player 1 wins, paper covers rock\n");
        else if(strcmp(player2, "scissors") == 0)
            printf("player 2 wins, scissor cuts paper\n");
        else
            printf("incorrect input, try again\n");
    }
    else
    {
        printf("incorrect input, try again\n");
    }
    
于 2021-05-26T23:17:25.820 回答