分析
猜數字遊戲,顧名思義。就是一個人心裏默想一個數字,然後我們來猜。當然這個被猜想的數字一定是有範圍的。而且一旦被猜者想好後就不能更改。然後我們猜數的一方,根據自己報出的數字,結合被猜者判斷後反饋給我們的信息,我們再重新確定範圍後再一次猜數。依次循環,知道被猜者反饋給我們猜對了的信息後。猜數遊戲才結束。
如果交由計算機來做的話。我們需要先實現規定好猜數範圍。利用計算機自己生成的隨機數來當做被猜者心中的數值。然後用戶輸入自己所猜想的數字,計算機通過屏幕反饋信息。直到猜對了,單次的猜數遊戲纔算結束。
步驟總結
- 確定數值範圍,再讓計算機生成隨機數。
- 用戶輸入自己所猜想的數。和已經生成的隨機數比較,從而影響接下來的過程。.
- 若猜測錯誤,則通過屏幕反饋信息,並再次要求用戶輸入數據;
若猜測正確,則結束這次遊戲。
以上則是大體思路。具體分佈實現過程見下文。
分步實現
第一步
再遊戲開始之前,需要通過屏幕提供用戶一定的信息。用戶可以在這裏決定要不要玩這個遊戲。
如果玩這個遊戲,則開始猜數遊戲,如果不玩,則可以關閉改程序。
(如果提供這些信息,用戶可能一臉懵逼,畢竟程序是爲了讓使用者更好的使用,而不是身爲牀罩這的我們單純的能自己自娛自樂)
所以我們需要給該程序提供一個主菜單
主菜單MENU1()函數
void MENU1()
{
printf("\t\t\t\t歡迎來到猜數字遊戲\n\t\t系統將給出一個100以內的隨機數作爲答案,供你猜想\n");
printf("\t\t ########################################\n");
printf("\t\t ###### *1:開始遊戲 ######\n");
printf("\t\t ###### *2:退出遊戲 ######\n");
printf("\t\t ########################################\n");
}
第二步
用戶在看到主菜單之後,會根據以獲取的信息進行功能選擇,由塊代碼剋制,我們至少需要實現兩個功能。暨1.實現猜數遊戲的運轉。2.退出這個遊戲。所以我們需要分支語句來進行條件匹配的選擇。最好是用的就是switch語句,簡單粗暴。
int main()
{
srand((unsigned long)time(NULL));//隨機數種子
MENU1();
int a = 0;
while (1)
{
scanf("%d", &a);
switch (a)
{
case 1:PLAY(); goto loop;//break;//goto
case 2:
printf("遊戲結束");
return 0;//提前結束主函數,使得遊戲退出
default:printf("請輸入正確編號\n");
}
loop:break;
}return 0;
system("pause");
}
其中,由於用戶看到的功能選項是1和2所以用戶一般都會從鍵盤輸入相應的數字,來試圖實現對應的功能。所以我們聲明一個變量a。使用戶的選擇賦值到a中,最後通過switch(a)和case搭配來實現相對應的功能的跳轉。但是如果用戶非要輸入除了這1和2以外的數呢,我們就需要提示用戶,輸入的功能號錯誤。同時爲了避免多次重複輸入錯誤額,我們將其放入到一個死循環中,通過功能1和2的return 和goto來結束main(),非1和2的輸入值將永遠循環提示用戶輸入錯誤,知道功能號對應正確。
第三步
猜數遊戲主體
已知數據範圍是0-100,所以用戶通過不斷的試驗,在結合程序的結果(用戶猜大了,還是猜小了)幫助用戶不斷調賬所猜測數字的區間,最終逼近被猜數字,直到猜測正確。
void PLAY()
{
int n = 0;
do
{
n = rand() % 100 + 1;//膜100+1使得n的範圍爲【0-100】
int x = 0;
printf("請輸入你猜想的數字\n");
scanf("%d", &x);
if (n > x)
{
printf("你所猜的數字%d小了", x);
}
else if (n < x)
{
printf("你所猜的數字%d大了", x);
}
else
{
printf("你所猜的數字%d是正確的\n", x);
MENU2();
int z = 0;
scanf("%d", &z);
if (z == 2){
printf("byebye\n");
break;
}
}
} while (1);
}
在用戶才正確後,如果用戶想繼續玩或者想退出的話,就有需要實現這兩項功能。所以我們需要再列出一個小菜單
void MENU2()
{
printf("\t\t ########################################\n");
printf("\t\t ###### *1:再來一局 ######\n");
printf("\t\t ###### *2:退出遊戲 ######\n");
printf("\t\t ########################################\n");
}
先關的實現關係在上圖play()函數中最後一個else處。因爲已經猜數正確,所以這時用戶如果輸入1的話就不會進入if(z==2)的判定,從而使的break無法執行,從而在play函數中繼續循環。
n = rand() % 100 + 1;//膜100+1使得n的範圍爲【0-100】
這一句是在整個do while循環裏面的,所以導致了,循環沒做一遍,這條語句都要執行一次。這條語句結合一下這條代碼。通過下面這條代碼種下一個隨機數種子。再使上面那條代碼中的rand()生成一個隨機數。ok這下隨機數已經有了,但是如何確定範圍呢。仔細看在rand()後面還有%100+1
這一整句話就是一個隨機數膜100+1;從而確定了範圍邊界是【1,100】(任何int數%100的範圍是0-99)
srand((unsigned long)time(NULL));//隨機數種子
總結
play函數中的退出時利用goto語句跳轉處main()函數中的循環從而結束程序的