何為猜數字游戲?
電腦給出一個1-100之間的亂數,由玩家去猜,如果玩家猜小了,則提示猜小了,如果猜大了,則提示猜大了,如果猜對了,則顯示你真棒,猜對了~
實作猜數字游戲需要哪些C語言知識點?
實作該程式只需要簡短的幾十行代碼即可,涉及的知識點有選單,簡單的回圈陳述句、選擇陳述句,以及簡單的庫函式參考、自定義函式的呼叫,
具體的代碼實作
首先,我使用的是vs2017編譯器,編譯器具體的使用方法這里就不提及了,

首先寫出主函式
注:這里的#define _CRT_SECURE_NO_WARNINGS是為了防止vs編譯器報錯scanf函式不安全
我們平時打開游戲都會先彈出一個界面讓我們選擇是否開始游戲,因此我們寫該游戲時也需要寫一個選單,
我們平常玩游戲肯定不是玩完一局接著就退出游戲了,因此這里我們需要用到回圈陳述句,這樣玩完一局以后就可以選擇是否繼續游戲,
while、for回圈都需要先判斷才會進入回圈,而選單的顯示是不需要判斷的,因此選擇do while回圈,

其中的menu即為選單,

圖示即為該游戲選單的寫法,選單無需回傳值,因此定義為void;該選單的意思是輸入1開始游戲,輸入0退出游戲,
寫完選單后,在主函式中繼續完善,
定義一個input用于接收我們要選擇的數字,游戲用戶除了會選擇1和0,還有可能誤選擇其他數字,因此用swtich陳述句進行處理,先把swtich陳述句的基本結構寫出,

將基本結構寫出后,再對switch陳述句和do while陳述句進行完善(不要忘了把do while回圈的條件寫上),

選擇數字1即開始游戲,這里先列印"猜數字"進行代替,后面再撰寫具體游戲內容,
如果用戶選擇了1和0之外的數字,則提示"選擇錯誤",do while的回圈條件寫為input,如果用戶輸入的是0,則退出游戲,而0為假,回圈也可以結束;如果輸入的是非0的數字,則為真,回圈繼續,用戶也可以選擇是否繼續游戲,
將上述代碼都完成后,開始撰寫游戲的內容,

撰寫一個自定義函式game(),在game函式內部進行游戲代碼的撰寫,以實作游戲,
游戲分為兩部分:1. 生成亂數 2. 猜數字

生成亂數要參考庫函式rand() - 生成一個亂數 - 需引入頭檔案stdlib.h

這時我們列印ret的值,運行查看一下亂數的生成結果,發現好像確實生成了幾個亂數,

這時我們關閉運行視窗,再運行一次查看結果,

我們發現與第一次的結果完全相同,這時我們會發現該亂數的生成出現了問題,此時可以查一下檔案看看rand的具體功能,
此處我選擇的是MSDN,

我們發現該函式的功能確實是生成一個0-RAND_MAX范圍的亂數(其中RAND_MAX的值為0x7fff(引入頭檔案后輸入RAND_MAX,將滑鼠移到RAND_MAX上,即可顯示其數值),轉化為十進制即為32767),這時候不要著急,我們繼續往后讀檔案,

這句話的意思是在引起rand函式之前需要用一個srand函式,即srand是一個設定亂數的生成器,要將srand與rand配合使用,

先將srand函式中的值寫為1,我們運行查看結果,
將srand中的內容改為其他值,我們再運行一下,


可以發現,每次亂數都改成了固定的一個值,改變srand中的值就可以改變亂數的值,這時可以推得,只要srand函式中的值一直在改變,那么就可以生成亂數了,
srand中的值需要亂數,我們又需要用srand來生成隨機值,這好像是自相矛盾的,其實不然,只要srand中是一個一直在改變的量就可以了,那么計算機中什么是一直在變的呢——時間,
這時要引入時間戳的概念,
時間戳
當前計算機的時間-計算機的起始時間(1970.1.1.0:0:0)=(xxxx)秒,xxxx即為時間戳,
我們可以拿時間戳來設定亂數的生成起始點,
時間戳的使用則要用庫函式time - 需引入頭檔案time.h,

查看time的檔案后,發現time的引數為指標time_t*,如果不想用這個引數,我們傳一個空指標NULL,即寫為time(NULL),同時我們發現time的回傳型別為time_t,time_t其實是一個整型型別(此處不過多介紹),而srand函式的引數的回傳型別為unsigned int,

這時候我們就可以明白,只要把time函式強制轉化為unsigned int型別,那么就可以把time函式作為srand函式的引數了,


運行后發現亂數生成的并不完全隨機,如果輸入值時按的過快甚至會出現兩個亂數相同的情況,這是因為我們把srand函式用錯了,srand只需生成一次即可,如果放入我們自定義的game函式內就會多次生成,因此要把srand放到主函式內,


這時亂數的生成就完全隨機了,但生成的數過大,非常難以猜到數字,我們已知rand生成亂數的范圍為0-32767,那么rand()%100生成的亂數即為0-99,rand()%100+1生成的亂數即為1-100,這就符合我們的游戲規則了,

這時游戲的第一步就完成了,接下來我們就可以進行第二步了,

這時我們發現,玩家基本不可能一次就猜對,因此第二步我們需要設定回圈,讓玩家猜多次,直到猜中為止,

玩家猜錯,則繼續回圈,猜對了則跳出回圈,詢問是否繼續游戲,


這時我們就可以愉快的進行猜數字游戲了~
完整代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("************************************\n");
printf("***** 1. play 0. exit *****\n");
printf("************************************\n");
}
//游戲的實作
void game()
{
int guess = 0;//用于接收猜的數字
//1. 生成亂數
int ret = rand() % 100 + 1;
//2. 猜數字
while (1)
{
printf("請猜數字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("你真棒,猜對了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//設定亂數的生成器
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch(input)
{
case 1:
//printf("猜數字\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/341983.html
標籤:其他
上一篇:關于猜數字游戲的實作
下一篇:《C++》 猜單詞小游戲
