現代程序設計 做業6 - 簡單而有意義的題目

這是這個課件的一部分:  現代程序設計 (課程設計中, 徵求意見稿)html

好多同窗們都說題目難,這回咱們來一個簡單而頗有意義的。  :) 程序員

寫代碼爽仍是讀代碼爽? 往一堆亂麻中再加上一些線索,彷佛比較容易;然而從這一團亂麻中理出頭緒,仍是比較難的。下圖來自 知乎的一個討論編程

image

 

咱們練習了這麼多做業,全部做業都是從頭寫程序,可是咱們到了真正的項目組或公司裏,一般咱們會改進一個已經存在項目 (這個項目說不定已經存在好多年了),這個項目的文檔也很少,編碼規範也不是太完美。 這時候咱們怎麼辦?  咱們固然能夠經過下面的辦法:設計模式

  1. 理解程序
  2. 在不損害程序現有功能的狀況下,修復bug 或增長新功能
  3. 同時有計劃地經過重構或重寫,改進這個程序,讓它更好地被程序員理解,更好地能適應可能產生的變化。

這個做業就是這樣一個例子。 網絡

假設有一組水平不高的程序員,或者一個水平不高的程序員(好比我),在好久之前爲了學習Java, 就寫了一個 Java 的圍棋下棋程序 (不是人工智能,只是在屏幕上展示下棋的過程),  後來C# 出現以後,他又隨意地把程序改寫爲C#,  通過簡單測試以後,他就把程序放在一邊了。 架構

 

image

 

如今咱們拿到了這個代碼,程序還能夠編譯成功,可是不巧的是一個關鍵函數只有函數體,沒有具體的實現了。例如:函數

int  GetLiberty(int x, int y, StoneColor c ) //判斷當前的位置上的棋子和相連的一組棋子一共有多少氣工具

這個程序原來總共有30行(算上空行和單字符行),可是因爲種種緣由, 這個函數只剩下了一句話學習

return 1; 測試

如今請用遞歸和非遞歸兩種方式把它實現出來。

 

關於個棋子或一組相連的棋子有多少氣,有沒有氣, 十分簡單。

詳細的規則請看網上的許多教程。  舉兩個很是簡單的例子:

image  若是此時該黑棋下,黑棋下在 (A,1) 的位置, 那麼黑棋就把白棋 A2 的棋子吃掉了。若是此時該白旗下,白棋下在 C1 的位置,那麼白棋就把兩顆黑棋吃掉了。

image 此時,黑白雙方誰能佔據 O4 的位置, 就可以決定兩個黑棋有沒有氣。

 

(上面的題目已經在課堂上搞定了,咱們再擴展一下)

目前給同窗們的程序能在下面兩種狀況下瀏覽棋局:

a) 直接在棋盤上面點擊,程序就會按照黑白相間的次序走棋。

b) 用戶能夠用程序打開一個棋譜文件 (*.sgf),  而後按 「>」 按鈕,程序就會按次序下棋。

你們注意到用戶界面上還有一個 「<」 按鈕,  這是讓用戶把下棋的步驟倒回去 (若是上一步一方吃掉了許多棋子, 那麼咱們還要把這些吃掉的棋子恢復好)

函數說明在這裏:

image

這個函數的大部分都沒有實現,如今咱們要實現它。 (要求: 全部的修改都只在這一個函數體裏面

咱們的同窗們學了《現代程序設計》,搞定下面的挑戰應該不成問題:

1) 把程序編譯經過, 跑起來。

    讀懂程序,在你以爲比較難懂的地方加上一些註釋,這樣你們就能比較容易地瞭解這些程序在幹什麼。

     把正確的 playPrev(GoMove) 的方法給實現了。 若是你們不會下圍棋,那就須要你們實地或者上網練習一下圍棋的死活,提子是怎麼回事。這個應該一個小時就能搞定。

2)根據你選擇的教材 (三本之一或更多),點評一下這個程序設計方面的不足,例如:

     編碼風格,

     程序架構,有哪些不符合良好的設計,這個程序的設計模式 (MVC等) 是高端大氣國際化的麼? 等等。 

     程序的錯誤處理,文件處理,UI 等等

     你們可能會想到,這個程序雖說編譯都過了,但說不定有不少基本的小問題沒解決,VS 的強大的編譯器和代碼分析工具能把它們都找出來? 固然能夠:

      image

     你們能夠運行 VS 的代碼分析工具,找到這個程序的這些問題,並改進。下面是報告的一部分:

image

這些改進能夠是很小的,例如,把全部函數的命名都規範化,這算一個改進。同窗們至少要把Code Analysis 報告的全部問題給解決了。

關於Code Analysis 的更多信息:

http://msdn.microsoft.com/en-us/library/ee1hzekz.aspx

http://msdn.microsoft.com/zh-cn/library/vstudio/ms182278.aspx 

 

3) 程序的註釋

    全部人都以爲註釋很重要,寫程序不寫註釋的同窗真是RP 比較低。。。

    那麼,就請把這個程序中被標成 「zzzz」 的註釋都恢復過來。 固然,你能夠用中文寫註釋。

4) 選擇題: (提示: 這個題目另外算分,滿分10分,須要掙分的同窗就能夠考慮這個選擇題)

對於功能上的小問題, 那麼你怎麼改進呢? 請選出 1-2個你想作的改進,而後運用你的各類編程技術和能力把這些改進給實現了(必須明確指出改進/增長了哪個功能)。

      把全部的改進都實現以後,把代碼簽入 GitHub, 經歷了這一番改動,你的程序和別的同窗的程序就很不同了。

若是你們有時間並有興趣,能夠作一些大的改進:

      a) 若是我要把這個程序變成一個能夠人機對戰的小遊戲 (假設你的AI 模塊已經寫好,這裏咱們就可讓一個函數返回一個合法的位置就能夠), 那這個程序的架構應該怎麼變化?  請把這個功能寫出來。

      b) 若是我想讓這個程序變成兩個用戶能夠經過網絡對戰,這個程序的架構要怎麼變化?

 

另: 你們在讀程序的時候能夠測試一下本身的會發什麼樣的腦電波。 :)  看看下面的論文:

http://wwwiti.cs.uni-magdeburg.de/~feigensp/experiments/fMRI/fse_fMRI-Poster.pdf

相關文章
相關標籤/搜索