小游戏系列——猜数字游戏
【聲明】:這里博主推出一個小游戲給鐵汁們,用來增強鐵汁們學習C語言的熱情,真的很簡單哦,快來康康吧。
猜數字小游戲
注意,由于這篇是為了剛入門計算機專業的鐵汁們準備的,目的是增加大家對于學習編程的熱情,所以就沒有按照項目工程那樣分為聲明、定義、測試模塊,筆者在這里就直接寫在測試一欄里了。不要給自己設限,當自己實現出來的時候,你會發現真的很簡單,和筆者一起加油哦。
描述:電腦隨機生成一個1~100之間的數字,要求玩家去猜數字。
- 玩家猜小了,電腦會告訴,猜小了;
- 玩家猜大了,電腦會告訴,猜大了;
- 玩家猜中了,電腦會告訴,恭喜你,猜對了
下面,我先把這個游戲的大致邏輯給寫出來,幫助大家更好的上手。
#include<stdio.h>//菜單 void menu() {printf("*****************************\n");printf("***** 1.play *****\n");printf("***** 0.exit *****\n");printf("*****************************\n"); } int main() {int input = 0;//用do...while語句更合適一些,因為程序剛執行就要把菜單打印出來do{menu();printf("請選擇:>");scanf("%d", &input);switch (input){case 1:printf("猜數字\n");break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤\n");break;}} while (input);return 0; }其實邏輯很簡單,下面只要把
printf("猜數字\n");封裝成一個函數,用來實現猜數字的功能就行啦。
此時執行代碼是這樣的:
是不是看起來很簡單,下面我將猜數字的過程給實現出來,那么這個小游戲就完成啦。
//實現猜數字過程 #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 guess = 0;//0~32767之間的范圍太大了,本題要的是1~100之間即可int r = rand() % 100 + 1;//1~100 rand() % 100 -> 0~99//猜數字while (1){printf("猜數字:>");scanf("%d", &guess);if (guess < r){printf("猜小了\n");}else if (guess > r){printf("猜大了\n");}else{printf("恭喜你,猜對了\n");break;}}} int main() {int input = 0;//設置隨機數的生成器,整個程序只要設置一次就可以了所以不要放在前面函數定義里面srand((unsigned int)time(NULL));//但是生成的隨機數需要時時在變化,所以傳入的是時間戳//用do...while語句更合適一些,因為我們一上來就要打印菜單do{menu();printf("請選擇:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤\n");break;}} while (input);return 0; }好,我知道鐵汁可能對于上面的有些代碼不是很理解,沒關系的,我來了。
?你可能不理解為什么多了兩個頭文件:
#include<stdlib.h> #include<time.h>添加stdlib.h頭文件,是因為使用了庫函數 rand() 和 srand() ,而添加time.h頭文件,是因為使用庫函數time(), 而添加stdio.h頭文件,不用我說大家都知道,是因為使用了庫函數printf() 和 scanf()
說到這里,我自己都忍不住問自己為啥要使用庫函數rand() ,srand() 和 time()?別急,?請朝后看:
首先,這個游戲的操作重點在于電腦處理生成隨機數這塊內容,那么C語言中生成隨機數的方法是什么呢?嘿嘿,這里就要提到庫函數 rand() 了。
rand() 函數原型:
哈哈,沒錯這是英文文檔,其實也能找到很多中文版本的,但是大家要學習著看英文文檔哦,畢竟以后進入公司,很多專業文檔他喵的幾乎都是英文的,誰叫咱們這方面沒有老外起步早呢,不過沒關系,后來者居上,大家一起努力,若干年之后,咱們中文勢必成為真正的國際通用!!!
有點跑題了,回來回來...
從紅方括號括起來的內容不難看出,rand()生成隨機數的范圍是0~RAND_MAX之間的數字,而RAND_MAX大小是0x7fff ,這是十六進制表示形式,轉換成十進制就是32767,所以rand()生成隨機數的范圍就是0~32767
可能你在疑問,為什么RAND_MAX大小是0x7fff ,不是別的呢,哈哈,筆者當然是有根據的,先在編譯器上將它打出來?
然后點擊鼠標右鍵,會顯示:
此時只需要點一下“轉到定義”, 就能看到咱們想要的啦。
問:下面代碼是啥意思??
int r = rand() % 100 + 1;?解釋:
//0~32767之間的范圍太大了,本題要的是1~100之間即可//rand() % 100 == 0 ~ 99//rand() % 100 + 1 == 1~100 //所以才寫成下面的形式int r = rand() % 100 + 1;好,說到這里,紅色方框里面的內容就解釋的差不多了 ,現在來看藍色方框里面的內容。
藍色方框主要講的是,在使用rand()函數之前,需要先設置隨機數的生成器,想想也是啊,沒有隨
?機數的生成器,怎么會生成隨機數呢!
?這該死的邏輯
那這里就要講解一下庫函數srand() 了
srand() 函數原型:
srand()函數里面需要傳入一個不斷變化的值 ,才能讓rand()函數生成隨機數,如果傳入的是常數的話,那么每次生成的隨機數都會是同一個數,那什么值是不斷變化的呢,當然是時間啦。
?那程序里面寫了這么一大坨是啥意思?
srand((unsigned int)time(NULL));如果想要把這個講解清楚,首先講一下庫函數time()
那為什么要引入time()函數呢?
這里補充一下“時間戳”的概念:何為時間戳?
任何一個時間都能轉化成一個時間戳,時間是在不斷變化的,所以時間戳也是不斷變化的,而獲取時間戳,需要調用time()函數
time()函數原型:
time() 函數里面參數的數據類型是指針型,所以傳入一個NULL(空指針)進去,變成time(NULL)
這里大家先別刨根問底問為什么傳進去的是空指針而不是別的,因為這里涉及的知識比較多,等到零基礎搞定C語言系列更新到指針那塊內容,筆者會灰常詳細的介紹哦,在這里大家只要知道time()函數里面的參數類型是指針型,此題傳入的是空指針就行啦。
因為time()函數的返回值類型是time_t類型,但是srand()函數參數類型是unsigned int 型,所以要進行強制類型轉換
srand((unsigned int)time(NULL));還有還有,為什么srand()函數不直接寫在rand()函數的前面,而是放在主函數中?
那是因為啊,設置隨機數的生成器,整個程序只要設置一次就可以了,如果放在game()中,那么調用一次函數就會設置一個隨機數的生成器,所以才放在主函數中。
好咯,這個小游戲就這么多內容了,確實很簡單,后面筆者還會更新一些小游戲哦,覺得有所收獲的鐵汁們可以動動小手,給筆者來個三連。
總結
以上是生活随笔為你收集整理的小游戏系列——猜数字游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinCap数据包显示
- 下一篇: 【云原生-K8s】cka认证2022年1