日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 【C語言探索之旅】 第一部分第八課:第一個C語言小游戲

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

來源:程序員人生   發布時間:2015-01-24 08:29:10 閱讀次數:4999次

?


內容簡介


1、課程大綱

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

3、第1部份第9課預告: 函數


課程大綱


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


C語言編程基礎知識


  • 甚么是編程?

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

  • 你的第1個程序

  • 變量的世界

  • 運算那點事

  • 條件表達式

  • 循環語句

  • 實戰:第1個C語言小游戲

  • 函數

  • 練習題

  • 習作:完善第1個C語言小游戲


C語言高級技術


  • 模塊化編程

  • 進擊的指針,C語言王牌

  • 數組

  • 字符串

  • 預處理

  • 創建你自己的變量類型

  • 文件讀寫

  • 動態分配

  • 實戰:“懸掛小人”游戲

  • 安全的文本輸入

  • 練習題

  • 習作:用自己的語言解釋指針


用基于C語言的SDL庫開發2D游戲


  • 安裝SDL

  • 創建窗口和畫布

  • 顯示圖象

  • 事件處理

  • 實戰:“超級瑪麗推箱子”游戲

  • 掌握時間的使用

  • 用SDL_ttf編輯文字

  • 用FMOD控制聲音

  • 實戰:可視化的聲音譜線

  • 練習題


數據結構


  • 鏈表

  • 堆,棧和隊列

  • 哈希表

  • 練習題



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


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


信不信由你,你其實已有水平實現自己的第1個成心思的程序了。


準備工作和建議


程序的原理

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

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


游戲的原理是這樣:

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

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

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

  4. 然后它會再次讓你輸入數字,并告知你比較的結果

  5. 1直到你猜到這個數為止,1輪結束


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


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


這個數字是甚么?50

猜小了!

這個數字是甚么?75

猜小了!

這個數字是甚么?85

猜大了!

這個數字是甚么?80

猜大了!

這個數字是甚么?78

猜小了!

這個數字是甚么?79

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


隨機抽取1個數

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


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


事實上,為了“嘗試”得到1個隨機數,我們不能不讓電腦來做1些復雜的運算,好吧,歸根結柢還是做運算。


我們有兩個解決方案:

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

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


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


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


我們會用到以下的情勢:

srand(time(NULL));

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


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

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

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


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


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


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


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


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

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


const int MAX = 100, MIN = 1;


引入的庫

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

stdio.h

stdlib.h

time.h

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


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


我的代碼

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

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


#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;

 // 生成隨機數

 srand(time(NULL));

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

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

 do

 {

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

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

     scanf("%d", &guessNumber);

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

     if (mysteryNumber > guessNumber)

         printf("猜小了 ! ");

     else if (mysteryNumber < guessNumber)

         printf("猜大了 ! ");

     else

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

 } while (guessNumber != mysteryNumber);


 return 0;

}


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

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

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

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

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

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

    mysteryNumber大于guessNumber,那末輸出“猜小了”,繼續循環

    mysteryNumber小于guessNumber,那末輸出“猜大了”,繼續循環

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


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


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

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

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

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

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


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



第1部份第9課預告:函數


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

下1次我們學習第9課,來認識函數這個極其重要和有用的內容吧!





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

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

小編的微信號 frogoscar

小編的QQ號:  379641629

小編的郵箱:    enmingx@gmail.com

微信和郵箱最經常使用


PS: 有朋友反應看手機真個文章太累,實際上是可以用閱讀器網頁來看的

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



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



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

點擊“查看公眾號”,再點擊“查看歷史消息”





程序員同盟”公眾號專為程序員,App設計師,各位愛好編程和酷愛分享的小火伴們推送各樣編程相干知識,優秀軟件推薦,業界動態等。搜索 ProgrammerLeague 加關注~


延續關注 程序員同盟 微信公眾號,更多有趣,有料,有亮點的內容等著你哦!

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲不卡电影 | 国内av毛片 | 九一在线观看 | 偷拍自拍网站 | 在线激情av | 最新黄色在线视频 | 欧美视频一区二区 | 久久免费精品 | 国产男女乱淫真高清视频免费 | 黄色电影在线免费看 | 日韩免费毛片 | 国产视频一区在线观看 | 国产精品免费网站 | 国产在线精品91国自产拍免费 | 国产精品久久av | 久久精品欧美一区二区三区不卡 | 亚洲精品乱码久久久久久9色 | 99成人在线视频 | 一区二区中文 | 久久99精品久久久久久琪琪 | 久久久亚洲国产精品麻豆综合天堂 | 欧美乱妇18p | 精品日韩一区二区三区 | 亚洲一区二区三区四区在线视频 | 日韩视频专区 | 99热6这里只有精品 国产精品精品视频一区二区三区 | 经典一区二区 | 操操操日日日 | 动漫毛片 | 一级视频在线 | 黄色免费网站在线观看 | 欧美一区二区在线免费观看 | 欧美成人黄色 | 亚洲欧美v | 免费偷拍视频 | 疯狂欧洲av久久成人av电影 | 欧美一区二 | 精品一区二区视频 | 成人午夜精品一区二区三区 | 91精品导航 | 11www色com|