C語言寫猜數游戲
這篇文章是給學完并學懂了C語言的分支(選擇和回圈)結構的朋友看的,
要做一個游戲或者程式先要想好有那些要求,以下是我認為一個猜數游戲必帶的要求:
- 自定義猜數范圍的起點和終點以及機會次數,
- 生成一個亂數,
- 如果輸入猜入的數和生成的亂數相等,就提示猜對了并退出主函式,如果輸入猜的數比生成的亂數大,就提示猜大了,如果輸入猜的數比生成的亂數小,就提示猜小了,沒猜對一次就減一次機會,
- 如果機會為0了,就提示沒有機會了并輸出亂數,
自定義猜數范圍的起點和終點以及機會次數
先來寫自定義猜數范圍的起點和終點以及機會次數,代碼如下:
int start,end,opportunity;//范圍起點 范圍終點 機會次數
printf("請輸入猜數游戲的范圍的起點:");
scanf("%d",&start);
printf("請輸入猜數游戲的范圍的終點:");
scanf("%d",&end);
printf("請輸入猜數游戲的機會次數:");
scanf("%d",&opportunity);
生成一個亂數
生成一個亂數可以用srand()函式和rand()函式,srand()函式作用大致是每次運行生成的亂數都不同,rand()函式作用是生成并回傳一個亂數,代碼如下:
int random;//亂數
srand((unsigned)time(NULL));//每次運行生成的亂數都不同
random=rand();//默認亂數的范圍是0~32767
那么如何生成我們輸入的起點和終點那個范圍呢,代碼如下:
int random;//亂數
srand((unsigned)time(NULL));//每次運行生成的亂數都不同
random=rand()%(end-start)+end;//生成的亂數余(end-start)的結果就是一個不大于(end-start)的數,最后加上start之后就得到了一個不小于start并且不大于end的數,就可以控制范圍了
srand()函式
srand()函式是亂數發生器的初始化函式,函式原型為:void srand(unsigned seed);,所在頭檔案為:#include <stdlib.h>,
它會初始化并提供一個隨機種子,這個種子會對應一個亂數,如果使用相同的種子后面的rand()函式會出現一樣的亂數,比如:srand(1);,直接使用1來初始化種子,不過為了防止亂數每次重復,常常使用系統時間來初始化,即使用time函式來獲得系統時間,它的回傳值為從00:00:00GMT,January1,1970 到現在所持續的秒數,然后將time_t型資料轉化為(unsigned)型再傳給srand函式,即:srand((unsigned)time(&t));,還有一個經常用法,不需要定義time_t型t變數,即: srand((unsigned)time(NULL)); 直接傳入一個空指標,因為你的程式中往往并不需要經過引數獲得的資料,
其實計算機并不能產生真正的亂數,而是已經撰寫好的一些無規則排列的數字存盤在電腦里,把這些數字劃分為若干相等的N份,并為每份加上一個編號用srand()函式獲取這個編號,然后rand()就按順序獲取這些數字,當srand()的引數值固定的時候,rand()獲得的數也是固定的,所以一般srand的引數用time(NULL),因為系統的時間一直在變,所以rand()獲得的數,也就一直在變,相當于是亂數了,只要用戶或第三方不設定隨機種子,那么在默認情況下隨機種子來自系統時鐘,如果想在一個程式中生成亂數序列,需要至多在生成亂數之前設定一次隨機種子, 即:只需在主程式開始處呼叫srand((unsigned)time(NULL)); 后面直接用rand就可以了,不要在for等回圈放置srand((unsigned)time(NULL));
rand()函式
rand()函式作用是生成并回傳一個亂數,函式原型為:int rand(void);,所在頭檔案為:#include <stdlib.h>,
rand()函式每次呼叫前都會查詢是否呼叫過srand(seed),是否給seed設定了一個值,如果有那么它會自動呼叫srand(seed)一次來初始化它的起始值,若之前沒有呼叫srand(seed),那么系統會自動給seed賦初始值,即srand(1)自動呼叫它一次,
總結以上代碼
目前為止,我們做了自定義猜數范圍的起點和終點以及機會次數、生成一個亂數,目前全部代碼如下:
#include <stdio.h>
#include <stdlib.h>//srand()函式和rand()函式頭檔案
#include <time.h》>//time()函式的頭檔案
int main()
{
int start,end,opportunity,random;//范圍起點 范圍終點 機會次數 亂數
srand((unsigned)time(NULL));//每次運行生成的亂數都不同
printf("請輸入猜數游戲的范圍的起點:");
scanf("%d",&start);
printf("請輸入猜數游戲的范圍的終點:");
scanf("%d",&end);
printf("請輸入猜數游戲的機會次數:");
scanf("%d",&opportunity);
random=rand()%(end-start)+start;//生成的亂數余(end-start)的結果就是一個不大于(end-start)的數,最后加上start之后就得到了一個不小于start并且不大于end的數,就可以控制范圍了
return 0;
}
比較輸入的數與亂數的大小來做相應的事
如果輸入猜入的數和生成的亂數相等,就提示猜對了并退出主函式,如果輸入猜的數比生成的亂數大,就提示猜大了,如果輸入猜的數比生成的亂數小,就提示猜小了,沒猜對一次就減一次機會,代碼如下:
while(opportunity--)//只要沒有猜對一次,機會就少一次
{
scanf("%d",&guess);//輸入需要猜的數
if(guess==random)//當猜的數和亂數相等,說明猜對了
{
printf("猜對了!\n");//提示猜對了
return 0;//直接退出函式
}
else if(guess>random)//當猜的數比亂數大
printf("猜大了!剩余機會次數為%d次\n",opportunity);//提示猜大了和剩余機會次數
else if(guess<random)//當猜的數比亂數小
printf("猜小了!剩余機會次數為%d次\n",opportunity);//提示猜小了和剩余機會次數
}
printf("沒有機會了,正確答案是%d",random);//沒有退出函式就說明機會用完了并且沒有猜對,就提示沒有機會了并揭曉答案
總結以上代碼
#include <stdio.h>
#include <stdlib.h>//srand()函式和rand()函式頭檔案
#include <time.h>//time()函式的頭檔案
int main()
{
int start,end,opportunity,random,guess;//范圍起點 范圍終點 機會次數 亂數 猜的數
srand((unsigned)time(NULL));//每次運行生成的亂數都不同
printf("請輸入猜數游戲的范圍的起點:");
scanf("%d",&start);
printf("請輸入猜數游戲的范圍的終點:");
scanf("%d",&end);
printf("請輸入猜數游戲的機會次數:");
scanf("%d",&opportunity);
random=rand()%(end-start)+start;//生成的亂數余(end-start)的結果就是一個不大于(end-start)的數,最后加上start之后就得到了一個不小于start并且不大于end的數,就可以控制范圍了
printf("請在%d到%d之內猜數字,你有%d次機會:\n",start,end,opportunity);
while(opportunity--)//只要沒有猜對一次,機會就少一次
{
scanf("%d",&guess);//輸入需要猜的數
if(guess==random)//當猜的數和亂數相等,說明猜對了
{
printf("猜對了!\n");//提示猜對了
return 0;//直接退出函式
}
else if(guess>random)//當猜的數比亂數大
printf("猜大了!剩余機會次數為%d次\n",opportunity);//提示猜大了和剩余機會次數
else if(guess<random)//當猜的數比亂數小
printf("猜小了!剩余機會次數為%d次\n",opportunity);//提示猜小了和剩余機會次數
}
printf("沒有機會了,正確答案是%d",random);//沒有退出函式就說明機會用完了并且沒有猜對,就提示沒有機會了并揭曉答案
return 0;
}
測驗代碼


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298746.html
標籤:其他
上一篇:【小Y學演算法】??每日LeetCode打卡??——28.二叉樹的最大深度
下一篇:構造方法詳解
