首先,介紹游戲要實作的內容:
1.系統隨機生成一個數字(1-100),這里規定1-100的范圍
2.玩家根據系統的提示--猜的大了、猜的小了,來更改猜的數值
3.繼續游戲或者讓玩家選擇,
分析:
為滿足玩家可以選擇繼續游戲或者退出,應該又一個回圈來完成,
首先用戶進去肯定要看到選單,說明,這個回圈體是do while型的(因為最少會執行一次)
代碼如下:
#include<stdio.h>
void menu()
{
printf("****************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("****************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
}while(input); //這里回圈結束條件正好對應用戶選擇輸入的0,可以將input設定為結束條件
return 0;
}
那為滿足用戶選擇的0 / 1 或者輸入錯誤的值,用switch陳述句來實作需求:
int main()
{
int input = 0;
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game(); //這里進入游戲函式
break;
case 0:
printf("游戲結束!祝您生活愉快^-^\n");
break;
default:
printf("輸入錯誤請重新輸入!\n");
break;
}
} while (input);
return 0;
}
那由于我們需要隨機生成1-100的數,而rand函式正好可以實作這個功能,
我們用rand函式生成亂數看一下:

觀察到隨機生成的數字竟然一樣,這顯然不能滿足玩家玩游戲的需求
觀察rand函式生成數的特點:
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.
rand函式回傳范圍為0到rand_MAX的偽隨機整數,在呼叫rand之前,請使用srand函式為偽亂數生成器設定種子,
看來,我們需要呼叫srand函式來為偽亂數生成種子,對代碼進行改進:
注:rand函式頭檔案<stdlib.h>,srand函式頭檔案<stdlib.h>
可又有了新問題:


經過srand生成種子之后,rand生成的數不會變化了,但是srand的引數需要我們手動輸入變化的值,到哪里參考一個不斷變化的值呢?
時間戳完美解決了這個問題:
x時間戳(英文為Unix epoch, Unix time, POSIX time 或 Unix timestamp)
是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒,
時間是不斷變化的數,那我們就生成一個時間戳吧:
time()函式可以生成當前時間下的時間戳,(就是一個大整數)
time函式頭檔案:<time.h>有關time函式可以看我函式專題的博客,
但是:
srand的引數型別是unsigned int型的,
time函式回傳的是time_t型別的數,
因此,在使用time函式生成隨機大整數的時候,需要強制型別轉換成unsigned int型,
那又由于我們需要的是1-100的整數,所以就將獲得的值%100+1
因為一局游戲只需要一個不變的數,所以將生成亂數的程序弄到main函式中,
代碼如下:
void game()
{
//為保證每局生成的數字都不一樣,引入時間戳
//因為srand接收的是 unsigned int 型的資料,所以需要強轉,
//因為一局游戲只需要一個不變的數,所以將生成亂數的程序弄到main函式中,
int ret=rand()%100+1;
//printf("%d\n", ret);
printf("請開始猜數字:");
while (1)
{
int guess = 0;
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("猜對了!!!\n");
break;
}
}
}
最終再附上main函式代碼:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戲結束!祝您生活愉快^-^\n");
break;
default:
printf("輸入錯誤請重新輸入!\n");
break;
}
} while (input);
return 0;
}
結束!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414000.html
標籤:其他
