在前四个作业中, 我们体会了数组,子数组的和,二维数组,字符串和字母的处理, 简单和复杂的 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 分。
【这是 现代程序设计 (课程设计中, 征求意见稿) 的一部分】