馬里奧和c語(yǔ)言

姓名:于川皓 學(xué)號(hào):16140210089

轉(zhuǎn)載自:https://www.zhihu.com/people/zheng-jian-2

【嵌牛導(dǎo)讀】:學(xué)習(xí)c需要能給我們帶來(lái)什么?這值得我們思考


【嵌牛鼻子】:編程,c語(yǔ)言既棺,應(yīng)用


【嵌牛提問(wèn)】:學(xué)習(xí)c語(yǔ)言怎樣和生活實(shí)際結(jié)合起來(lái)醋奠?

【嵌牛正文】:

馬里奧碰到花朵就變身鳍寂。


什么是馬里奧搔确?一個(gè)裝著 16 × 32 個(gè)小色塊的長(zhǎng)方形杆烁,其中一些色塊填著顏色陪竿,另一些沒(méi)有禽翼。什么是花?一個(gè) 16 × 16 的正方形族跛。什么是「變身」闰挡?把馬里奧這個(gè)方塊里面代表衣服的褐色變成紅色,代表背帶褲的紅色變成白色礁哄。什么是褐色长酗?暫且說(shuō)它是 0x887000 這個(gè)數(shù)字。什么是「碰到」桐绒?馬里奧的長(zhǎng)方形與花朵的正方形有所重疊夺脾。什么是「重疊」?假設(shè)馬里奧的這個(gè)方塊占據(jù)屏幕(什么是屏幕茉继?一個(gè)能裝下 256 × 240 個(gè)小色塊的矩形)中 X 方向 101 到 116咧叭、Y 方向 21 到 52 之間的區(qū)域,那么只要這個(gè)區(qū)域內(nèi)有一點(diǎn)或更多點(diǎn)也被花朵所占據(jù)(比如花朵處在 X 116 到 131烁竭、Y 21 到 36 之間的區(qū)域內(nèi))菲茬,我們就認(rèn)為兩者有所重疊。


若給定以八個(gè)數(shù)值代表的兩個(gè)矩形區(qū)域派撕,請(qǐng)寫出判斷兩個(gè)區(qū)域是否有重疊的 C 語(yǔ)言程序婉弹。如果你能寫出來(lái),那么祝賀你终吼,如果有朝一日你想自己用 C 做一遍 NES 版本的《超級(jí)馬里奧》马胧,你至少知道讓他變身需要做什么了。


是的衔峰,C 語(yǔ)言也許「只能」做數(shù)學(xué)題佩脊⊥苷常可是,絕大多數(shù)游戲的運(yùn)行過(guò)程就是不停地做數(shù)學(xué)題威彰,而所謂編寫游戲出牧,也就是把游戲的規(guī)則和游戲的效果轉(zhuǎn)化為數(shù)學(xué)題而已。其中不少題目電腦都已經(jīng)知道怎么解——是別的程序員事先告訴它的——比如「求一堆散落在三維直角座標(biāo)系之中的多面體在 8(x?3)?10(y+1)?11(z?1)=0 這個(gè)平面上一個(gè)給定范圍內(nèi)的投影」或者「給定一些彼此相連的頂點(diǎn)歇盼,求任意兩點(diǎn)之間的最短路徑」之類的數(shù)學(xué)題舔痕,它只需要千萬(wàn)分之一秒就能給你解好。這種能力有什么用豹缀?電腦上 FPS 游戲的本質(zhì)活動(dòng)就是不停地求三維座標(biāo)系下的多面體經(jīng)過(guò)變換之后在二維平面上的投影伯复,不停地判斷兩個(gè)多面體是否彼此重疊,以及不停地尋找兩個(gè)頂點(diǎn)之間的最短路徑邢笙,最終達(dá)到讓怪物沖到你面前咬你一口的目的啸如。不止游戲如此,其他軟件也都差不多氮惯,每一個(gè)細(xì)節(jié)都是某種數(shù)學(xué)題——比如知乎頁(yè)面頂端的藍(lán)色導(dǎo)航條背景叮雳,就是 CSS 描述的一個(gè)淺藍(lán)到深藍(lán)的漸變——漸變是怎么回事呢?給出兩個(gè)數(shù)字分別代表兩種顏色妇汗,以及第三個(gè)數(shù)字代表一段距離帘不,求一系列顏色的數(shù)值以及次序,使得這段距離中兩種相鄰顏色之間的變化最小杨箭。數(shù)學(xué)題寞焙。別說(shuō) C 語(yǔ)言,一切編程語(yǔ)言最終都只能做數(shù)學(xué)題互婿,根據(jù)給定的數(shù)據(jù)棺弊,算出另一些數(shù)據(jù),算出更多的數(shù)據(jù)擒悬,然后存貯模她、發(fā)送或者呈現(xiàn)算出的數(shù)據(jù)。


不過(guò)我能理解你的困惑懂牧。投入大量時(shí)間看完教程侈净,結(jié)果只能在黑框里輸出一串?dāng)?shù)字。這是在學(xué)編程還是在向七十年代致敬僧凤?編程是這樣無(wú)法給人成就感的活動(dòng)嗎畜侦?是,也不是躯保⌒牛看你的表述,應(yīng)該不是小孩子了途事,因?yàn)樾『⒆硬粫?huì)因?yàn)槌鯇W(xué)編程能做的事情很少而沒(méi)有成就感验懊,或者說(shuō)擅羞,覺(jué)得這樣做沒(méi)有成就感的小孩子根本不會(huì)繼續(xù)學(xué)下去。最初學(xué)編程的成就感單純來(lái)自于「我居然可以指揮機(jī)器做一些事」义图,至少我小時(shí)候用中華學(xué)習(xí)機(jī)編一個(gè)程序幫我算暑假作業(yè)上的四則運(yùn)算題時(shí)是這樣感覺(jué)的减俏。寫出這些程序并用它解題雖然遠(yuǎn)比自己動(dòng)筆去把題目算出來(lái)費(fèi)時(shí),卻讓人樂(lè)此不疲碱工。那時(shí)候我還不知道馬里奧碰到花會(huì)變身這種事情其實(shí)也是靠編程編出來(lái)娃承,所以我也不會(huì)去想學(xué)編程「并不能做什么」。


無(wú)奈大多數(shù)人過(guò)了一定年紀(jì)就很難再靠「我能指揮機(jī)器」這種簡(jiǎn)單原始的快樂(lè)來(lái)驅(qū)動(dòng)自己學(xué)編程怕篷。見(jiàn)過(guò)世面历筝,聽過(guò)傳言,欲望和野心變得復(fù)雜而龐大廊谓,你想要圖形界面梳猪,音樂(lè)音效,人工智能蹂析,云端同步舔示,可是你悶頭學(xué)了幾堂課碟婆,還是只學(xué)會(huì)在黑框里顯示一串?dāng)?shù)字电抚。你懷疑這是學(xué) C 語(yǔ)言的錯(cuò),于是你到知乎上來(lái)問(wèn)了這個(gè)問(wèn)題竖共。


你的疑惑是有道理的蝙叛。


如果能把編程學(xué)下去,日后你就會(huì)明白公给,任何程序都是一座冰山借帘,最終用戶能看到的界面和使用的功能,只是程序浮在水面上的十分之一淌铐。知乎這個(gè)網(wǎng)站其實(shí)也是個(gè)運(yùn)行在某臺(tái)電腦上的程序肺然,你能看到的十分之一是用什么編寫的呢?HTML腿准,CSS际起,JavaScript,或者 Objective-C吐葱。而你看不到的那十分之九是用什么編寫的呢街望?Python。這些你無(wú)法直接觀測(cè)到的 Python 程序運(yùn)行在世界某個(gè)角落的某些計(jì)算機(jī)上弟跑,隔著光纜灾前、雙絞線和無(wú)線基站,為你面前或掌上的用戶界面注入生命孟辑。


( xkcd: Python )


……可是 Python 是用什么編寫的呢哎甲?C 語(yǔ)言(當(dāng)然蔫敲,這么說(shuō)并不嚴(yán)謹(jǐn),Python 理論上可以用任何其他語(yǔ)言實(shí)現(xiàn)烧给,實(shí)際上也已經(jīng)被用很多其他語(yǔ)言實(shí)現(xiàn)了燕偶,不過(guò)這并不是重點(diǎn))。任何編程語(yǔ)言都是實(shí)現(xiàn)某個(gè)功能的工具础嫡,Python 實(shí)現(xiàn)了知乎這個(gè)網(wǎng)站的大部分功能指么,而 C 實(shí)現(xiàn)了「用 Python 寫程序」這個(gè)功能。為什么是 C榴鼎?


C 很別扭又缺陷重重伯诬,卻異常成功。固然有歷史的巧合推波助瀾巫财,可也的確是因?yàn)樗軡M足對(duì)于這樣一種系統(tǒng)實(shí)現(xiàn)語(yǔ)言的需要:既有相當(dāng)?shù)男蕘?lái)取代匯編語(yǔ)言盗似,且又足夠地抽象而流暢,能夠用于描述各種各樣的環(huán)境之下的算法與交互平项。

C is quirky, flawed, and an enormous success. Although accidents of history surely helped, it evidently satisfied a need for a system implementation language efficient enough to displace assembly language, yet sufficiently abstract and fluent to describe algorithms and interactions in a wide variety of environments.

——C 語(yǔ)言之父赫舒,Dennis M. Ritchie


C 是初代程序員所使用的語(yǔ)言,那時(shí)候硬件很貴闽瓢,軟件必須高效接癌;而計(jì)算機(jī)的用戶都是職業(yè)程序員,對(duì)于硬件有足夠的理解扣讼。C 貼近硬件缺猛,就意味著它容易譯成機(jī)器能懂的語(yǔ)言,而它的設(shè)計(jì)者也并不需要操心普通人學(xué)起來(lái)可能會(huì)比較困難——而且椭符,說(shuō)真的荔燎,其實(shí)也不很難。但是销钝,這么多年過(guò)去之后有咨,軟件規(guī)模變得越來(lái)越大,C 就像錘子和手鋸蒸健,修小木屋得心應(yīng)手座享,造摩天樓就比較力不從心;但 C 語(yǔ)言可以用來(lái)造出其他更適合建造摩天樓的工具纵装,乃至組成摩天樓的預(yù)制件征讲,就好比用錘子和手鋸造出挖掘機(jī)和吊車、混凝土板和一體門窗一樣(當(dāng)然橡娄,這個(gè)類比并不十分貼切诗箍。可是沒(méi)有什么類比能貼切地描述軟件工程挽唉,因?yàn)檐浖こ滔裨S多東西滤祖,卻又什么東西都不像)筷狼。


所以,回到你的問(wèn)題上來(lái)匠童,是的埂材,學(xué)會(huì) C 計(jì)算機(jī)語(yǔ)言真的可以開發(fā)出很多東西,但除非內(nèi)力深厚汤求,場(chǎng)合適當(dāng)俏险,并且閑得蛋疼,大多數(shù)人不會(huì)拿 C 或者只拿 C 來(lái)開發(fā)太大的東西扬绪。如果你只是想要一門能夠讓你「編輯出一個(gè)啥子游戲或者軟件出來(lái)」的語(yǔ)言竖独,而且你用 Windows,那建議你轉(zhuǎn)去學(xué)學(xué) C#挤牛。它長(zhǎng)得和 C 挺像莹痢,但卻能迅速地寫出至少是帶有圖形界面的程序,用起來(lái)也很方便墓赴,鼠標(biāo)點(diǎn)一點(diǎn)就能讓你對(duì)自己的程序看起來(lái)什么樣有個(gè)比較直觀的印象竞膳。還有,在國(guó)內(nèi)诫硕,C# 的教材也相當(dāng)容易找到坦辟。當(dāng)然 Python 也是一個(gè)很好的選擇。



另外痘括,還有一件事你必須弄明白:現(xiàn)代的所謂編程這一活動(dòng)长窄,其實(shí)大部分時(shí)候是在「合理地堆砌別人已經(jīng)實(shí)現(xiàn)的功能來(lái)實(shí)現(xiàn)新的功能」滔吠,C 語(yǔ)言莫不如是纲菌,比如 printf 這個(gè)東西,是別人做出來(lái)的「把一些數(shù)據(jù)按照指定格式輸出到屏幕上」這一功能疮绷。而別人還做出來(lái)許多其他功能翰舌,比如「在發(fā)現(xiàn)用戶短時(shí)間內(nèi)連續(xù)兩次按下鼠標(biāo)又松開的時(shí)候調(diào)用你寫好的一個(gè)函數(shù)」。學(xué)會(huì)怎樣在 C 或者其他任何程序語(yǔ)言中使用這些既有功能冬骚,也是學(xué)習(xí)編程的一門重頭戲椅贱。等你弄明白這一點(diǎn),你也就找到了你問(wèn)題的答案只冻。


尾注1:題圖畫錯(cuò)了庇麦。馬里奧身寬應(yīng)為 16 像素,我畫成了 17喜德。

尾注2:NES 上的超級(jí)瑪利奧使用 6502 匯編完成山橄,并不是 C,碰撞檢測(cè)也不是像素級(jí)的舍悯。

尾注3:我不是易語(yǔ)言發(fā)明者航棱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睡雇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饮醇,更是在濱河造成了極大的恐慌它抱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴艰,死亡現(xiàn)場(chǎng)離奇詭異观蓄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)祠墅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蜘腌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人饵隙,你說(shuō)我怎么就攤上這事撮珠。” “怎么了金矛?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵芯急,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驶俊,道長(zhǎng)娶耍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任饼酿,我火速辦了婚禮榕酒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘故俐。我一直安慰自己想鹰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布药版。 她就那樣靜靜地躺著辑舷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪槽片。 梳的紋絲不亂的頭發(fā)上何缓,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音还栓,去河邊找鬼碌廓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剩盒,可吹牛的內(nèi)容都是我干的谷婆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼波材!你這毒婦竟也來(lái)了股淡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤廷区,失蹤者是張志新(化名)和其女友劉穎唯灵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隙轻,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埠帕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玖绿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敛瓷。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斑匪,靈堂內(nèi)的尸體忽然破棺而出呐籽,到底是詐尸還是另有隱情,我是刑警寧澤蚀瘸,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布狡蝶,位于F島的核電站,受9級(jí)特大地震影響贮勃,放射性物質(zhì)發(fā)生泄漏贪惹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一寂嘉、第九天 我趴在偏房一處隱蔽的房頂上張望奏瞬。 院中可真熱鬧,春花似錦泉孩、人聲如沸硼端。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)显蝌。三九已至预伺,卻和暖如春订咸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酬诀。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工脏嚷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞒御。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓父叙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趾唱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容