猜数字小游戏的实现
設計一個猜數字的小游戲
下面就是game函數的使用
void game(){int guess = 0;//1.要生成一個隨機數int ret = rand() % 100 + 1;//printf("%d\n", ret);//2.猜數字while (1){printf("請猜數字;>");scanf("%d", &guess);if (guess < ret){printf("猜小了\n");}else if (guess > ret){printf("猜大了\n");}else{printf("恭喜你猜對了\n");break;}}}要生成隨機數要利用rand函數跟srand函數,下面是關于函數的詳細介紹
#include<stdlib.h>//這個是rand跟srand函數的頭文件
rand函數返回的最大值為32767(10進制),默認返回的隨機數的范圍為0——32767
函數返回從 0 到 RAND _ MAX 的偽隨機整數。在調用 rand 之前,使用 srand 函數生成偽隨機數生成器的種子。
Remarks
The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.
備注
srand 函數設置生成一系列偽隨機整數的起點。要重新初始化生成器,請使用 1 作為種子參數。任何其他的種子值都會將生成器設置為隨機的起始點。Rand 檢索生成的偽隨機數。在任何 sr and 調用之前調用 rand 生成的序列與使用種子傳遞為 1 的 srand 相同。
當輸入srand輸入100,我們發現每次的值固定在三位數,但是每次都是一樣的,但是第二次輸入200發現值又變化了,但是還是一樣的,所以只要給srand傳一個隨機數進去那rand會返回一個隨機數給你,即我們只需給srand傳一個一直在變化的值就行。我們電腦上的時間時刻都發生變化,這里我們就引出時間戳的概念。時間戳簡單來說就是這個時間相較于計算機的起始時間之間的一個差值,單位是秒,計算機的起始時間是 ????1970-1-1-0:00
怎么獲得?c語言提供了一個函數time,返回一個時間戳
Time_t轉到定義可以看出返回是是int型,而srand函數正好需要的是unsigned int型,所以我們只需要給srand函數傳一個time函數,time函數返回的是time_t,,所以我們給time函數強制轉換一下就行srand((unsigned int)time());time函數的頭文件是time.h,我們不需要將time函數返回的值存起來就使用空指針NULL存入即可。srand((unsignedint)time(NULL));
這是就產生了不同的值,但是如果快速按兩個1的話輸出的值我們發現還是一樣的,此時還有一點問題
隨機數的生成確實是在rand函數之前要調用srand,但是這個srand不需要頻繁調用,我們只需要在程序運行的時候調用一次就行,如果頻繁的設置這個起點,那么這個數就不夠隨機,解決的方法將srand函數放在main主函數中就行,開始一次游戲調用一次就行,此時就非常隨機了,無論快速按還是,都是隨機的數。
這時就給了我們一個思路,我們如果想生成隨機數首先我們要調用rand生成我們的隨機數,rand使用之前調用我們的srand,但rand的范圍是0-32767,srand的調用要使用time的時間戳,srand只要調用一次就行。但是范圍太大,我們要控制到1-100;我們給rand生成的隨機值%(取模)100,任何一個數字%100之后得到的值只可能是0-99,之后再加1就得到了1-100的數字
這是完整代碼的實現
#include<stdio.h>#include<time.h>#include<stdlib.h>void menu(){printf("*************************************\n");printf("************??? 1.play??? ***********\n");printf("************??? 0.exit??? ***********\n");printf("*************************************\n");}//猜數字游戲的實現void game(){int guess = 0;//1.要生成一個隨機數int ret = rand()%100+1;//printf("%d\n", ret);//2.猜數字while (1){printf("請猜數字;>");scanf("%d", &guess);if (guess < ret){printf("猜小了\n");}else if (guess > ret){printf("猜大了\n");}else{printf("恭喜你猜對了\n");break;}}}int main(){srand((unsigned int)time(NULL));int i = 0;do{menu();printf("請選擇:>");scanf("%d", &i);switch (i){case 1:game();break;case 0://這里只能是選擇0;其他非0的數字如果選了,底下的while邏輯跳不出去。printf("退出游戲\n");break;defult:printf("輸入錯誤,請重新輸入\n");break;}} while (i);return 0;}總結
- 上一篇: 统筹方法 -- 华罗庚
- 下一篇: 旧机宝开发笔记之:目录