一、链接
二、具体分工
前端: 刘伟楠
后端: 林易丰
博客: 两人共同完成
三、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 780 | 720 |
· Analysis | · 需求分析 (包括学习新技术) | 160 | 160 |
· Design Spec | · 生成设计文档 | 120 | 130 |
· Design Review | · 设计复审 | 40 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 60 | 120 |
· Coding | · 具体编码 | 80 | 80 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 45 |
Reporting | 报告 | 40 | 40 |
· Test Report | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 45 |
· 合计 | 1590 | 1510 |
四、解题思路描述与设计实现说明
1. 网络接口的使用
以注册绑定为例:
def registerbang(self): def register_(user, psw, student_number, student_password): url = 'http://www.revth.com:12300/auth/register2' headers = { 'Content-Type': 'application/json' } data = { 'username': user, 'password': psw, "student_number": student_number, "student_password": student_password } r = requests.post(url, headers=headers, data=json.dumps(data)) return r r = register_(self.user, self.psw, self.student_number, self.student_password) status = r.json()['status'] if status == 0 and 'user_id' in r.json()['data']: self.user_id = r.json()['data']['user_id'] self.is_register = True print('register may be successful') print(r.text) else: print('register failed!') error_report(status) print(r.text)
2. 代码组织与内部实现设计
AI部分代码组织设计
api部分代码组织设计
3. 说明算法的关键与关键实现部分流程图
算法的关键就是AI。因为太菜,之前想过列出七万多种情况分别计算权值,但是难度比较大,所以AI部分采取了依次找同花顺,葫芦,炸弹,同花,顺子,三条,若找到则给后墩,若多于一个则再给中墩,余下三张牌作为前墩。若找不到则按从大到小排序,将牌按大小依次给后墩,中墩,前墩。
上图为部分流程图,主要思路就是分别寻找同花顺,葫芦,炸弹,同花,顺子,三条,优先给后墩,其次给中墩,剩下三张作为前墩。
五、关键代码解释
有价值/重要的代码
都有价值都重要……
举个炸弹的例子:
bmax和mid分别存放大小炸弹的数字(如果有)
if len(s) == 26: if len(bomb_num) == 3: # 3个炸弹 bmax = bomb_num[0] if bomb_num[1] > bmax: bmax = bomb_num[1] if bomb_num[2] > bmax: bmax = bomb_num[2] #最大给后墩 # 中间给中墩 if bomb_num[0] == bmax: if bomb_num[1] < bomb_num[2]: mid = bomb_num[2] else: mid = bomb_num[1] if bomb_num[1] == bmax: if bomb_num[0] < bomb_num[2]: mid = bomb_num[2] else: mid = bomb_num[0] if bomb_num[2] == bmax: if bomb_num[1] < bomb_num[0]: mid = bomb_num[0] else: mid = bomb_num[1] return 2 elif len(bomb_num) == 2: # 2个炸弹 bmax = bomb_num[0] if bmax < bomb_num[1]: bmax = bomb_num[1] mid = bomb_num[0] else: mid = bomb_num[1] return 2 elif len(bomb_num) == 1: # 1个炸弹 bmax = bomb_num[0] return 1 else: return 0 # 没炸弹 else: # 找给中墩 if len(bomb_num) == 2: # 2个炸弹 mid = bomb_num[0] if mid < bomb_num[1]: mid = bomb_num[1] return 2 elif len(bomb_num) == 1: # 1个炸弹 mid = bomb_num[0] else: return 0 # 没炸弹
六、性能改进与分析
1. 改进思路
优化规范一下各个找牌函数,之前因为缺少事先的构思,导致主函数里还需要许多逻辑判断和分支。
2. 展示性能分析图和程序中消耗最大的函数
七、单元测试
找同花顺函数:
构造思路就是把找特殊牌的函数拿出来单独对牌测试一下
八、贴出GitHub的代码签入记录
九、遇到的代码模块异常或者结对困难及解决办法
1. 问题描述:
判断语句时发现函数返回值不对
2. 尝试:
逐次输出看看
3. 是否解决:
是
4. 有何收获:
先把找牌的函数返回值赋给一个变量,用变量判断,不然多次使用相当于多次调用,结果不一样,也耗时
十、评价我的队员
1. 值得学习的地方
队友比较fashion,审美也比较好,心态也比较好,原型画得也好
2. 需要改进的地方
代码能力,学习热情
11 学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 重要成长 |
---|---|---|---|---|
1 | 1000 | 1000 | 20 | 写了AI,布局构思不充分,重复太多,代码过长 |
2 | 400 | 1400 | 12 | 找bug和写API |