多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 【C語言探索之旅】 第一部分第八課:第一個C語言小游戲

【C語言探索之旅】 第一部分第八課:第一個C語言小游戲

來源:程序員人生   發(fā)布時間:2015-01-24 08:29:10 閱讀次數(shù):4996次

?


內(nèi)容簡介


1、課程大綱

2、第1部份第8課:第1個C語言小游戲

3、第1部份第9課預(yù)告: 函數(shù)


課程大綱


我們的課程分為4大部份,每個部份結(jié)束后都會有練習(xí)題,并會公布答案。還會帶大家用C語言編寫3個游戲。


C語言編程基礎(chǔ)知識


  • 甚么是編程?

  • 工欲善其事,必先利其器

  • 你的第1個程序

  • 變量的世界

  • 運(yùn)算那點(diǎn)事

  • 條件表達(dá)式

  • 循環(huán)語句

  • 實(shí)戰(zhàn):第1個C語言小游戲

  • 函數(shù)

  • 練習(xí)題

  • 習(xí)作:完善第1個C語言小游戲


C語言高級技術(shù)


  • 模塊化編程

  • 進(jìn)擊的指針,C語言王牌

  • 數(shù)組

  • 字符串

  • 預(yù)處理

  • 創(chuàng)建你自己的變量類型

  • 文件讀寫

  • 動態(tài)分配

  • 實(shí)戰(zhàn):“懸掛小人”游戲

  • 安全的文本輸入

  • 練習(xí)題

  • 習(xí)作:用自己的語言解釋指針


用基于C語言的SDL庫開發(fā)2D游戲


  • 安裝SDL

  • 創(chuàng)建窗口和畫布

  • 顯示圖象

  • 事件處理

  • 實(shí)戰(zhàn):“超級瑪麗推箱子”游戲

  • 掌握時間的使用

  • 用SDL_ttf編輯文字

  • 用FMOD控制聲音

  • 實(shí)戰(zhàn):可視化的聲音譜線

  • 練習(xí)題


數(shù)據(jù)結(jié)構(gòu)


  • 鏈表

  • 堆,棧和隊(duì)列

  • 哈希表

  • 練習(xí)題



第1部份第8課:第1個C語言小游戲


經(jīng)過前7課的努力,我們終究來到了第1個比較正式的程序:1個C語言小游戲。雖然暫時還不介紹C語言的圖形編程,這個游戲還是命令行的情勢,但是不論怎樣,這都是1個小小的里程碑。我們的目的是讓大家看到經(jīng)過之前幾課的學(xué)習(xí),你已可以完成1些成心思的事了。雖然我們知道理論是很好的,但是如果我們不能把所學(xué)的理論付諸實(shí)踐,那也很沒成心思,我們不就白學(xué)了那末多理論。


信不信由你,你其實(shí)已有水平實(shí)現(xiàn)自己的第1個成心思的程序了。


準(zhǔn)備工作和建議


程序的原理

在動手編程之前,得先跟大家說1下這個程序是干甚么的。

我們可以稱呼這個游戲?yàn)椤痘蚨嗷蛏佟贰?/p>


游戲的原理是這樣:

  1. 每輪電腦從1到100中隨機(jī)抽1個整數(shù)

  2. 電腦要求你猜這個數(shù)字,因此你要輸入1個1到100之間的整數(shù)

  3. 電腦將你輸入的數(shù)和它抽取的數(shù)進(jìn)行比較,并告知你的數(shù)比它的數(shù)大了還是小了

  4. 然后它會再次讓你輸入數(shù)字,并告知你比較的結(jié)果

  5. 1直到你猜到這個數(shù)為止,1輪結(jié)束


游戲的目的,固然就是用最少的次數(shù)猜到這個“神秘”數(shù)字。雖然沒有絢麗的圖形界面,但是或多或少,這都是你的第1個游戲了,應(yīng)當(dāng)值得自豪。


下面演示了1輪的樣式,你要編程來實(shí)現(xiàn)它:


這個數(shù)字是甚么?50

猜小了!

這個數(shù)字是甚么?75

猜小了!

這個數(shù)字是甚么?85

猜大了!

這個數(shù)字是甚么?80

猜大了!

這個數(shù)字是甚么?78

猜小了!

這個數(shù)字是甚么?79

太棒了,你猜到了這個神秘?cái)?shù)字??!


隨機(jī)抽取1個數(shù)

但大家要問了:怎樣來隨機(jī)地抽取1個數(shù)呢?不知道怎樣辦啊,臣妾做不到啊。


誠然,我們還沒學(xué)習(xí)如何來產(chǎn)生1個隨機(jī)數(shù)。讓親愛的電腦兄來做這個是不簡單的:它很會做運(yùn)算,但是要它隨機(jī)選擇1個數(shù),它還不知道怎樣做呢。


事實(shí)上,為了“嘗試”得到1個隨機(jī)數(shù),我們不能不讓電腦來做1些復(fù)雜的運(yùn)算,好吧,歸根結(jié)柢還是做運(yùn)算。


我們有兩個解決方案:

  1. 請用戶通過scanf函數(shù)輸入這個神秘?cái)?shù)字,那末就需要兩個玩家咯。1個選數(shù)字,1個猜數(shù)字。

  2. 孤注1擲地讓電腦來為我們自動產(chǎn)生1個隨機(jī)數(shù)。好處是:只需要1個玩家,可以自娛自樂。缺點(diǎn)是:需要學(xué)習(xí)該怎樣做...


我們來學(xué)習(xí)用第2種方案編寫這個游戲,固然你也能夠以后自己編寫第1種方案的代碼。


為了生成1個隨機(jī)數(shù),我們要用到rand()函數(shù)(rand是英語“random:隨機(jī)” 的縮寫)。顧名思義,這個函數(shù)能為我們生成隨機(jī)數(shù)。但是我們還要這個隨機(jī)數(shù)是在1到100的整數(shù)范圍內(nèi)(如果沒有限定范圍,那會很復(fù)雜)。


我們會用到以下的情勢:

srand(time(NULL));

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


第1行(srand函數(shù))用于初始化隨機(jī)數(shù)的生成器。srand實(shí)際上是seed random的縮寫,seed在英語中是“種子”的意思。

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

【srand和rand配合使用產(chǎn)生偽隨機(jī)數(shù)序列。rand函數(shù)在產(chǎn)生隨機(jī)數(shù)前,需要系統(tǒng)提供的生成偽隨機(jī)數(shù)序列的種子,rand根據(jù)這個種子的值產(chǎn)生1系列隨機(jī)數(shù)。如果系統(tǒng)提供的種子沒有變化,每次調(diào)用rand函數(shù)生成的偽隨機(jī)數(shù)序列都是1樣的。srand(unsigned seed)通過參數(shù)seed改變系統(tǒng)提供的種子值,從而可使得每次調(diào)用rand函數(shù)生成的偽隨機(jī)數(shù)序列不同,從而實(shí)現(xiàn)真正意義上的“隨機(jī)”。通??梢岳孟到y(tǒng)時間來改變系統(tǒng)的種子值,即srand(time(NULL)),可以為rand函數(shù)提供不同的種子值,進(jìn)而產(chǎn)生不同的隨機(jī)數(shù)序列】


【所謂的“偽隨機(jī)數(shù)”指的其實(shí)不是假的隨機(jī)數(shù),這里的“偽”是有規(guī)律的意思。其實(shí)絕對的隨機(jī)數(shù)只是1種理想狀態(tài)的隨機(jī)數(shù),計(jì)算機(jī)只能生成相對的隨機(jī)數(shù)即偽隨機(jī)數(shù)。計(jì)算機(jī)生成的偽隨機(jī)數(shù)既是隨機(jī)的又是有規(guī)律的 ―― 1部分遵照1定的規(guī)律,1部分則不遵照任何規(guī)律。比如“世上沒有兩片形狀完全相同的樹葉”,這正點(diǎn)到了事物的特性 ―― 規(guī)律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 ―― 規(guī)律性。從這個角度講,我們就能夠接受這樣的事實(shí)了:計(jì)算機(jī)只能產(chǎn)生偽隨機(jī)數(shù)而不是絕對的隨機(jī)數(shù)。】


【通過time()函數(shù)來取得計(jì)算機(jī)系統(tǒng)當(dāng)前的日用時間(Calendar Time),處理日期時間的函數(shù)都是以本函數(shù)的返回值為基礎(chǔ)進(jìn)行運(yùn)算。其原型為:time_t time(time_t * t); 如果你已聲明了參數(shù)t,你可以從參數(shù)t返回現(xiàn)在的日用時間,同時也能夠通過返回值返回現(xiàn)在的日用時間,即從1個時間點(diǎn)(例如:1970年1月1日0時0分0秒)到現(xiàn)在此時的秒數(shù)。如果參數(shù)為空(NULL),函數(shù)將只通過返回值返回現(xiàn)在的日用時間?!?/p>


如果我們在使用rand函數(shù)前沒有用srand函數(shù)制定seed的值,或雖然用了srand函數(shù),但是給它的參數(shù)是1個常量,比如srand(1),那末每次程序運(yùn)行rand產(chǎn)生的數(shù)字都是1樣的。只有用例如time()函數(shù)來給1個每次都不1樣的seed值,才能使得rand的返回值不1樣,才能做到“隨機(jī)”。


srand函數(shù)只需要在rand函數(shù)前面調(diào)用1次就夠了,也只能調(diào)用1次,以后你想要調(diào)用rand函數(shù)幾次都無所謂,但是每一個程序中不能用兩次srand函數(shù),切記。


上面代碼格式中的MAX和MIN是常量,MAX是英語的“最大”Maximum的縮寫,MIN是“最小”Minimum的縮寫。顧名思義,MAX和MIN分別是你規(guī)定的范圍的最大值和最小值。

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


const int MAX = 100, MIN = 1;


引入的庫

為了程序能夠順利運(yùn)行,我們需要引入3個庫:

stdio.h

stdlib.h

time.h

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


好啦,我不繼續(xù)流露了。我們已說明了游戲的原理,也給出了1輪游戲的運(yùn)行例子,也給出了主要的隨機(jī)數(shù)生成代碼,該輪到你來完成游戲的代碼了。加油。


我的代碼

希望大家自己先寫代碼,查閱1些資料,或溫習(xí)前面幾課的內(nèi)容。運(yùn)行成功了或?qū)嵲趯懖怀鰜聿艁砜创鸢浮?/p>

以下給出我的版本,固然了,這個游戲的代碼可以有不同的版本。你完全可以自己發(fā)揮。


#include <stdio.h>

#include <stdlib.h>

#include <time.h>


int main (int argc, char** argv)

{

 int mysteryNumber = 0, guessNumber = 0;

 const int MAX = 100, MIN = 1;

 // 生成隨機(jī)數(shù)

 srand(time(NULL));

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

 /* 程序的循環(huán)部份, 如果用戶沒猜中數(shù)字,就1直進(jìn)行循環(huán) */

 do

 {

     // 要求用戶輸入所猜數(shù)字

     printf("這個數(shù)字是甚么 ? ");

     scanf("%d", &guessNumber);

     // 比較用戶輸入的數(shù)字和神秘?cái)?shù)字

     if (mysteryNumber > guessNumber)

         printf("猜小了 ! ");

     else if (mysteryNumber < guessNumber)

         printf("猜大了 ! ");

     else

         printf ("太棒了,你猜到了這個神秘?cái)?shù)字 !! ");

 } while (guessNumber != mysteryNumber);


 return 0;

}


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

  1. 預(yù)處理指令:就是開頭的那3行,以#開始,include是英語“包括,引入”的意思。所以表示引入甚么庫。之前我已給大家這部份的代碼了,所以如果你的程序運(yùn)行起來出錯是在這部份的話,那你也是夠夠的了 :P

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

  3. 隨機(jī)數(shù):srand和rand那兩行,產(chǎn)生在1和100之間的1個隨機(jī)數(shù),值賦給mysteryNumber。

  4. 循環(huán):我選擇了用do...while循環(huán)。理論上1個while循環(huán)也能夠做到,但我覺得這里用do...while可能更合邏輯。為何呢?還記得do...while循環(huán)的特點(diǎn)嗎?就是循環(huán)體里的指令最少會履行1次,不像while循環(huán)可能1次也不履行。這里我們最少要讓用戶輸入1次數(shù)字,不可能用戶1次也不輸入就猜到了數(shù)字。

  5. 在每次進(jìn)入循環(huán)體里運(yùn)行時,我們都要求用戶輸入1個數(shù)字,并且把這個數(shù)字的值賦給guessNumber變量,接下來就比較guessNumber和mysteryNumber(需要猜的數(shù)字)的大?。?/p>

    mysteryNumber大于guessNumber,那末輸出“猜小了”,繼續(xù)循環(huán)

    mysteryNumber小于guessNumber,那末輸出“猜大了”,繼續(xù)循環(huán)

    mysteryNumber等于guessNumber,也就是else語句的情況,即是說我們猜對了,輸出“太棒了,你猜到了這個神秘?cái)?shù)字!”,結(jié)束循環(huán)


循環(huán)也需要1個條件,我們給出的條件是:只要猜的數(shù)字和神秘?cái)?shù)字不1樣,循環(huán)就繼續(xù)。


現(xiàn)在這個游戲還是很基礎(chǔ)很簡單的,但是可以有以下的改進(jìn)方案:

  1. 增加1個記錄步數(shù)的計(jì)數(shù)器,在你猜對的時候輸出:“太棒了,你用**步猜到了這個神秘?cái)?shù)字!”

  2. 目前的程序只進(jìn)行1輪就結(jié)束了,如果玩家不過癮,還想繼續(xù)下1輪怎樣辦呢?可以加入1個問題:“你還想繼續(xù)玩嗎?”,等待用戶輸入數(shù)字來回答。定義1個布爾值continue來存儲用戶輸入的回答,比如continue的默許值是1,就是用戶默許是繼續(xù)玩下1輪的,但如果用戶輸入0,那末程序停止,游戲結(jié)束

  3. 增加1個模式:兩人模式。可以你出題我來猜。但是我希望你能夠在程序1開始就讓用戶選擇是玩哪種模式,是經(jīng)典的人機(jī)對戰(zhàn),還是人人對戰(zhàn)。如果是兩人模式的人人對戰(zhàn),那末就不是用srand和rand來產(chǎn)生神秘?cái)?shù)字了,而是讓玩家1通過scanf來輸入這個數(shù)字

  4. 設(shè)置幾個難度級別,讓玩家選擇:低級(1⑴00中的1個數(shù)),中級(1⑴000中的1個數(shù)),高級(1⑴0000中的1個數(shù))。如果你這樣設(shè)計(jì),就需要改寫MAX值了,而此時MAX就不能再是1個const變量了,必須要把MAX前面的const去掉,MIN的還能保存。


你也能夠自己增設(shè)難度,想出更多好玩的點(diǎn)子來豐富這個游戲。通過完善和改進(jìn)這個小游戲,你會學(xué)到更多。



第1部份第9課預(yù)告:函數(shù)


今天的課就到這里,1起加油咯。

下1次我們學(xué)習(xí)第9課,來認(rèn)識函數(shù)這個極其重要和有用的內(nèi)容吧!





程序員同盟 微信公眾號*您若覺得本文不錯,點(diǎn)擊畫面右上角《???》按鈕“分享到朋友圈或“發(fā)送給朋友

*新朋友請關(guān)注「程序員同盟」微信搜公眾號  ProgrammerLeague

小編的微信號 frogoscar

小編的QQ號:  379641629

小編的郵箱:    enmingx@gmail.com

微信和郵箱最經(jīng)常使用


PS: 有朋友反應(yīng)看手機(jī)真?zhèn)€文章太累,實(shí)際上是可以用閱讀器網(wǎng)頁來看的

方法1. 點(diǎn)擊畫面右上角的《???》按鈕,然后選擇“復(fù)制鏈接”,再把鏈接黏貼到你的閱讀器里面或用郵件發(fā)送給自己,就能夠在電腦的閱讀器里打開了



方法2. 頭條網(wǎng)www.toutiao.com,搜索我的自媒體“程序員同盟”,里面有所有文章,也能夠直接進(jìn)這個鏈接:http://www.toutiao.com/m3750422747/



新朋友如何查看所有文章:

點(diǎn)擊“查看公眾號”,再點(diǎn)擊“查看歷史消息”





程序員同盟”公眾號專為程序員,App設(shè)計(jì)師,各位愛好編程和酷愛分享的小火伴們推送各樣編程相干知識,優(yōu)秀軟件推薦,業(yè)界動態(tài)等。搜索 ProgrammerLeague 加關(guān)注~


延續(xù)關(guān)注 程序員同盟 微信公眾號,更多有趣,有料,有亮點(diǎn)的內(nèi)容等著你哦!

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: ck7788免费视频 | 日韩伦理福利免费 | 在线亚洲v日韩v | 国产精品久久久久久久久夜色 | xxx性xxx| 天天做天天爱天天综合网 | 羞羞视频免费看网站 | 91福利在线看 | 最近高清无吗免费看 | 一区二区三区福利视频 | 国产欧美日韩综合二区三区 | 欧美精品国产综合久久 | 亚洲成人一区二区 | 日韩亚洲欧洲在线com91tv | 日韩在线一区二区三区视频 | 日本理论在线观看被窝网 | 在线婷婷 | 日本一级毛片片在线播放 | 在线婷婷| 欧美三级欧美一级 | 久久久久88色偷偷 | 精品视频一区二区三三区四区 | 国产精品片| 亚洲精品国产不卡在线观看 | 校园春色另类 | 欧美人成人亚洲专区中文字幕 | 俺也去第四色 | 一区二区三区四区视频在线观看 | 一区二区三区视频在线播放 | 久久久久久久久久久大尺度免费视频 | 欧美free嫩交videoxxx| 荷兰videos| 91精品国产亚一区二区三区 | 国产在线拍国产拍拍偷 | xxxx性xx另类| 中文国产成人精品久久96 | 美国免费高清一级毛片 | 欧美一级淫片漂亮的老师 | 国产成人精品久久综合 | 五月婷婷伊人 | 一区二区三区鲁丝不卡麻豆 |