在前四個作業中, 我們體會了數組,子數組的和,二維數組,字符串和字母的處理, 簡單和複雜的 UI 程序等。大家鍛鍊了命令行的處理,模塊的持續重構和演化,單元測試,UI 程序的處理,全局單例的做法,MVC 設計模式等等。同時我們還學習和練習了兩次結對編程,學習瞭如何用代碼規範讓自己的程序容易理解,便於維護。
有了前面的基礎,現在我們來嘗試一些更有意思的題目 – 設計 client/server 的程序,做實時的數據處理。
這個作業來源於:
我們在課堂上也玩過這個遊戲,我們自然想把這個遊戲搬到網上。 我們分兩步走:
1) 9/30 課堂練習
同學們還是兩人結對 (這次可以自由組合),設計一個基於網絡的黃金點遊戲。 要求:
多人遊戲, 每個選手有一個客戶程序在運行, 和一個服務器通過互聯網的某種協議交互。
在有網絡接的地方就可以玩 (LAN, WiFi, 3G 都應該可以)。
客戶程序要先向服務器註冊, 確保在一個遊戲的過程中, 註冊信息能保證一個(並且只有一個)客戶以某確定的用戶名參與遊戲。
服務器可以規定一次錦標賽有多少輪, 每輪的具體提交數據的格式是什麼。 在服務器規定的時間範圍內, 每個客戶程序向服務器提交黃金點數據。 客戶程序之間不交流。
在一輪介紹後, 服務器把此輪的結果 (參與用戶名, 提交的數據,第一名,G-number) 公佈在服務器上。 每個客戶程序都能自由獲取。
一輪的優勝程序可以得 10 分, 一輪的最後一名得 (–1)分, 其餘選手得 0 分。 在規定時間內不能提交數字的客戶程序得 (-5) 分。 如果有並列第一名, 則服務器取提交數字較早的客戶程序作爲優勝者。 如果有並列最後一名, 則並列者都得 (-1) 分。
每次錦標賽事先規定好是採取下列哪一個模式:
每個客戶程序必須提交一個有理數。
每個客戶程序必須提交兩個有理數。 (任何一個數字最接近G-number 則此客戶程序就是優勝。)
客戶程序可以用任何語言編寫, 只要它能夠按要求和服務器交互即可。
服務器必須實時地通過一個網頁顯示每個用戶的得分 (人可以從這裏看進展,客戶端程序會從這裏拿數據進行分析)。
服務器必須能避免接口擁堵, DDOS 等意外情況。
課堂作業交什麼?
你對於這個系統的服務器和接口是如何設計的? 應該採取哪些設計讓遊戲能順利完成? 寫出具體的接口。
你和你的同伴分工負責, 設計出服務器應該有幾個功能模塊, 這些功能模塊之間的關係 (用 UML 或其它圖例來表示)。
寫出每個模塊功能的僞代碼,要能做到讓另一個同學能看到這些僞代碼,就能明確實現的要求並馬上開始實現。
我們的課程有 60 名學生 (60 個客戶程序),如何能設計服務器程序和交互的接口讓它能在 1 秒鐘之內就完成一輪比賽?
2) 實際服務器程序設計和展示
既然同學們設計好了服務器,那就讓我們測試大家寫的服務器吧。 兩人一組寫服務器 (按照你們原來的設計), 每個人自己寫一個比較簡單的客戶端 (這樣就有兩個客戶端了)。
測試: 上課時候大家輪番上陣, 做下面的事情。
顯示你們的博客,上面應該有你們的設計,特別是接口的設計,說明你們的接口設計是如何簡明而有效,獨特之處在哪裏?
每一對同學帶兩臺電腦到講臺上。在你們的電腦上, 啓動你們的服務器, 在的兩個電腦各運行 20 個實例 ,那就有 40 個進程了,這 40 個進程各有各的用戶名和密碼。 建議把用戶名和密碼放到一個文件中,服務器保存了所有的 <用戶名,密碼>信息, 每一個客戶端進程使用一個 <用戶名,密碼>。 建議在每個程序中加入一定的隨機因素,來避免所有的客戶端都提交一樣的數字) 。兩臺電腦可以通過局域網或其它連接方式 (例如用網線直接連接兩個電腦的網卡),這個由學生自己事前設置好,不要到時候再出錯。
開始一個錦標賽 (大約100 輪, 爲時2分鐘。 到時如果沒有完成也強行停止)
同時服務器顯示網頁自動展現各個用戶在每個輪次的排名,和每輪黃金點的變化曲線 (這樣大家用肉眼就可以看到)。
根據錦標賽完成的質量, 同學們和TA 在下面評分。
3) 同學們的客戶端比賽
我們通過上面的比賽和評比, 選出一個好用的服務器程序之後, 下面就要進行真刀***的客戶端比賽了。同學們根據服務器的設計要求修改一下他們的程序 (主要是接口部分), 每個人爲一個單位參加比賽。 寫好程序,提交到 GitHub, TA 組織大家在一個網絡相對穩定的環境中進行比賽。 根據服務器的負載和運行效率,計劃用 1 小時完成 1,000 輪比賽,最後得出所有人的名次 。
誰的程序設計得好, 那就拉出來溜溜吧!
這個比賽如何算分? 給同學們提供服務器程序的同學得到最高分10 分, 不參加比賽 (包括程序不能正常和服務器交流)的同學得 負分。
比賽最好的同學在1000輪的錦標賽中得了 2000 分, 他的得分算10 分,其餘的同學按這個(最高分:同學實際得分)比例算得分,例如一個同學得了 200 分, 是最高分的 10%, 那麼他得 1 分。
【這是 現代程序設計 (課程設計中, 徵求意見稿) 的一部分】