在前四个作业中, 我们体会了数组,子数组的和,二维数组,字符串和字母的处理, 简单和复杂的 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 分。

【这是 现代程序设计 (课程设计中, 征求意见稿) 的一部分】