文章目錄
- 一、游戲思路揭秘
- 二、隨機數生成大法
- 1、初探隨機數:rand函數的魔力
- 2、隨機數種子:時間的魔法
- 3、抓住時間的精髓:time函數
- 三、完善程序
- 四、游戲成果
- 1、游戲效果
- 2、源代碼
一、游戲思路揭秘
猜數字游戲,這個聽起來就讓人心跳加速的小游戲,它的核心奧秘在于隨機數。游戲的過程就像是一場尋寶探險:生成寶藏(隨機數),玩家根據提示一步步接近寶藏,直到最終發現它。如果猜對了,那就是一場勝利的歡呼;如果猜錯了,游戲會像個耐心的導師,告訴你 “猜大了” 或 “猜小了” ,然后鼓勵你繼續嘗試,直到你找到那個神秘的數字。
二、隨機數生成大法
1、初探隨機數:rand函數的魔力
在C語言的神秘寶庫中,有一個叫rand的函數。它的魔力就是:每次你呼喚它,它都會變出一個新的隨機數來。不信?那我們就來試試看:
#include <stdio.h>
#include <stdlib.h>int main()
{for(int i = 0; i < 10; i++)//重復試幾次{int random = rand();//這里生成隨機數printf("%d ",random);//先打印出來看看}return 0;
}
接下來運行幾次測試一下,會得到重復的運行結果:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
哎呀,怎么每次運行結果都一樣啊?還好我們測試了一下,這是一個好習慣,可以避免無法預料的結果。
那怎么解決呢?當然是查文檔啦:文檔地址。
由以上文檔可知:rand函數的隨機值是由一個算法生成的,該算法在每次調用它時都會返回一個明顯不相關的數字序列。該算法使用種子來生成序列,該序列應使用srand方法初始化為某個唯一值。
2、隨機數種子:時間的魔法
那我們再看看srand方法:文檔地址。
要得到真正的隨機數,我們需要給rand函數一個種子,這個種子每次都要不一樣。那用什么來做種子呢?時間!時間就像流水,永遠在變,用它來做種子,隨機數就會像魔法一樣變化無窮。
3、抓住時間的精髓:time函數
在C語言中,有一個time函數,它能獲取當前的時間戳。時間戳就像是一個時間的指紋,每個時刻都有它獨特的印記。
好,那我們就用時間來給rand函數設置種子,看看真正的隨機數是怎么誕生的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main()
{srand(time(NULL));//用時間設置種子for(int i = 0; i < 10; i++){int a = rand();printf("%d ",a);}return 0;
}
運行幾次程序,得到以下輸出:
22820 1628 32269 9569 7902 21478 16516 18171 16466 6404
哈哈,看,這次隨機數真的變魔術一樣變出來了!每次運行結果都不一樣,太棒了!
三、完善程序
現在,我們已經掌握了隨機數的奧秘,那就來打造一個完美的猜數字游戲吧!這個游戲將是一個if、switch、while、for、do…while、goto語句的完美結合:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>//顯示游戲菜單
void menu()
{printf("**********************************\n");printf("*********** 1.play *************\n");printf("*********** 0.exit *************\n");printf("**********************************\n");
}//游戲主邏輯
void game()
{int random_num = rand() % 100 + 1;//生成1到100之間的隨機數int input = 0;//用戶輸入的猜測數字int num = 0;//記錄用戶猜測的次數while (1)//無限循環{printf("請輸入猜的數字(1-100):");scanf("%d", &input);//讀取用戶輸入//清空輸入緩存,防止輸入錯誤導致的問題for (int i = getchar(); i != '\n'; i = getchar());num++;//猜測次數加1if (input > random_num){if (num >= 10)//如果猜測次數超過10次goto byby;//跳轉到游戲結束標簽system("cls");printf("猜大了!\n");}else if (input < random_num){if (num >= 10)goto byby;system("cls");printf("猜小了!\n");}else{system("cls");printf("恭喜你,猜了%d次就猜對了!\n", num);getchar();//等待用戶按下回車鍵system("cls");return;//返回主函數}}
byby:system("cls");printf("很遺憾,你沒有在規定次數內猜到%d,游戲結束!\n", random_num);//游戲結束提示getchar();system("cls");
}int main()
{int input = 5;//用戶輸入的選擇srand((unsigned)time(NULL));//初始化隨機數種子do{menu();//顯示菜單printf("請選擇(1/0):");scanf("%d", &input);//清空輸入緩存,防止輸入錯誤導致的問題while (getchar() != '\n')input = 2;switch (input)//根據用戶選擇執行不同操作{case 1://選擇1system("cls");printf("開始游戲!\n");getchar();//等待用戶按下回車鍵system("cls");game();break;case 0://選擇0system("cls");printf("退出游戲!\n");break;default:system("cls");printf("選擇錯誤!\n");//輸入錯誤,提示用戶重新輸入getchar();system("cls");break;}} while (input);//當用戶選擇0時退出循環return 0;//程序正常結束
}
這個游戲就像是一個小小的編程世界,里面充滿了分支和循環的魔法。如果你還不太熟悉這些控制語句,那就快去查查資料,學學它們的魔法吧!學會了這些,你就能更好地掌握這個游戲,甚至還能打造出更多屬于你的編程小宇宙呢!
四、游戲成果
1、游戲效果
經過一系列的開發與調試,游戲的最終效果已經呈現。現在,你可以盡情享受猜數字的樂趣了:
2、源代碼
為了方便大家學習和交流,游戲的源代碼已經在Gitee上開源。你可以通過以下鏈接訪問并下載源代碼:傳送門。