很久之前我就先自己編寫猜數(shù)字這個小游戲。這里先附上我從百度百科搜到對猜數(shù)字的規(guī)則。
游戲規(guī)則如下:
通常由兩個人玩,一方出數(shù)字,一方猜。出數(shù)字的人要想好一個沒有重復(fù)數(shù)字的4位數(shù),不能讓猜的人知道。猜的人就可以開始猜。每猜一個數(shù)字,出數(shù)者就要根據(jù)這個數(shù)字給出幾A幾B,其中A前面的數(shù)字表示位置正確的數(shù)的個數(shù),而B前的數(shù)字表示數(shù)字正確而位置不對的數(shù)的個數(shù)。
如正確答案為 5234,而猜的人猜 5346,則是 1A2B,其中有一個5的位置對了,記為1A,而3和4這兩個數(shù)字對了,而位置沒對,因此記為 2B,合起來就是 1A2B。
接著猜的人再根據(jù)出題者的幾A幾B繼續(xù)猜,直到猜中(即 4A0B)為止。
百度百科鏈接如下 http://baike.baidu.com/view/358630.htm
規(guī)則明白之后,其實我們要做的事情就很明確了。
第一步:我們就是要讓計算機(jī)隨機(jī)產(chǎn)生一個0-9不重復(fù)的4位數(shù)
第二步:我們要輸入自己所猜的4個0-9不重復(fù)的數(shù)字
第三步:判斷我們所猜的數(shù)字和計算機(jī)隨機(jī)的數(shù)字是否吻合,如果不為4A0B,返回第二步
思路明確之后,就是嘗試這這些思路轉(zhuǎn)化為c語言,用c語言的方式表達(dá)出來。
現(xiàn)在我們來完成第一步,第一步比較簡單。我們可以使用 rand() 來產(chǎn)生一個隨機(jī)數(shù),不過由于這個函數(shù)產(chǎn)生的隨機(jī)數(shù)為一個偽隨機(jī)數(shù),所以我們必須在一句 srand(time(NULL)); 具體為什么,百度上有很多,我就不再闡述了。不過讀者可以下載我的程序,試試把這句話去掉有什么不一樣,一試便知。在生產(chǎn)隨機(jī)數(shù)時,我們還要確保所生成的隨機(jī)數(shù),不能用重復(fù)數(shù)字,具體實現(xiàn)代碼如下。
void getTheGuessNum()
{
int i,j;
int flag = 0; //是否有數(shù)字重復(fù)標(biāo)記位。
srand(time(NULL));
for (i = 0;i < 4;)
{
guess_num[i] = rand() % 10; //產(chǎn)生0-9的隨機(jī)數(shù)
for (j = 0;j < i;j ++)
{
if (guess_num[j] == guess_num[i]) //四個數(shù)字有重復(fù),退出內(nèi)嵌for
{
flag = 1;
break;
}
flag = 0;
}
if (flag == 0) //如果沒有重復(fù)值,i++,生成下一個隨機(jī)數(shù)
{
i++;
}
}
}
【注】guess_num為一個全局?jǐn)?shù)組變量。
第一步實現(xiàn)了,我們就要進(jìn)行我自認(rèn)為最難得一步了。那就是輸入四個數(shù)字。也許有朋友會笑我,不就是輸入 4 個數(shù)字而已嗎?使用 scanf 函數(shù)不就完事了嗎?被你的那么難,你是唬人的吧!對于那些初學(xué)者來說,他們很有可能編寫如下的程序:
int num1,num2,num3,num4;
scanf("%d%d%d%d",&num1,&num2,&num3,&num3);
對于學(xué)過數(shù)組的朋友來說,他們可能會這樣寫
int num[4],i;
for(i = 0;i < 4;i ++)
scanf("%d",&num[i]);
你說以上代碼有問題。確實,以上代碼沒有什么問題,不過那是在對于完完全全輸入正確的基礎(chǔ)上而言的。不理解我這句話的意思。那我就寫一個小程序給你們瞧瞧(其實我也是菜鳥,高手看到請不要噴我)
#include <stdio.h>
void main()
{
int a;
printf("請輸入一個數(shù)字:");
scanf("%d",&a);
printf("a = %d\n",a);
}
以上這么一個程序,大家看看有沒有錯誤。其實我可以很負(fù)責(zé)的告訴大家,這段代碼完全沒有任何錯誤的。如果在輸入一個數(shù)字的情況下,完全可以打印出 a 的值。那如果就是有人存心搞怪,輸入一個非數(shù)字的情況下會這么樣呢?不要認(rèn)為這是不可能的事。假如,我輸入 hgj ,那么 a 的值會為多少呢?截圖如下:
至此,大家明白我要表達(dá)的意思了沒有?不明白的話,請從頭看。哈哈。。。。如果明白了,則請繼續(xù)看下去。
如果大家明白了問題所在,那么這個問題要如何解決了?如果我告訴大家我在輸入4 個數(shù)字壓根沒有使用 scanf() 函數(shù),大家會相信嗎?其實我使用的函數(shù)為 getchar() 。大家看到這個函數(shù)的時候,應(yīng)該會感到很奇怪,這個函數(shù)不是用于輸入一個字符的嗎?怎么可以用來輸入 4 個數(shù)字呢?其實我在寫第一個程序的時候確實是使用 scanf() 函數(shù),代碼如下
int inputTheNum()
{
int i,j;
for(i = 0;i < 4;)
{
// printf("請輸入第%d個數(shù)字:",i);
if(scanf("%d",&input_num[i]) == 1) //輸入正確
{
i ++;
}
else //輸入錯誤
{
fflush(stdin); //清除輸入內(nèi)容
return 3;
}
}
for(i = 0;i<4;i ++)
{
if(input_num[i] < 0 || input_num[i] > 9)
return 2;
for(j = 0;j < i; j ++)
{
if(input_num[j] == input_num[i])
{
return 1;
}
}
}
return 0;
}
scanf() 是有返回值的,具體可以查看百度百科 http://baike.baidu.com/view/1390039.htm ,這里我也不想說太多了。我剛剛開始這樣寫有一個壞處,那就是我輸出 4 個數(shù)字的時候必須用空格或者回車或者 tab 鍵分開,只是是太麻煩。因為這幾個數(shù)字都是一位數(shù)的。有時候我想輸入 1 , 2 , 3 , 4 結(jié)果我輸入 1234 之后回車,但是函數(shù) inputTheNum() 就只把 1234 保存在 input_num 的第一個元素里。這時候我又不得不輸入另外 3 個數(shù)字。雖然我知道我這是在做無用功,不過我沒辦法。因為我就想改近一下這個函數(shù),最后我使用如下的方法:
typedef enum
{
SUCCESS,
ILLEFAL_CHAR,
NUMBER_REPEATED,
NUMBER_BEYOND,
NUMBER_WITHIN
}return_type;
int inputTheNum()
{
int temp;
int count = 0;
int i,j;
while(1)
{
temp = getchar();
if (temp == '\n')
{
break;
}
else if (temp >= '0' && temp <= '9')
{
if (count < 4)
{
input_num[count] = temp - 0x30;
count ++;
}
else
{
while(getchar() != '\n');
return NUMBER_BEYOND;
}
}
else if(temp == ' ' || temp == '\t')
{
continue;
}
else
{
while(getchar() != '\n');
return ILLEFAL_CHAR;
}
}
if (count != 4)
{
return NUMBER_WITHIN;
}
for(i = 0;i<4;i ++)
{
for(j = 0;j < i; j ++)
{
if(input_num[j] == input_num[i])
{
return NUMBER_REPEATED;
}
}
}
return SUCCESS;
}
如果我輸入的是回車鍵,那么我就結(jié)束這次輸入。如果我輸入的空格或者 tab 鍵,我將忽略這次輸入。如果我輸入的字母或者符號,我則返回一個錯誤信息。如果我輸入的是一個字符 '0'-'9', 我就將其轉(zhuǎn)為為數(shù)字 0-9 之后保存在數(shù)據(jù)里。如果輸入的數(shù)字的過多或者過少,我都將返回相應(yīng)的信息。至此,輸入過程就完成了。
接下來的一步,比較簡單,那就是比較輸入的數(shù)字和計算機(jī)所給的數(shù)字??纯创鸢甘菐? A 幾 B
具體算法如下:
void comparisonTheNum()
{
int i,j;
for(i = 0; i < 4; i ++)
{
for(j = 0;j < 4; j ++)
{
if(input_num[j] == guess_num[i] && i == j)
{
A_num ++;
}
else if(input_num[j] == guess_num[i])
{
B_num ++;
}
}
}
}
這個算法很簡單,不再說明。
整個猜數(shù)字的主要三個子函數(shù)已經(jīng)實現(xiàn),那么主函數(shù),也就清晰明了。這里也不再講述。實在不知道怎么寫的人,可以參考我的資料。 http://download.csdn.net/detail/tianshi_kco/4605873
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

