C趣味編程百例(30)人機(jī)猜數(shù)游戲

字號(hào):

91.人機(jī)猜數(shù)游戲
     由計(jì)算機(jī)“想”一個(gè)四位數(shù),請(qǐng)人猜這個(gè)四位數(shù)是多少。人輸入四位數(shù)字后,計(jì)算機(jī)首先判斷這四位數(shù)字中有幾位是猜對(duì)了,并且在對(duì)的數(shù)字中又有幾位位置也是對(duì)的,將結(jié)果顯示出來,給人以提示,請(qǐng)人再猜,直到人猜出計(jì)算機(jī)所想的四位數(shù)是多少為止。
     例如:計(jì)算機(jī)“想”了一個(gè)“1234”請(qǐng)人猜,可能的提示如下:
     人猜的整數(shù) 計(jì)算機(jī)判斷有幾個(gè)數(shù)字正確 有幾個(gè)位置正確
     1122 2 1
     3344 2 1
     3312 3 0
     4123 4 0
     1243 4 2
     1234 4 4
     游戲結(jié)束
     請(qǐng)編程實(shí)現(xiàn)該游戲。游戲結(jié)束時(shí),顯示人猜一個(gè)數(shù)用了幾次。
    *問題分析與算法設(shè)計(jì)
     問題本身清楚明了。判斷相同位置上的數(shù)字是否相同不需要特殊的算法。只要截取相同位置上的數(shù)字進(jìn)行比較即可。但在判斷幾位數(shù)字正確時(shí),則應(yīng)當(dāng)注意:計(jì)算機(jī)所想的是“1123”,而人所猜的是“1576”,則正確的數(shù)字只有1位。
     程序中截取計(jì)算機(jī)所想的數(shù)的每位數(shù)字與人所猜的數(shù)字按位比較。若有兩位數(shù)字相同,則要記信所猜中數(shù)字的位置,使該位數(shù)字只能與一位對(duì)應(yīng)的數(shù)字“相同”。當(dāng)截取下一位數(shù)字進(jìn)行比較時(shí),就不應(yīng)再與上述位置上的數(shù)字進(jìn)行比較,以避免所猜的數(shù)中的一位與對(duì)應(yīng)數(shù)中多位數(shù)字“相同”的錯(cuò)誤情況。
    *程序與程序注釋
    #include
    #include
    #include
    void main()
    {
     int stime,a,z,t,i,c,m,g,s,j,k,l[4]; /*j:數(shù)字正確的位數(shù) k:位置正確的位數(shù)*/
     long ltime;
     ltime=time(NULL); /*l:數(shù)字相同時(shí),人所猜中數(shù)字的正確位置*/
     stime=(unsigned int)ltime/2;
     srand(stime);
     z=random(9999); /*計(jì)算機(jī)想一個(gè)隨機(jī)數(shù)*/
     printf("I have a number with 4 digits in mind,please guess.\n");
     for(c=1;;c++) /*c: 猜數(shù)次數(shù)計(jì)數(shù)器*/
     {
     printf("Enter a number with 4 digits:");
     scanf("%d",&g); /*請(qǐng)人猜*/
     a=z;j=0;k=0;l[0]=l[1]=l[2]=l[3]=0;
     for(i=1;i<5;i++) /*i:原數(shù)中的第i位數(shù)。個(gè)位為第一位,千位為第4位*/
     {
     s=g;m=1;
     for(t=1;t<5;t++) /*人所猜想的數(shù)*/
     {
     if(a%10==s%10) /*若第i位與人猜的第t位相同*/
     {
     if(m&&t!=l[0]&&t!=l[1]&&t!=l[2]&&t!=l[3])
     {
     j++;m=0;l[j-1]=t; /*若該位置上的數(shù)字尚未與其它數(shù)字“相同”*/
     } /*記錄相同數(shù)字時(shí),該數(shù)字在所猜數(shù)字中的位置*/
     if(i==t) k++; /*若位置也相同,則計(jì)數(shù)器k加1*/
     }
     s/=10;
     }
     a/=10;
     }
     printf("You hane correctly guessed %d digits,\n",j);
     printf("and correctly guessed %d digits in exact position.\n",k);
     if(k==4) break; /*若位置全部正確,則人猜對(duì)了,退出*/
     }
     printf("Now you have correctly guessed the whole number after %d times.\n",c);
    }