猜數字遊戲(僞随機數對猜數字遊戲的影響)
發表時間:2020-10-19
發布人:葵宇科技
浏覽次數:42
猜數字遊戲的實現
由體系随機産生一個(gè)100内的數字,請求用戶猜測這個(gè)整數。輸入一個(gè)猜猜想的┞符數,斷定是否與産生的随機數相等,由屏幕顯示斷定結不雅。如(rú)不雅猜得纰謬,給出“大年夜了”或“小了”的提示,直到猜出這個(gè)數為止。
猜數字遊戲的邏輯:
1.法度榜樣主動(dòng)生成一個(gè)随機的1-100的┞符數。
2.用戶來輸入一個(gè)整數。
3.體系會根據輸情面況來提示用戶,是猜高了,照樣低了,照樣猜對了。
起首,我們須要一個(gè)菜單來實現和(hé)用戶的交互:
我們經由過程menu()這個(gè)函數來實現和(hé)用戶的交互,函數的返回值為choice的值,輸入1表示開端遊戲,輸入0表示退出遊戲。
int menu() {
printf("=============================\n");
printf(" 1. 開端遊戲\n");
printf(" 0. 退出遊戲\n");
printf("=============================\n");
printf(" 請輸入您的選擇: ");
int choice = 0;
scanf("%d", &choice);
return choice;
}
其次我們須要來完成這個(gè)遊戲函數:
猜數字的邏輯:
1. 法度榜樣主動(dòng)生成一個(gè) 1-100 的随機整數。
2. 大年夜控制台攫取用戶的輸入。
3. 比較用戶輸入的數字和(hé)體系生成的數字之間的關(guān)系,并給用戶提示。
void game() {
// 1. 法度榜樣主動(dòng)生成一個(gè) 1-100 的随機整數.
int toGuess = rand() % 100 + 1;
while (1) {
// 2. 大年夜控制台攫取用戶的輸入.
printf("請輸入要猜的數字: ");
int input = 0;
scanf("%d", &input);
// 3. 比較用戶輸入的數字和(hé)體系生成的數字之間的關(guān)系, 并給用戶提示.
if (input < toGuess) {
printf("低了!\n");
} else if (input > toGuess) {
printf("高了!\n");
} else {
printf("猜對了!\n");
break;
}
}
}
下(xià)面我們在主函數中(zhōng)調用他們,實現猜數字遊戲:
int main() {
while (1) {
// 調用菜單函數, 和(hé)用戶進行交互
int choice = menu();
if (choice == 1) {
game();
} else if (choice == 0) {
printf("法度榜樣退出, 再會!\n");
break;
} else {
// 寫法度榜樣得推敲到用戶的不法輸入的情況.
printf("您的輸入有誤, 請從新輸入!\n");
}
}
system("pause");
return 0;
}
到此這個(gè)猜數字遊戲已經根本實現,下(xià)面我們來測試一下(xià):
我們可(kě)以看到三次進行遊戲獲得的結不雅是:第一次42,第二次68,第三次35。
退出法度榜樣,我們再來玩一次猜數字:
我們可(kě)以看出:獲得的
第一個(gè)元素始終是42,第二個(gè)元素始終是68,第三個(gè)元素始終是35……
由此我們可(kě)以知道當前的猜數字遊戲照樣存在問(wèn)題的,這個(gè)問(wèn)題是什麼呢(ne)?
經由多次反複運行法度榜樣後,獲得的随機數序列是固定序列。
為什麼會出現這個(gè)問(wèn)題呢(ne)?
經由過程查閱一些材料懂得到:
計算機弗成能産生真正的随機數。在這裡,我們應用的随機數是将随機數種子(zǐ)(srand函數介紹的參數)作為初始前提,經由必定的計算産生的。
這麼說可(kě)能會有一點難以懂得,我們來舉個(gè)遊戲中(zhōng)的例子(zǐ):
比如(rú)LOL就有一套自力的僞随機機制,以25%暴擊舉例,如(rú)不雅蠻王第一刀沒暴擊,第二刀也沒暴擊,第三刀照樣沒暴擊,那麼第四刀暴擊的幾率就會大年夜大年夜的晉升(不是25%),信賴很多玩遊戲的同窗都邑有這種領會,這裡的暴擊就是一個(gè)僞随機數。
那麼怎麼解決這個(gè)問(wèn)題讓僞随機變成真随機呢(ne)?
膳绫擎我們知道了:随機數是将随機數種子(zǐ)(srand函數介紹的參數)作為初始前提,經由必定的計算産生的。
随機數種子(zǐ)雷同,獲得的随機數序列就是雷同的。
随機數種子(zǐ)不合,獲得的随機數序列就是不合的。
所以,我們隻須要設置不合的随機數種子(zǐ)就能解決這個(gè)問(wèn)題,在這裡我們應用時光(計算機頂用整數表示時光)作為随機數種子(zǐ).
應用srand(time(0))調劑随機數種子(zǐ)。讓我們運行兩次,來看下(xià)代碼的運行結不雅:
第一次
結不雅是27,66。
第二次
結不雅是44,85。
可(kě)以看出調劑随機數種子(zǐ)後,随機數序列就不合了,猜數字遊戲也就實現了。
完全的代碼:
VS2013
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int menu() {
printf("=============================\n");
printf(" 1. 開端遊戲\n");
printf(" 0. 退出遊戲\n");
printf("=============================\n");
printf(" 請輸入您的選擇: ");
int choice = 0;
scanf("%d", &choice);
return choice;
}
void game() {
int toGuess = rand() % 100 + 1;
while (1) {
printf("請輸入要猜的數字: ");
int input = 0;
scanf("%d", &input);
if (input < toGuess) {
printf("低了!\n");
}
else if (input > toGuess) {
printf("高了!\n");
}
else {
printf("猜對了!\n");
break;
}
}
}
int main() {
srand(time(0));
while (1) {
int choice = menu();
if (choice == 1) {
game();
}
else if (choice == 0) {
printf("法度榜樣退出, 再會!\n");
break;
}
else {
printf("您的輸入有誤, 請從新輸入!\n");
}
}
system("pause");
return 0;
}