首先说明规则:

0、1、2三个整数分别是剪刀石头布在程序中的内部表示,用户也要求输入0、1或2,然后和计算机随机生成的0、1或2比胜负,这个程序的主体是一个死循环,需要按Ctrl-C退出程序!
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(void)
    {
        char gesture[3][10] = {"scissor", "stone","cloth"};
        int man, computer, result, ret;
        srand(time(NULL));
        while (1)
        {
            computer = rand() % 3;
            printf("\nInput your gesture (0-scissor 1 -stone 2 - cloth) :\n ");
            ret = scanf("%d", &man);
            if (ret != 1 || man < 0 || man > 2)
            {
                printf("Invalid input! Please input 0, 1 or 2.\n");
                continue;
            }
            printf("Your gesture: %s\tComputer's gesture: % s\n ", 
                gesture[man],gesture[computer]);
            result = (man - computer + 4) % 3 - 1;
            //此处为核心代码!
            if (result > 0)
                printf("You win!\n");
            else if (result == 0)
                printf("Draw!\n");
            else
                printf("You lose!\n");
        }
        return 0;
    }

根据对result的胜负判断条件可知,当result(即我们输入的和电脑随机生成的结果经过计算之后的结果)大于0,我们赢,小于0,我们输,等于0,打成平手!
那么(man - computer + 4) % 3 - 1这个神奇的表达式是如何控制比较出0、1、2这三个数字在“剪刀石头布”意义上的大小和输赢的?凑的过程见下面表格:
image.png


具体执行后的结果见下图:
image.png


沐小轲
9 声望0 粉丝

C++初学者