C趣味編程百例(28)常勝將軍

字號(hào):

88.常勝將軍
     現(xiàn)有21根火柴,兩人輪流取,每人每次可以取走1至4根,不可多取,也不能不取,誰取最后一楰火柴誰輸。請(qǐng)編寫一個(gè)程序進(jìn)行人機(jī)對(duì)弈,要求人先取,計(jì)算機(jī)后??;計(jì)算機(jī)一方為“常勝將軍”。
    *問題分析與算法設(shè)計(jì)
     在計(jì)算機(jī)后走的情況下,要想使計(jì)算機(jī)成為“常勝將軍”,必須找出取 關(guān)鍵。根據(jù)本題的要求枷以總結(jié)出,后走一方取子的數(shù)量與對(duì)方剛才一步取子的數(shù)量之和等于,就可以保證最后一個(gè)子是留給先取子的那個(gè)人的。
     據(jù)此分析進(jìn)行算法設(shè)計(jì)就是很簡單的工作,編程實(shí)現(xiàn)也十分容易。
    *程序與程序注釋
    #include
    void main()
    {
     int a=21,i;
     printf("Game begin:\n");
     while(a>0)
     {
     do{
     printf("How many stick do you wish to take(1~%d)?",a>4?4:a);
     scanf("%d",&i);
     }while(i>4||i<1||i>a); /*接收正在確的輸入*/
     if(a-i>0) printf(" %d stick left in the pile.\n",a-i);
     if((a-i)<=0)
     {
     printf(" You have taken the last stick.\n");
     printf(" * * * You lose! \nGame Over.\n"); /*輸出取勝標(biāo)記*/
     break;
     }
     else
     printf(" Compute take %d stick.\n",5-i); /*輸出計(jì)算機(jī)取的子數(shù)*/
     a-=5;
     printf(" %d stick left in the pile.\n",a);
     }
    }