游戲要求
- 自動(dòng)生成隨機(jī)數(shù)的范圍:0-99
- 玩家猜數(shù)字,猜數(shù)字的過程中,根據(jù)猜測(cè)數(shù)據(jù)的大小給出大了或小了的反饋,直到猜對(duì),游戲結(jié)束
生成隨機(jī)數(shù)
根據(jù)游戲要求,第一步就是先生成隨機(jī)數(shù),這里我們主要利用到三種函數(shù) rand
、 srand
、 time
函數(shù)。所以下面依次介紹這三種函數(shù)。
rand 函數(shù)
int rand (void);
//rand 函數(shù)的使用需要包含一個(gè)頭文件:stdlib.h
我們來(lái)看一段代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
運(yùn)行結(jié)果
分析:
-
rand
函數(shù)可以用來(lái)生成一個(gè)隨機(jī)數(shù),可惜是偽隨機(jī)數(shù),范圍是在 0 ~ RAND_MAX 之間,RAND_MAX 大小依賴編譯器實(shí)現(xiàn),但大部分編譯器是 32767。 - 第一次生成5個(gè)相對(duì)隨機(jī)的數(shù),但是第二次運(yùn)行程序生成的結(jié)果和第一次一模一樣!
- rand函數(shù)生成的隨機(jī)數(shù)是偽隨機(jī)的。
- 偽隨機(jī)數(shù)不是真正的隨機(jī)數(shù),是通過某種算法生成的隨機(jī)數(shù)。
- 真正的隨機(jī)數(shù)是無(wú)法預(yù)測(cè)下一個(gè)值是多少的。
-
rand
函數(shù)是對(duì)一個(gè)叫”種子“的基準(zhǔn)值進(jìn)行運(yùn)算生成的隨機(jī)數(shù)。 -
rand
函數(shù)生成隨機(jī)數(shù)的默認(rèn)種子是 1。
那么怎么樣才能讓每一次運(yùn)行的結(jié)果不一樣呢?即每一次運(yùn)行都產(chǎn)生不同的隨機(jī)數(shù)。這是注意到上述代碼中 rand
函數(shù)的種子沒有變化,若讓種子變化,那么每次是否就生成不同的隨機(jī)數(shù)了?
srand 函數(shù)
void srand (unsigned int seed);
- 怎么樣讓種子發(fā)生變化呢?在調(diào)用
rand
函數(shù)之前先調(diào)用srand
函數(shù)試試。 - 在C語(yǔ)言中,可通過
srand
函數(shù)的參數(shù)seed
來(lái)設(shè)置rand
函數(shù)生成隨機(jī)數(shù)的時(shí)候的種子,當(dāng)種子發(fā)生變化,每次生成的隨機(jī)數(shù)序列也就變化起來(lái)了。 -
srand
函數(shù)是不需要頻繁調(diào)用的,一次運(yùn)行的程序中調(diào)用一次就夠了。 - 那我們?cè)趺礃硬拍軐?shí)現(xiàn)種子的變化呢?
- 時(shí)間!時(shí)間是一直在變化的,如果種子設(shè)置成與時(shí)間相關(guān),那不就實(shí)現(xiàn)了變化的種子了?
time 函數(shù)
time_t time (time_t* timer);
// time 函數(shù)使用的時(shí)候需要包含頭文件:time.h。
//如果只是讓 `time` 函數(shù)返回時(shí)間戳,可以這樣寫
time (NULL); //調(diào)用 time 函數(shù)返回時(shí)間戳,這里沒有接收返回值
-
time
函數(shù)會(huì)返回當(dāng)前的日歷時(shí)間,其實(shí)返回的是1970年1月1日0時(shí)0分0秒到現(xiàn)在程序運(yùn)行時(shí)間之間的差值,單位是秒。- 返回的類型是
time_t
類型的,time_t
類型本質(zhì)上其實(shí)就是32位或者64位的整型類型。
- 返回的類型是
-
time
函數(shù)的參數(shù)timer
- 如果是 非NULL 的指針的話,函數(shù)也會(huì)將這個(gè)返回的差值放在
timer
指向的內(nèi)存中帶回去。 - 如果是 NULL,就只返回這個(gè)時(shí)間的差值。
-time
函數(shù)返回的這個(gè)時(shí)間差也被叫做:時(shí)間戳。
- 如果是 非NULL 的指針的話,函數(shù)也會(huì)將這個(gè)返回的差值放在
對(duì)上文代碼進(jìn)行優(yōu)化
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int) time (NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
運(yùn)行結(jié)果
- 對(duì)上述代碼運(yùn)行四次,我們可發(fā)現(xiàn)每一次的結(jié)果均不相同。這就是因?yàn)槲覀兠恳淮芜\(yùn)行代碼時(shí),產(chǎn)生隨機(jī)數(shù)的種子發(fā)生變化了。
- 這樣,對(duì)隨機(jī)數(shù)游戲?qū)崿F(xiàn)的第一步“生成隨機(jī)數(shù)“就完成了。
確定生成隨機(jī)數(shù)的范圍
- 經(jīng)上述討論,我們可以發(fā)現(xiàn),隨機(jī)數(shù)生成后,隨機(jī)數(shù)的數(shù)值有的很小,有的很大,完全超出了我們要求的“產(chǎn)生 0-99 以內(nèi)的隨機(jī)數(shù)”。那么如何設(shè)置生成的隨機(jī)數(shù)的范圍呢?
- 求模操作?。。?/li>
如果要生成 0~99 之間的隨機(jī)數(shù),方法如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-688035.html
rand() % 100; //余數(shù)的范圍是0~99
猜數(shù)字游戲?qū)崿F(xiàn)
既然隨機(jī)數(shù)及其范圍確定了,那么隨機(jī)數(shù)生成的邏輯呢?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-688035.html
- 進(jìn)入游戲
- 生成隨機(jī)數(shù)
- 玩家輸入一個(gè)猜測(cè)的數(shù)值
- 判斷
- 如果與生成的隨機(jī)數(shù)一樣,則玩家勝利
- 如果不一致,判斷與生成的隨機(jī)數(shù)的大小,輸出比較的結(jié)果
- 玩家再次輸入猜測(cè)的數(shù)值
- 再次重復(fù)判斷
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
int r = rand()%100;
int guess = 0;
while(1)
{
printf("請(qǐng)猜數(shù)字:>>>");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if(guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜對(duì)了\n");
}
}
}
void menu()
{
printf("**************************************\n");
printf("**********歡迎來(lái)到猜數(shù)字游戲**********\n");
printf("**************************************\n");
printf("**********輸入 1 --> 進(jìn)入游戲*********\n");
printf("**************************************\n");
printf("**********輸入 2 --> 退出游戲*********\n");
printf("**************************************\n");
printf("**************************************\n");
}
int main()
{
int input = 0;
srand((unsigned int) time(NULL));
do
{
menu ();
printf("請(qǐng)選擇:>>>");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("游戲結(jié)束\n");
break;
default:
printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");
break;
}
}while(input);
return 0;
}
到了這里,關(guān)于利用隨機(jī)數(shù)生成猜數(shù)字游戲【C語(yǔ)言】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!