头图

有一个游戏,有21根火柴,你和计算机依次取(你优先),每次只可取走1〜4根,不能多取,也不能不取,谁取到最后一根火柴谁输。但是,最后发现,赢的总是计算机,请问为什么?

思路:

既然计算机每次都赢,根据上面的描述,咱们转换下思维,很明显,最后一根火柴必须是人来取走的。
我们进一步可以得出更为简单的结论,人和机器每次取,在一定的次数下,共同达到20,这样,计算机每次就可以赢了。

我们这里用people代替人每次选择的抽取数,comuputer代替计算机抽取数,spare代替总抽取数,所以,人每次选择后,计算机就要判断人的选择后做判断,即:
computer = 5 - people;
spare = spare - computer;//每一次循环人和计算机总抽取数统计剩余

因此完整代码如下:

#include <stdio.h>
int main()
{
    int computer, people, spare = 21;
    printf(" -----------------------------------------\n");
    printf(" --------  你不能战胜我,不信试试  --------\n");
    printf(" -----------------------------------------\n\n");
    printf("Game begin:\n\n");
    while (1)
    {
        printf("目前还有%d根火彩\n", spare);
        printf("people:");
        scanf("%d", &people);
        if (people < 1 || people>4 || people > spare)
        {
            printf("违规,请重新输入\n");
            continue;
        }
        else {
            spare = spare - people;
        }
        if (spare == 0)
        {
            printf("computer win");
            break;
        }
        computer = 5 - people;
        spare = spare - computer;
        printf("Computer:%d  \n", computer);
        if (spare == 0)
        {
            printf("\nPeople win! Game Over!\n");
            break;
        }
    }
    return 0;
}

运行验证看看:
图片.png

即我们的思路正确。
对了,悄悄说一句,你甚至可以在我们的代码里找不到判断人胜利打印输出的逻辑,没错,机器始终胜利的(哈哈)


瞿小凯
1.3k 声望593 粉丝