第二次结对编程作业
1、链接
2、具体分工
王钟贤:负责本次作业的算法实现
许煌标:负责ui的设计及实现,网络接口
3、psp表格
PSP2.1 | Personal Software Process Stages |
预估耗时 (分钟) |
实际耗时 (分钟) |
---|---|---|---|
Planning | 计划 | 60 | 120 |
· Estimate | · 估计这个任务 需要多少时间 |
1800 | 2000 |
Development | 开发 | 1600 | 1800 |
· Analysis | · 需求分析 (包括学习新技术) |
30 | 60 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发 制定合适的规范) |
20 | 30 |
· Design | · 具体设计 | 60 | 80 |
· Coding | · 具体编码 | 1100 | 1210 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试, 修改代码,提交修改) |
330 | 350 |
Reporting | 报告 | 200 | 200 |
· Test Repor | · 测试报告 | 50 | 40 |
· Size Measurement | · 计算工作量 | 50 | 60 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
100 | 100 |
· 合计 | 1800 | 2000 |
4、解题思路
(1)网络接口的使用
网络接口是我第一次接触的,一开始实在弄不出来,后来发现永福大佬的api竟然提供生成代码的功能,永福是真的牛逼啊!
login:
url = "https://api.shisanshui.rtxux.xyz/auth/login"
text={"username":username,"password":password}
payload = json.dumps(text)
headers = {'content-type': 'application/json'}
response = requests.request("POST", url, data=payload, headers=headers)
register:
url = "https://api.shisanshui.rtxux.xyz/auth/register"
text = {"username": username, "password": password}
payload = json.dumps(text)
headers = {'content-type': 'application/json'}
response = requests.request("POST", url, data=payload, headers=headers)
game/open:
url = "https://api.shisanshui.rtxux.xyz/game/open"
headers = {'x-auth-token': token }
response = requests.request("POST", url, headers=headers)
game/submit:
url = "https://api.shisanshui.rtxux.xyz/game/submit"
text={"id":id,"card":card}
payload = json.dumps(text)
headers = {
'content-type': "application/json",
'x-auth-token': token
}
response = requests.request("POST", url, data=payload, headers=headers)
rank:
url = "https://api.shisanshui.rtxux.xyz/rank"
response = requests.request("GET", url)
history:
url = "https://api.shisanshui.rtxux.xyz/history"
querystring = {"page": "0", "limit": "100", "player_id": user_id}
headers = {'x-auth-token': token}
response = requests.request("GET", url, headers=headers, params=querystring)
history/{id}:
url = "https://api.shisanshui.rtxux.xyz/history/%s" % (number)
headers = {'x-auth-token': token}
response = requests.request("GET", url, headers=headers)
(2)代码组织与内部实现(类图)
主要就是card和handcard两个类以及若干处理牌型的函数,具体代码组织如上图所示。
(3)说明算法的关键与关键实现部分流程图
算法实现关键:将三墩分为第一墩和非第一墩进行不同的处理,如流程图所示判断各类牌型,将所判断出来的牌型从手牌中抽出,并补齐不足数目的牌(如炸弹,判断出有4张一样的牌,将这四张牌抽出,再补一张其他牌)
5、关键代码解释
代码中使用一个类的数组来表示当前的手牌,数组下标表示牌的值,J当作11,Q当作12,K当作13,A当作14,并在类里用s,d,h,c代表某一花色的有无(s代表梅花*,d代表红心&,h代表黑桃$,c代表方块#),num代表牌的值为n的牌有num张。
算法中采用补牌,如果此类牌型数量小于当前墩所要求的牌型数量,则补牌,直至二者相等。补的牌没有要求,因为除散牌外其余的牌型大小皆与补的牌无关。
6、性能改进与分析
改进思路:去掉了权值的比较,每次从手牌中找最大的牌(虽然这样三墩合起来不一定是最优解)
性能分析如上图所示,程序中消耗最大的函数是system
7、单元测试
此处以测试同花顺的函数为例,输入一组数据,将里面的同花顺提取出来,若无,则不输出,若有多个,则先输出较大的。测试数据选择,一、数据需包含所有牌型的情况;二、一样的数据调换牌的顺序测试多次。
8、代码签入记录
目前GitHub上的commit信息如上,后续也将会实时更新。
9、遇到的代码模块异常或结对困难及解决方法
- 问题描述:
- 在使用Python实现网络接口时,因为是第一次接触网络接口,使用起来出现各种问题,如失败报错处理、token认证问题。没有进行代码模块异常处理的话,一旦网络接口报错,整个进程会直接结束运行,非常难受,然后还不知道具体哪里炸了。token认证主要是在传递url、payload、headers的时候字符串处理问题,要把变量传递进去,而不能传递成字符串。
- 使用pyqt实现ui界面时,每个窗口是一个单独的py文件,而各个窗口之间要进行传值(如token、user_id等),每个变量在单独函数中产生的变化不能直接传递给其他窗口,就会导致token认证已获得,却传不到对局、战局记录当中去,得到的是空值,然后就导致网络接口失败然后报错然后结束运行。
我太难了 - 使用pyqt的过程中非常痛苦,因为这个的教程非常少,很多细节问题很少人遇到,遇到了但去问的人就更少,而看到问题的大佬也不一定想回答的,
我哭了很多控件的具体功能都是没有完整的教程的,只能一个个具体的功能去找。 - 当然最困难的问题就是时间问题以及本身太菜了。
- 做过哪些尝试:先是百度自救一下,对于Python的字符串、列表、字典等的处理有了更深入的学习,一些问题自救失败后尝试询问同学大佬们。
- 是否解决:最终还是有惊无险的解决了各类问题,也是有够痛苦的。
- 有何收获:
收获可太多了嗷,一学分的课能学到这么多东西也真是有够赚的呢!
主要就是针对这些问题学会了很多以前所不懂的知识,在以后遇到这类问题也就有了一定的经验。也是第一次接触这么完整的去实现一个前端后端结合起来的项目,遇到的困难越多也就代表成长越多。也是再次挑战成功了自己的熬夜能力和自学能力了。
10、评价你的队友
- 值得学习的地方:我的队友贤哥很强,特别是理论知识,这是我最希望能学习到的一面,他对理论知识的掌握、以及各个方面、不同课程相联系的知识体系都很清楚,谈起来简直就是章口就来啊。不像我基本学了就忘,每次需要的时候还得花时间重新去温习甚至重新学习一遍,太难受了,也太不该了。希望不止这段结队时间,在以后也都能不断向他学习。
- 需要改进的地方:我的队友啥都好就是熬夜能力实属是个臭弟弟,漫漫长夜不能一起奋斗肝代码,真是不太彳亍。
王钟贤
- 值得学习的地方:我的队友很努力,每天都学习到很晚才睡,能够较快地掌握新知识并应用,这一点是我觉得最值得我学习的地方。
- 需要改进的地方:我的队友实在太忙了,很难有时间一起讨论问题。
11、学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 5 | 5 | 学习原型设计工具和简单的Python实现图形界面 |
2 | 500 | 500 | 10 | 15 | 基于贪心算法完成基础的算法 |
3 | 1100 | 1600 | 20 | 35 | 对算法进行收尾和检测,完成前端ui部分 |
12、ui部分gif展示
链接: https://pan.baidu.com/s/1GKx19-gmv4u1oOPeEkI8gA 提取码: 275y