當前位置:
首頁 > 知識 > C語言探索之旅:第一個C語言小遊戲

C語言探索之旅:第一個C語言小遊戲

一個C語言小遊戲。雖然暫時還不介紹C語言的圖形編程,這個遊戲還是命令行的形式,但是不論怎樣,這都是一個小小的里程碑。經過初步的一些學習,你已經可以完成一些有意思的事了。雖然我們知道理論是很好的,但是如果我們不能把所學的理論付諸實踐,那也很沒有意思,我們不就白學了那麼多理論。

信不信由你,你其實已經有水平實現自己的第一個有意思的程序了。

準備工作和建議

程序的原理

在動手編程之前,得先跟大家說一下這個程序是幹什麼的。

我們可以稱呼這個遊戲為《或多或少》。

想要一起學習C++的可以加企鵝裙六四三三九二二二零,裙內有各種資料滿足大家,歡迎加裙

遊戲的原理是這樣:

每一輪電腦從1到100中隨機抽一個整數

電腦請求你猜這個數字,因此你要輸入一個1到100之間的整數

電腦將你輸入的數和它抽取的數進行比較,並告知你的數比它的數大了還是小了

然後它會再次讓你輸入數字,並告訴你比較的結果

一直到你猜到這個數為止,一輪結束

遊戲的目的,當然就是用最少的次數猜到這個「神秘」數字。雖然沒有絢麗的圖形界面,但是或多或少,這都是你的第一個遊戲了,應該值得驕傲。

下面演示了一輪的樣式,你要編程來實現它:

這個數字是什麼?50

猜小了!

這個數字是什麼?75

猜小了!

這個數字是什麼?85

猜大了!

這個數字是什麼?80

猜大了!

這個數字是什麼?78

猜小了!

這個數字是什麼?79

太棒了,你猜到了這個神秘數字!!

想要一起學習C++的可以加企鵝裙六四三三九二二二零,裙內有各種資料滿足大家,歡迎加裙

隨機抽取一個數

但大家要問了:怎麼來隨機地抽取一個數呢?不知道怎麼辦啊,臣妾做不到啊。

誠然,我們還沒學習如何來產生一個隨機數。讓親愛的電腦兄來做這個是不簡單的:它很會做運算,但是要它隨機選擇一個數,它還不知道怎麼做呢。

事實上,為了「嘗試」得到一個隨機數,我們不得不讓電腦來做一些複雜的運算,好吧,歸根結底還是做運算。

我們有兩個解決方案:

請用戶通過scanf函數輸入這個神秘數字,那麼就需要兩個玩家咯。一個選數字,一個猜數字。

孤注一擲地讓電腦來為我們自動產生一個隨機數。好處是:只需要一個玩家,可以自娛自樂。缺點是:需要學習該怎麼做...

我們來學慣用第二種方案編寫這個遊戲,當然你也可以之後自己編寫第一種方案的代碼。

為了生成一個隨機數,我們要用到rand()函數(rand是英語「random:隨機」 的縮寫)。顧名思義,這個函數能為我們生成隨機數。但是我們還要這個隨機數是在1到100的整數範圍內(如果沒有限定範圍,那會很複雜)。

我們會用到以下的形式:

srand(time(NULL));

mysteryNumber=(rand()%(MAX-MIN+1))+MIN;

第一行(srand函數)用於初始化隨機數的生成器。srand其實是seed random的縮寫,seed在英語中是「種子」的意思。

給出 百度百科 的簡單解釋:

【srand和rand配合使用產生偽隨機數序列。rand函數在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的偽隨機數序列都是一樣的。srand(unsigned seed)通過參數seed改變系統提供的種子值,從而可以使得每次調用rand函數生成的偽隨機數序列不同,從而實現真正意義上的「隨機」。通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函數提供不同的種子值,進而產生不同的隨機數序列】

【所謂的「偽隨機數」指的並不是假的隨機數,這裡的「偽」是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。比如「世上沒有兩片形狀完全相同的樹葉」,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。】

【通過time()函數來獲得計算機系統當前的日曆時間(Calendar Time),處理日期時間的函數都是以本函數的返回值為基礎進行運算。其原型為:time_t time(time_t * t); 如果你已經聲明了參數t,你可以從參數t返回現在的日曆時間,同時也可以通過返回值返回現在的日曆時間,即從一個時間點(例如:1970年1月1日0時0分0秒)到現在此時的秒數。如果參數為空(NULL),函數將只通過返回值返回現在的日曆時間。】

如果我們在使用rand函數前沒有用srand函數制定seed的值,或者雖然用了srand函數,但是給它的參數是一個常量,比如srand(1),那麼每次程序運行rand產生的數字都是一樣的。只有用例如time()函數來給一個每次都不一樣的seed值,才能使得rand的返回值不一樣,才能做到「隨機」。

srand函數只需要在rand函數前面調用一次就夠了,也只能調用一次,之後你想要調用rand函數幾次都無所謂,但是每個程序中不能用兩次srand函數,切記。

上面代碼格式中的MAX和MIN是常量,MAX是英語的「最大」Maximum的縮寫,MIN是「最小」Minimum的縮寫。顧名思義,MAX和MIN分別是你規定的範圍的最大值和最小值。

想要一起學習C++的可以加企鵝裙六四三三九二二二零,裙內有各種資料滿足大家,歡迎加裙

建議在程序的一開始定義這兩個常量:

const int MAX = 100, MIN = 1;

引入的庫

為了程序能夠順利運行,我們需要引入三個庫:

stdio.h

stdlib.h

time.h

我們以前的課說過庫的作用,庫裡面提供一些定義好的函數,比如time.h裡面就有我們的time()函數,stdlib中有rand和srand函數。

好啦,我不繼續透露了。我們已經說明了遊戲的原理,也給出了一輪遊戲的運行例子,也給出了主要的隨機數生成代碼,該輪到你來完成遊戲的代碼了。加油。

我的代碼

希望大家自己先寫代碼,查閱一些資料,或複習前面幾課的內容。運行成功了或實在寫不出來才來看答案。

以下給出我的版本,當然了,這個遊戲的代碼可以有不同的版本。你完全可以自己發揮。

#include

#include

#include

int main (int argc, char** argv)

{

int mysteryNumber = 0, guessNumber = 0;

const int MAX = 100, MIN = 1;

// 生成隨機數

srand(time(NULL));

mysteryNumber = (rand() % (MAX - MIN + 1)) + MIN;

/* 程序的循環部分, 如果用戶沒猜中數字,就一直進行循環 */

do

{

// 請求用戶輸入所猜數字

printf("這個數字是什麼 ? ");

scanf("%d", &guessNumber);

// 比較用戶輸入的數字和神秘數字

if (mysteryNumber >guessNumber)

printf("猜小了 !");

else if (mysteryNumber

printf("猜大了 !");

else

printf ("太棒了,你猜到了這個神秘數字 !!");

} while (guessNumber!= mysteryNumber);

return 0;

}

程序的解釋(從上到下的順序):

預處理指令:就是開頭的那三行,以#開始,include是英語「包含,引入」的意思。所以表示引入什麼庫。之前我已經給大家這部分的代碼了,所以如果你的程序運行起來出錯是在這部分的話,那你也是夠夠的了 :P

變數:這個遊戲中,不需要太多變數,只有一個用於記錄用戶輸入的數字的變數guessNumber,和一個電腦隨機抽取的數字mysteryNumber。同時也定義了兩個常量(const變數,其實叫只讀變數比較準確)MAX和MIN,值分別是100和1。這樣定義的好處是,如果你後面要改這兩個數值,會很方便,直接改這一行的兩個值就好了。如果沒有用MAX和MIN而是在程序里每一個地方寫100和1的話,那如果以後要改數值,工作量就大了。

隨機數:srand和rand那兩行,產生在1和100之間的一個隨機數,值賦給mysteryNumber。

循環:我選擇了用do...while循環。理論上一個while循環也可以做到,但我覺得這裡用do...while可能更合邏輯。為什麼呢?還記得do...while循環的特點嗎?就是循環體里的指令至少會執行一次,不像while循環可能一次也不執行。這裡我們至少要讓用戶輸入一次數字,不可能用戶一次也不輸入就猜到了數字。

在每一次進入循環體里運行時,我們都請求用戶輸入一個數字,並且把這個數字的值賦給guessNumber變數,接下來就比較guessNumber和mysteryNumber(需要猜的數字)的大小:

mysteryNumber大於guessNumber,那麼輸出「猜小了」,繼續循環

mysteryNumber小於guessNumber,那麼輸出「猜大了」,繼續循環

mysteryNumber等於guessNumber,也就是else語句的情況,即是說我們猜對了,輸出「太棒了,你猜到了這個神秘數字!」,結束循環

循環也需要一個條件,我們給出的條件是:只要猜的數字和神秘數字不一樣,循環就繼續。

現在這個遊戲還是很基礎很簡單的,但是可以有以下的改進方案:

增加一個記錄步數的計數器,在你猜對的時候輸出:「太棒了,你用**步猜到了這個神秘數字!」

目前的程序只進行一輪就結束了,如果玩家不過癮,還想繼續下一輪怎麼辦呢?可以加入一個問題:「你還想繼續玩嗎?」,等待用戶輸入數字來回答。定義一個布爾值continue來存儲用戶輸入的回答,比如continue的默認值是1,就是用戶默認是繼續玩下一輪的,但如果用戶輸入0,那麼程序停止,遊戲結束

增加一個模式:兩人模式。可以你出題我來猜。但是我希望你能夠在程序一開始就讓用戶選擇是玩哪一種模式,是經典的人機對戰,還是人人對戰。如果是兩人模式的人人對戰,那麼就不是用srand和rand來產生神秘數字了,而是讓玩家一通過scanf來輸入這個數字

設置幾個難度級別,讓玩家選擇:初級(1-100中的一個數),中級(1-1000中的一個數),高級(1-10000中的一個數)。如果你這樣設計,就需要改寫MAX值了,而此時MAX就不能再是一個const變數了,必須要把MAX前面的const去掉,MIN的還能保留。

你也可以自己增設難度,想出更多好玩的點子來豐富這個遊戲。通過完善和改進這個小遊戲,你會學到更多。

想要一起學習C++的可以加企鵝裙六四三三九二二二零,裙內有各種資料滿足大家,歡迎加裙

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 C加加 的精彩文章:

如何寫一個簡單的C語言程序——C語言編程彩虹
C語言函數是什麼?怎麼調用?
我們究竟如何才能學好C語言?
用C語言編寫C語言的源代碼以及word文檔
C語言學習:C語言中指針函數與函數指針的詳解

TAG:C加加 |