現代程序設計 作業5

在前四個作業中, 我們體會了數組,子數組的和,二維數組,字符串和字母的處理, 簡單和複雜的 UI 程序等。大家鍛鍊了命令行的處理,模塊的持續重構和演化,單元測試,UI 程序的處理,全局單例的做法,MVC 設計模式等等。同時我們還學習和練習了兩次結對編程,學習瞭如何用代碼規範讓自己的程序容易理解,便於維護。

有了前面的基礎,現在我們來嘗試一些更有意思的題目 – 設計 client/server 的程序,做實時的數據處理。

這個作業來源於:

創新的時機 – 黃金點遊戲

我們在課堂上也玩過這個遊戲,我們自然想把這個遊戲搬到網上。 我們分兩步走:

1) 9/30 課堂練習

同學們還是兩人結對 (這次可以自由組合),設計一個基於網絡的黃金點遊戲。 要求:

  1. 多人遊戲, 每個選手有一個客戶程序在運行, 和一個服務器通過互聯網的某種協議交互。

  2. 在有網絡接的地方就可以玩 (LAN, WiFi,  3G 都應該可以)。

  3. 客戶程序要先向服務器註冊, 確保在一個遊戲的過程中, 註冊信息能保證一個(並且只有一個)客戶以某確定的用戶名參與遊戲。

  4. 服務器可以規定一次錦標賽有多少輪,  每輪的具體提交數據的格式是什麼。 在服務器規定的時間範圍內, 每個客戶程序向服務器提交黃金點數據。 客戶程序之間不交流。

  5. 在一輪介紹後, 服務器把此輪的結果 (參與用戶名,  提交的數據,第一名,G-number) 公佈在服務器上。  每個客戶程序都能自由獲取。

  6. 一輪的優勝程序可以得 10 分, 一輪的最後一名得 (–1)分, 其餘選手得 0 分。  在規定時間內不能提交數字的客戶程序得 (-5) 分。 如果有並列第一名, 則服務器取提交數字較早的客戶程序作爲優勝者。  如果有並列最後一名, 則並列者都得 (-1) 分。

  7. 每次錦標賽事先規定好是採取下列哪一個模式:

    1. 每個客戶程序必須提交一個有理數。

    2. 每個客戶程序必須提交兩個有理數。  (任何一個數字最接近G-number 則此客戶程序就是優勝。)

  8. 客戶程序可以用任何語言編寫, 只要它能夠按要求和服務器交互即可。

  9. 服務器必須實時地通過一個網頁顯示每個用戶的得分 (人可以從這裏看進展,客戶端程序會從這裏拿數據進行分析)。

  10. 服務器必須能避免接口擁堵, DDOS 等意外情況。

課堂作業交什麼?

  1. 你對於這個系統的服務器和接口是如何設計的?  應該採取哪些設計讓遊戲能順利完成? 寫出具體的接口。

  2. 你和你的同伴分工負責, 設計出服務器應該有幾個功能模塊,  這些功能模塊之間的關係 (用 UML 或其它圖例來表示)。

  3. 寫出每個模塊功能的僞代碼,要能做到讓另一個同學能看到這些僞代碼,就能明確實現的要求並馬上開始實現。

  4. 我們的課程有 60 名學生 (60 個客戶程序),如何能設計服務器程序和交互的接口讓它能在 1 秒鐘之內就完成一輪比賽?  

2) 實際服務器程序設計和展示

既然同學們設計好了服務器,那就讓我們測試大家寫的服務器吧。 兩人一組寫服務器 (按照你們原來的設計), 每個人自己寫一個比較簡單的客戶端 (這樣就有兩個客戶端了)。

測試: 上課時候大家輪番上陣,  做下面的事情。

    1. 顯示你們的博客,上面應該有你們的設計,特別是接口的設計,說明你們的接口設計是如何簡明而有效,獨特之處在哪裏?

    2. 每一對同學帶兩臺電腦到講臺上。在你們的電腦上,  啓動你們的服務器, 在的兩個電腦各運行 20 個實例 ,那就有 40 個進程了,這 40 個進程各有各的用戶名和密碼。 建議把用戶名和密碼放到一個文件中,服務器保存了所有的 <用戶名,密碼>信息,  每一個客戶端進程使用一個 <用戶名,密碼>。 建議在每個程序中加入一定的隨機因素,來避免所有的客戶端都提交一樣的數字) 。兩臺電腦可以通過局域網或其它連接方式 (例如用網線直接連接兩個電腦的網卡),這個由學生自己事前設置好,不要到時候再出錯。

    3. 開始一個錦標賽 (大約100 輪, 爲時2分鐘。 到時如果沒有完成也強行停止)

    4. 同時服務器顯示網頁自動展現各個用戶在每個輪次的排名,和每輪黃金點的變化曲線 (這樣大家用肉眼就可以看到)。

    5. 根據錦標賽完成的質量, 同學們和TA  在下面評分。

3) 同學們的客戶端比賽

我們通過上面的比賽和評比, 選出一個好用的服務器程序之後,  下面就要進行真刀***的客戶端比賽了。同學們根據服務器的設計要求修改一下他們的程序 (主要是接口部分), 每個人爲一個單位參加比賽。 寫好程序,提交到 GitHub,  TA 組織大家在一個網絡相對穩定的環境中進行比賽。 根據服務器的負載和運行效率,計劃用 1 小時完成 1,000 輪比賽,最後得出所有人的名次 。

誰的程序設計得好, 那就拉出來溜溜吧!

這個比賽如何算分?  給同學們提供服務器程序的同學得到最高分10 分, 不參加比賽 (包括程序不能正常和服務器交流)的同學得 負分。

比賽最好的同學在1000輪的錦標賽中得了 2000 分, 他的得分算10 分,其餘的同學按這個(最高分:同學實際得分)比例算得分,例如一個同學得了 200 分, 是最高分的 10%, 那麼他得 1 分。

【這是 現代程序設計 (課程設計中, 徵求意見稿) 的一部分】


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章