C趣味程序百例(29)搶30

字號(hào):

89.搶 30
     這是中國(guó)民間的一個(gè)游戲。兩人從1開始輪流報(bào)數(shù),每人每次可報(bào)一個(gè)數(shù)或兩個(gè)連續(xù)的數(shù),誰先報(bào)到30,誰就為勝方。
    *問題分析與算法設(shè)計(jì)
     本題與上題類似,算法也類似,所不同的是,本誰先走第一步是可選的。若計(jì)算機(jī)走第一步,那么計(jì)算機(jī)一定是贏家。若人先走一步,那么計(jì)算機(jī)只好等待人犯錯(cuò)誤,如果人先走第一步且不犯錯(cuò)誤,那么人就會(huì)取勝;否則計(jì)算機(jī)會(huì)抓住人的一次錯(cuò)誤使自己成為勝利者。
    *程序與程序注釋
    #include
    #include
    #include
    int input(int t);
    int copu(int s);
    void main()
    {
     int tol=0;
     printf("\n* * * * * * * *catch thirty* * * * * * * \n");
     printf("Game Begin\n");
     randomize(); /*初始化隨機(jī)數(shù)發(fā)生器*/
     if(random(2)==1) /*取隨機(jī)數(shù)決定機(jī)器和人誰先走第一步*/
     tol=input(tol); /*若為1,則余元走第一步*/
     while(tol!=30) /*游戲結(jié)束條件*/
     if((tol=copu(tol))==30) /*計(jì)算機(jī)取一個(gè)數(shù),若為30則機(jī)器勝利*/
     printf("I lose! \n");
     else
     if((tol=input(tol))==30) /*人取一個(gè)數(shù),若為30則人勝利*/
     printf("I lose! \n");
     printf(" * * * * * * * *Game Over * * * * * * * *\n");
    }
    int input(int t)
    {
     int a;
     do{
     printf("Please count:");
     scanf("%d",&a);
     if(a>2||a<1||t+a>30)
     printf("Error input,again!");
     else
     printf("You count:%d\n",t+a);
     }while(a>2||a<1||t+a>30);
     return t+a; /*返回當(dāng)前的已經(jīng)取走的數(shù)累加和*/
    }
    int copu(int s)
    {
     int c;
     printf("Computer count:");
     if((s+1)%3==0) /*若剩余的數(shù)的模為1,則取1*/
     printf(" %d\n",++s);
     else if((s+2)%3==0)
     {
     s+=2; /*若剩余的數(shù)的模為2,則取2*/
     printf(" %d\n",s);
     }
     else
     {
     c=random(2)+1; /*否則隨機(jī)取1或2*/
     s+=c;
     printf(" %d\n",s);
     }
     return s;
    }