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);
}
由計(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);
}