作业要求:https://edu.cnblogs.com/campus/ustc/InnovatingLeadersClass/homework/2231
项目源码:https://github.com/jackroos/golden_number
N个同学(N通常大于10),每人写一个0~100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到黄金点G。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
本次结对编程的项目是每个两人小组编写一个黄金点游戏的bot,然后进行上下半场各400轮的黄金点比赛。
假设有M个玩家, \(P_1, P_2, P_3, ..., P_M\)
在 (0-100) 开区间内,所有玩家自由选择两个正有理数数字提交(可以相同或者不同)给服务器,假设\(N_{11}, N_{12},N_{21},N_{22}, ..., N_{M1},N_{M2}\)
等\(M\cdot2\)个数字都提交后,服务器做如下计算:
\[(N_{11}+N_{12}+N_{21}+N_{22}+…+N_{M1}+N_{M2})/(M\cdot2)\cdot0.618 = GN\]
由此得到黄金点数字\(GN\)
查看所有玩家提交的数字与\(GN\)的算术差的绝对值,值最小者得分,值最大者扣分。其它玩家不得分
此回合结束,进行下一回合,多回合后,累计得分高者获胜
\(M\)个玩家比赛时,每轮离\(GN\)最近的玩家得\(M\)分,最远的扣2分,其它玩家不得分
如果一个玩家在一轮内提交两个相同的数字并得分时,只计一次分
多个玩家在一轮内同时离\(GN\)最近时,每个玩家都得\(M\)分
bot0.py 我们组的黄金点游戏bot源代码
golden_number_server.py 一个可以多进程调用bots的黄金点游戏server
run_golden_number_game.py 示例程序,调用我们自己的黄金点游戏server进行黄金点比赛
注:bots文件夹中的bot1.py ~ bot6.py是一些简单策略的bot,可以用来模拟比赛。
bot0.py源代码接口及函数结构
bot0.py 中的核心函数:
GoldenNumberServer 类接口
我觉得契约式设计的好处是可以在编程的时候就知道输入数据的合法类型和范围,这样在编写代码的时候能够减少很多边界条件/异常情况的处理,而将注意力集中于主要算法的设计。他的缺点就是不适用于很多只在内部调用的模块,内部调用的库和函数,没必要进行这样的契约式设计,在内部调用的时候一般不会出现类型错误或者不合法值。
我们项目中的契约主要就是bot主程序代码读取历史数据和输出提交的数都是通过标准输入/输出,然后输入/输出也符合提前约定好的格式,比如数与数之间用制表符分隔等。
我们没有显式的去定义我们的代码规范,只是根据Python语言中比较公认的一些规范进行编码,然后尽量把每个独立的部分单独成函数,这样便于测试和改进代码。然后关于异常处理,由于假设输入输出都是标准输入输出,格式是预先定好的格式,所以我们的代码也没有进行什么特别的异常处理。
我们在结对编程的前半阶段采取的是分工的方式,后半阶段采取的是驾驶员和领航员的合作方式。
结对编程的优点和缺点:
我们各自的优缺点:
?
原文:https://www.cnblogs.com/jackroos/p/9822261.html