猜數字遊戲(僞隨機數對猜數字遊戲的影響)

猜數字遊戲的實現 

   由系統隨機產生一個100內的數字,要求用戶猜想這個整數。輸入一個猜想想的整數,判斷是否與產生的隨機數相等,由屏幕顯示判斷結果。若是猜得不對,給出「大了」或「小了」的提示,直到猜出這個數爲止。函數

猜數字遊戲的邏輯:

     1.程序自動生成一個隨機的1-100的整數。
     2.用戶來輸入一個整數。
     3.系統會根據輸入狀況來提示用戶,是猜高了,仍是低了,仍是猜對了。

測試


首先,咱們須要一個菜單來實現和用戶的交互:

咱們經過menu()這個函數來實現和用戶的交互,函數的返回值爲choice的值,輸入1表示開始遊戲,輸入0表示退出遊戲。spa

int menu() {
	printf("=============================\n");
	printf(" 1. 開始遊戲\n");
	printf(" 0. 退出遊戲\n");
	printf("=============================\n");
	printf(" 請輸入您的選擇: ");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

 


其次咱們須要來完成這個遊戲函數:

猜數字的邏輯:3d

1. 程序自動生成一個 1-100 的隨機整數。code

2. 從控制檯讀取用戶的輸入。blog

3. 比較用戶輸入的數字和系統生成的數字之間的關係,並給用戶提示。遊戲

void game() {
	// 1. 程序自動生成一個 1-100 的隨機整數. 
	int toGuess = rand() % 100 + 1;
	while (1) {
		// 2. 從控制檯讀取用戶的輸入. 
		printf("請輸入要猜的數字: ");
		int input = 0;
		scanf("%d", &input);
		// 3. 比較用戶輸入的數字和系統生成的數字之間的關係, 並給用戶提示. 
		if (input < toGuess) {
			printf("低了!\n");
		} else if (input > toGuess) {
			printf("高了!\n");
		} else {
			printf("猜對了!\n");
			break;
		}
	}
}

下面咱們在主函數中調用他們,實現猜數字遊戲:

int main() {

	while (1) {
		// 調用菜單函數, 和用戶進行交互
		int choice = menu();
		if (choice == 1) {
			game();
		} else if (choice == 0) {
			printf("程序退出, 再見!\n");
			break;
		} else {
			// 寫程序得考慮到用戶的非法輸入的狀況.
			printf("您的輸入有誤, 請從新輸入!\n");
		}
	}

	system("pause");
	return 0;
}

到此這個猜數字遊戲已經基本實現,下面咱們來測試一下:

咱們能夠看到三次進行遊戲獲得的結果是:第一次42,第二次68,第三次35。input


退出程序,咱們再來玩一次猜數字:

咱們能夠看出:獲得的io

第一個元素始終是42,第二個元素始終是68,第三個元素始終是35……class

 

由此咱們能夠知道當前的猜數字遊戲仍是存在問題的,這個問題是什麼呢?

通過屢次重複運行程序後,獲得的隨機數序列是固定序列。

爲何會出現這個問題呢?

經過查閱一些資料瞭解到:

計算機不可能產生真正的隨機數。在這裏,咱們使用的隨機數是將隨機數種子(srand函數介紹的參數)做爲初始條件,通過必定的計算產生的。

這麼說可能會有一點難以理解,咱們來舉個遊戲中的例子:

好比LOL就有一套獨立的僞隨機機制,以25%暴擊舉例,若是蠻王第一刀沒暴擊,第二刀也沒暴擊,第三刀仍是沒暴擊,那麼第四刀暴擊的概率就會大大的提高(不是25%),相信不少玩遊戲的同窗都會有這種體會,這裏的暴擊就是一個僞隨機數。

那麼怎麼解決這個問題讓僞隨機變成真隨機呢?

上面咱們知道了:隨機數是將隨機數種子(srand函數介紹的參數)做爲初始條件,通過必定的計算產生的。

隨機數種子相同,獲得的隨機數序列就是相同的。

隨機數種子不一樣,獲得的隨機數序列就是不一樣的。

因此,咱們只須要設置不一樣的隨機數種子就能解決這個問題,在這裏咱們使用時間(計算機中用整數表示時間)做爲隨機數種子.


使用srand(time(0))調整隨機數種子。讓咱們運行兩次,來看下代碼的運行結果:

第一次

結果是27,66。


第二次

結果是44,85。

能夠看出調整隨機數種子後,隨機數序列就不一樣了,猜數字遊戲也就實現了。


完整的代碼:

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;
}
相關文章
相關標籤/搜索