C語(yǔ)言編寫猜數(shù)游戲
C語(yǔ)言寫猜數(shù)游戲,供大家參考,具體內(nèi)容如下
這篇文章是給學(xué)完并學(xué)懂了C語(yǔ)言的分支(選擇和循環(huán))結(jié)構(gòu)的朋友看的。
要做一個(gè)游戲或者程序先要想好有那些要求,以下是我認(rèn)為一個(gè)猜數(shù)游戲必帶的要求:
1、自定義猜數(shù)范圍的起點(diǎn)和終點(diǎn)以及機(jī)會(huì)次數(shù)。
2、生成一個(gè)隨機(jī)數(shù)。
3、如果輸入猜入的數(shù)和生成的隨機(jī)數(shù)相等,就提示猜對(duì)了并退出主函數(shù),如果輸入猜的數(shù)比生成的隨機(jī)數(shù)大,就提示猜大了,如果輸入猜的數(shù)比生成的隨機(jī)數(shù)小,就提示猜小了,沒(méi)猜對(duì)一次就減一次機(jī)會(huì)。
4、如果機(jī)會(huì)為0了,就提示沒(méi)有機(jī)會(huì)了并輸出隨機(jī)數(shù)。
自定義猜數(shù)范圍的起點(diǎn)和終點(diǎn)以及機(jī)會(huì)次數(shù)
先來(lái)寫自定義猜數(shù)范圍的起點(diǎn)和終點(diǎn)以及機(jī)會(huì)次數(shù),代碼如下:
int start,end,opportunity;//范圍起點(diǎn) 范圍終點(diǎn) 機(jī)會(huì)次數(shù) printf("請(qǐng)輸入猜數(shù)游戲的范圍的起點(diǎn):"); scanf("%d",&start); printf("請(qǐng)輸入猜數(shù)游戲的范圍的終點(diǎn):"); scanf("%d",&end); printf("請(qǐng)輸入猜數(shù)游戲的機(jī)會(huì)次數(shù):"); scanf("%d",&opportunity);
生成一個(gè)隨機(jī)數(shù)
生成一個(gè)隨機(jī)數(shù)可以用srand()函數(shù)和rand()函數(shù),srand()函數(shù)作用大致是每次運(yùn)行生成的隨機(jī)數(shù)都不同。rand()函數(shù)作用是生成并返回一個(gè)隨機(jī)數(shù)。代碼如下:
int random;//隨機(jī)數(shù) srand((unsigned)time(NULL));//每次運(yùn)行生成的隨機(jī)數(shù)都不同 random=rand();//默認(rèn)隨機(jī)數(shù)的范圍是0~32767
那么如何生成我們輸入的起點(diǎn)和終點(diǎn)那個(gè)范圍呢,代碼如下:
int random;//隨機(jī)數(shù) srand((unsigned)time(NULL));//每次運(yùn)行生成的隨機(jī)數(shù)都不同 random=rand()%(end-start)+end;//生成的隨機(jī)數(shù)余(end-start)的結(jié)果就是一個(gè)不大于(end-start)的數(shù),最后加上start之后就得到了
一個(gè)不小于start并且不大于end的數(shù),就可以控制范圍了
srand()函數(shù)
srand()函數(shù)是隨機(jī)數(shù)發(fā)生器的初始化函數(shù),函數(shù)原型為:void srand(unsigned seed);,所在頭文件為:#include <stdlib.h>。
它會(huì)初始化并提供一個(gè)隨機(jī)種子,這個(gè)種子會(huì)對(duì)應(yīng)一個(gè)隨機(jī)數(shù),如果使用相同的種子后面的rand()函數(shù)會(huì)出現(xiàn)一樣的隨機(jī)數(shù),比如:srand(1);,直接使用1來(lái)初始化種子。不過(guò)為了防止隨機(jī)數(shù)每次重復(fù),常常使用系統(tǒng)時(shí)間來(lái)初始化,即使用time函數(shù)來(lái)獲得系統(tǒng)時(shí)間,它的返回值為從00:00:00GMT,January1,1970 到現(xiàn)在所持續(xù)的秒數(shù),然后將time_t型數(shù)據(jù)轉(zhuǎn)化為(unsigned)型再傳給srand函數(shù),即:srand((unsigned)time(&t));,還有一個(gè)經(jīng)常用法,不需要定義time_t型t變量,即: srand((unsigned)time(NULL)); 直接傳入一個(gè)空指針,因?yàn)槟愕某绦蛑型⒉恍枰?jīng)過(guò)參數(shù)獲得的數(shù)據(jù)。
其實(shí)計(jì)算機(jī)并不能產(chǎn)生真正的隨機(jī)數(shù),而是已經(jīng)編寫好的一些無(wú)規(guī)則排列的數(shù)字存儲(chǔ)在電腦里,把這些數(shù)字劃分為若干相等的N份,并為每份加上一個(gè)編號(hào)用srand()函數(shù)獲取這個(gè)編號(hào),然后rand()就按順序獲取這些數(shù)字,當(dāng)srand()的參數(shù)值固定的時(shí)候,rand()獲得的數(shù)也是固定的,所以一般srand的參數(shù)用time(NULL),因?yàn)橄到y(tǒng)的時(shí)間一直在變,所以rand()獲得的數(shù),也就一直在變,相當(dāng)于是隨機(jī)數(shù)了。只要用戶或第三方不設(shè)置隨機(jī)種子,那么在默認(rèn)情況下隨機(jī)種子來(lái)自系統(tǒng)時(shí)鐘。如果想在一個(gè)程序中生成隨機(jī)數(shù)序列,需要至多在生成隨機(jī)數(shù)之前設(shè)置一次隨機(jī)種子。 即:只需在主程序開始處調(diào)用srand((unsigned)time(NULL)); 后面直接用rand就可以了。不要在for等循環(huán)放置srand((unsigned)time(NULL));
rand()函數(shù)
rand()函數(shù)作用是生成并返回一個(gè)隨機(jī)數(shù),函數(shù)原型為:int rand(void);,所在頭文件為:#include <stdlib.h>。
rand()函數(shù)每次調(diào)用前都會(huì)查詢是否調(diào)用過(guò)srand(seed),是否給seed設(shè)定了一個(gè)值,如果有那么它會(huì)自動(dòng)調(diào)用srand(seed)一次來(lái)初始化它的起始值。若之前沒(méi)有調(diào)用srand(seed),那么系統(tǒng)會(huì)自動(dòng)給seed賦初始值,即srand(1)自動(dòng)調(diào)用它一次。
總結(jié)以上代碼
目前為止,我們做了自定義猜數(shù)范圍的起點(diǎn)和終點(diǎn)以及機(jī)會(huì)次數(shù)、生成一個(gè)隨機(jī)數(shù),目前全部代碼如下:
#include <stdio.h> #include <stdlib.h>//srand()函數(shù)和rand()函數(shù)頭文件 #include <time.h》>//time()函數(shù)的頭文件 int main() { int start,end,opportunity,random;//范圍起點(diǎn) 范圍終點(diǎn) 機(jī)會(huì)次數(shù) 隨機(jī)數(shù) srand((unsigned)time(NULL));//每次運(yùn)行生成的隨機(jī)數(shù)都不同 printf("請(qǐng)輸入猜數(shù)游戲的范圍的起點(diǎn):"); scanf("%d",&start); printf("請(qǐng)輸入猜數(shù)游戲的范圍的終點(diǎn):"); scanf("%d",&end); printf("請(qǐng)輸入猜數(shù)游戲的機(jī)會(huì)次數(shù):"); scanf("%d",&opportunity); random=rand()%(end-start)+start;//生成的隨機(jī)數(shù)余(end-start)的結(jié)果就是一個(gè)不大于(end-start)的數(shù),最后加上start之后就得到了一個(gè)不小于start并且不大于end的數(shù),就可以控制范圍了 return 0; }
比較輸入的數(shù)與隨機(jī)數(shù)的大小來(lái)做相應(yīng)的事
如果輸入猜入的數(shù)和生成的隨機(jī)數(shù)相等,就提示猜對(duì)了并退出主函數(shù),如果輸入猜的數(shù)比生成的隨機(jī)數(shù)大,就提示猜大了,如果輸入猜的數(shù)比生成的隨機(jī)數(shù)小,就提示猜小了,沒(méi)猜對(duì)一次就減一次機(jī)會(huì),代碼如下:
while(opportunity--)//只要沒(méi)有猜對(duì)一次,機(jī)會(huì)就少一次 { scanf("%d",&guess);//輸入需要猜的數(shù) if(guess==random)//當(dāng)猜的數(shù)和隨機(jī)數(shù)相等,說(shuō)明猜對(duì)了 { printf("猜對(duì)了!\n");//提示猜對(duì)了 return 0;//直接退出函數(shù) } else if(guess>random)//當(dāng)猜的數(shù)比隨機(jī)數(shù)大 printf("猜大了!剩余機(jī)會(huì)次數(shù)為%d次\n",opportunity);//提示猜大了和剩余機(jī)會(huì)次數(shù) else if(guess<random)//當(dāng)猜的數(shù)比隨機(jī)數(shù)小 printf("猜小了!剩余機(jī)會(huì)次數(shù)為%d次\n",opportunity);//提示猜小了和剩余機(jī)會(huì)次數(shù) } printf("沒(méi)有機(jī)會(huì)了,正確答案是%d",random);//沒(méi)有退出函數(shù)就說(shuō)明機(jī)會(huì)用完了并且沒(méi)有猜對(duì),就提示沒(méi)有機(jī)會(huì)了并揭曉答案
總結(jié)以上代碼
#include <stdio.h> #include <stdlib.h>//srand()函數(shù)和rand()函數(shù)頭文件 #include <time.h>//time()函數(shù)的頭文件 int main() { int start,end,opportunity,random,guess;//范圍起點(diǎn) 范圍終點(diǎn) 機(jī)會(huì)次數(shù) 隨機(jī)數(shù) 猜的數(shù) srand((unsigned)time(NULL));//每次運(yùn)行生成的隨機(jī)數(shù)都不同 printf("請(qǐng)輸入猜數(shù)游戲的范圍的起點(diǎn):"); scanf("%d",&start); printf("請(qǐng)輸入猜數(shù)游戲的范圍的終點(diǎn):"); scanf("%d",&end); printf("請(qǐng)輸入猜數(shù)游戲的機(jī)會(huì)次數(shù):"); scanf("%d",&opportunity); random=rand()%(end-start)+start;//生成的隨機(jī)數(shù)余(end-start)的結(jié)果就是一個(gè)不大于(end-start)的數(shù),最后加上start之后就得到了一個(gè)不小于start并且不大于end的數(shù),就可以控制范圍了 printf("請(qǐng)?jiān)?d到%d之內(nèi)猜數(shù)字,你有%d次機(jī)會(huì):\n",start,end,opportunity); while(opportunity--)//只要沒(méi)有猜對(duì)一次,機(jī)會(huì)就少一次 { scanf("%d",&guess);//輸入需要猜的數(shù) if(guess==random)//當(dāng)猜的數(shù)和隨機(jī)數(shù)相等,說(shuō)明猜對(duì)了 { printf("猜對(duì)了!\n");//提示猜對(duì)了 return 0;//直接退出函數(shù) } else if(guess>random)//當(dāng)猜的數(shù)比隨機(jī)數(shù)大 printf("猜大了!剩余機(jī)會(huì)次數(shù)為%d次\n",opportunity);//提示猜大了和剩余機(jī)會(huì)次數(shù) else if(guess<random)//當(dāng)猜的數(shù)比隨機(jī)數(shù)小 printf("猜小了!剩余機(jī)會(huì)次數(shù)為%d次\n",opportunity);//提示猜小了和剩余機(jī)會(huì)次數(shù) } printf("沒(méi)有機(jī)會(huì)了,正確答案是%d",random);//沒(méi)有退出函數(shù)就說(shuō)明機(jī)會(huì)用完了并且沒(méi)有猜對(duì),就提示沒(méi)有機(jī)會(huì)了并揭曉答案 return 0; }
測(cè)試代碼
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(90.子集合之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(90.子集合之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C/C++實(shí)現(xiàn)獲取硬盤序列號(hào)的示例代碼
獲取硬盤的序列號(hào)、型號(hào)和固件版本號(hào),此類功能通常用于做硬盤綁定或硬件驗(yàn)證操作,下面我們就來(lái)學(xué)習(xí)一下如何使用C/C++實(shí)現(xiàn)獲取硬盤序列號(hào)吧2023-11-11算法學(xué)習(xí)入門之使用C語(yǔ)言實(shí)現(xiàn)各大基本的排序算法
這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)各大基本的排序算法的方法,同時(shí)也對(duì)算法的選擇問(wèn)題上給出了一些建議,的朋友可以參考下2015-12-12C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究
這篇文章主要為大家介紹了C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01C語(yǔ)言實(shí)現(xiàn)控制臺(tái)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)控制臺(tái)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07c++實(shí)現(xiàn)MD5算法實(shí)現(xiàn)代碼
用c++實(shí)現(xiàn)了md5算法。包含 md5.h 和md5.cpp 兩個(gè)文件。主要參考百度百科 “MD5” 原理,代碼中變量命名也是參考其中的公式,程序的使用說(shuō)明在md5.h 文件的末尾注釋中2013-11-11C語(yǔ)言字符串操作總結(jié)大全(超詳細(xì))
本篇文章是對(duì)C語(yǔ)言字符串操作進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下2013-05-05