於是乎,灰太狼移動的函數也跟著變樣:
int move(int )
{
int xOffset =( - 39)% 2;
int yOffset =( - 38)% 2;
int x1 =灰太狼當前位置x+ xOffset;
int y1 =灰太狼當前位置y+ yOffset;
int x2 =灰太狼當前位置x+ xOffset * 2;
int y2 =灰太狼當前位置y+ xOffset * 2;
/*移動判斷邏輯*/
}
這樣一來,可比老爹剛剛暗中偷取取巧的雞賊辦法看上去了高大上多了。
雖然看到這兩行代碼不能像老爹之前那種方法一目了然地明白意圖所在,不過我和小弦子都很是滿意,六叔叔也微微點了點頭,想來也是認可這種結果的。
「不對呀,老爹,你隻說了說了答案,都沒有傳授我們是如何推導出算法的方法呢!古人不是雲過麽?授人以魚不如授人以漁。」
我突然意識到這個嚴重的問題,老爹要是不把他推導的過程說出來的話,下一次遇到這種問題我是不會啊!
「這個還真不是我不跟你們說,而是我當初也是連蒙帶猜出來的。」
老爹笑了笑,臉上難得露出了不好意思的表情。
「我不信!」
老爹的回答比剛剛那個投機取巧的算法還讓人難以接受,這次他壓根兒連巧都懶得取了。
老爹是誰?資深級別的程序員,這種看起來也不是好複雜的算法怎麽可能是他猜出來的嘛!「猜」這個字簡直對不起他的專業素養。
「是真的,就像你們數學考試,不是經常給出前面幾個數字,然後讓你們按照規律填寫後面的數字麽?
這也沒有什麽固定的方法可言,最有效的方法就是把所有能夠想到的套路都拿來嘗試一下,興許就能夠發現其中的規律。要是一時之間沒有方向,基本上很難看出規律來。
不過當你們看過的套路多了,自然而然就有感覺了。」
老爹無奈道。
既然老爹都這麽說了,雖然我還是有點難以接受,但也沒有其他辦法了。畢竟數學老師在講那種找規律的題是,解題思路和老爹的說法別無二致。
到了現在這階段,灰太狼移動的這部分邏輯算是大局已定。為了培養我和小弦子建立「自上而下」的編程思維,老爹從功能劃分的角度將推箱子這個遊戲重新解析了一遍。
所謂的「自上而下」的編程思維,就是說當我們要實現一個項目的時候,首先要做的並不是具體的代碼應該怎麽寫,而是按照之前老爹講的程序哲學三連問將程序分成幾大模塊,並分析出模塊與模塊之間的聯系。
而所謂的聯系,實際上就是數據的交互。
接下來就是將每個大模塊又分成一個個小模塊,這個時候的小模塊就是功能相對獨立函數了。
最後一步,這才是考慮具體某個函數的代碼應該怎麽寫
於是這些功能獨立的函數組合在一起形成了一個大的模塊,而所有的模塊組合在一起,就是一個完整的程序了。
這樣做有幾個好處,最大的好處就是將程序分成塊兒了之後可以多人分工合作,當然前提在對程序分塊兒的時候就要定義好對外的函數的接口,如函數的名字、參數列表以及返回值類型。
其次就是方便維護,如果要增加或者修改功能,就只需要修改某一部分,只要對外的函數接口不變,其他模塊就不會受到影響。
由於我和小弦子初次接觸這種理念,老爹事無巨細,一一為我們解釋得清清楚楚。這麽一個小遊戲程序在老爹解剖之下被分為了三大模塊:地圖加載、人物移動、狀態保存和過關判定。
地圖加載又分為從文件中讀取地圖數據到地圖二維數組和從根據二維數組加載圖片元素。
人物移動分為地圖二維數組中元素的變換和圖片元素的變化顯示。
狀態保存是為了降低遊戲難度,每次地圖二維數組的元素發生了改變時,就將數據保存在本地文件中,當遊戲玩家按了返回上一步按鈕後,就從本地文件中讀取數據,重新加載地圖,從而達到「後悔」功能的效果。
不然的話一旦操作錯了一步,就得重新開始關卡。原本推算過關方法就是一件令人心裡煩躁的事情,如果還需要重頭再來,很容易讓玩家產生砸電腦的衝動。
過關判定還是和原來一樣,沒有什麽變化。
除此之外,老爹還讓我們把一些用的地方比較多,且值固定的數據定義成全局常量,比如說圖片尺寸,這樣以後如果圖片的尺寸發生了改變,只需要修改一個地方就可以了。
老爹將所有的東西:各個模塊的函數接口,模塊下的各個小模塊的函數定義,全局變量和常量都用一個文檔記錄得清清楚楚,然後分發給了我和小弦子。
「剛剛我幾乎給你們演示了開發一個軟件的全部過程,這份文檔也算得上是設計概要了,現在就由你們倆合作,將這個程序給敲出來。
其中涉及到文件保存和讀取的地方先定義一個什麽都不做的函數放在那兒,等到我們明天學習了文件指針後再添加上去就好了。」
老爹布置完任務,隨即宣布今天的課程結束。
今天的內容倒是不多,但是都很重要。主要講了關鍵字static、external的用法,C語言內存分區,提取相似的代碼封裝成函數,和算法的第一次接觸以及自上而下程序設計理念。
基本上都是一些摸不著的理論知識,並且只有通過一定量的代碼累積才能夠體會到這其中的好處。
但是這些知識卻無處不在,影響著程序開發的方方面面。就拿自上而下的程序設計理念來說,如果一個程序的模塊劃分得好,不禁能夠提高程序開發的效率,同時也方便日後的維護工作。
「寫代碼不是功能實現了就算是結束,其實寫程序也算是一種藝術,在追求高效的同時也要追求優雅。代碼說到底不過是一種文檔,既然是文檔,那自然是給人看的,所以注釋是必不可少的!一個好的代碼文檔,裡面的注釋可能會佔到整個篇幅的50%以上。
當代碼寫出來之初,世界上只有兩個知道是什麽意思,一個是程序員自己,另外一個是上帝。如果沒有注釋的話,在半個月後世界上就只有一個人知道是什麽意思了,知道是誰麽?」
老爹笑著問道。