第二次结对编程作业

1、在文章开头给出结对同学的博客链接、本作业博客的链接、你所Fork的同名仓库的Github项目地址

结对队友:覃鸿浩031702218
队友博客链接:https://www.cnblogs.com/yangminting/p/11745749.html
本博客链接:https://www.cnblogs.com/qingke1314/p/11741775.html
GitHub链接:https://github.com/qingke1314/shisanshui

2、给出具体分工

我负责UI和部分博客的编写
队友负责AI和部分博客的编写

3、给出PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 20
· Estimate · 估计这个任务需要多少时间 10 10
Development 开发 1785 2020
· Analysis · Analysis 1200 1100
· Design Spec · 生成设计文档 5 5
· Design Review · 设计复审 45 50
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 50 70
· Coding · 具体编码 300 600
· Code Review · 代码复审 45 300
· Test · 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 50 40
· Test Repor · 测试报告 60 50
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 1825 2345

4、解题思路描述与设计实现说明

4.1网络接口的使用

本次代码共使用了七个接口,分别是登录接口(玩家输入用户名密码后调用该接口取得id和token),注册接口(玩家输入用户名,密码然后调用接口进行注册),查看排行榜接口(使用get方法调用接口获得排行榜数据),查看某玩家历史战绩接口和查看具体战局接口(输入玩家id或者具体战局号使用get方法调用接口获得数据),开始战局接口(发送token,获得卡牌和战局id),出牌接口(发送战局id和出牌情况,调用出牌接口)。
其中排行榜和具体对战和往期对战使用了GET命令,如response = requests.request("GET", url)
而其余接口使用POST命令,如response = requests.request("POST", url, data=payload, headers=headers)。
登录:

排行榜:

注册:

历史战绩:

详细对局:

开始战局:

出牌:

4.2代码组织与内部实现设计(类图)

总代码有五个模块,分别是主模块(登录模块),注册模块,主窗口模块,算法模块和扑克图片及字典模块。
主模块有一个登录窗口类,如果选择注册,则输入用户名和密码则会调用接口,进入注册模块:它拥有一个注册窗口类,调用注册接口;
或者输入用户名密码登录进入主窗口模块,有两个类,透明按钮类,和主窗口类。
其中主窗口类中有四个界面,分别是对战界面,功能是调用取牌,出牌接口;排行榜界面,调用查看排行榜接口;查看往期对战界面,查看具体对战界面,分别调用对应的接口。
在对战界面点击取牌后会调用算法模块的算法类及其方法对牌进行排序并输出。
类图:

4.3说明算法的关键与关键实现部分流程图

算法的关键:change0函数

change0函数的实现流程图

5关键代码解释

5.1贴出你认为重要的/有价值的代码片段,并解释

UI:
调用开始战局接口获取战局ID和卡牌,再调用算法模块创建一个类实例,调用类的排序方法给牌进行排序,将三墩整合出来。
AI:

调用change0函数,每次要先把当前剩余未分配的牌进行转化解析,再利用相应的牌型函数找到各种牌型,直到剩余牌为0.

6性能分析与改进

6.1描述你改进的思路

UI改进思路:改进一:觉得登录界面太丑,将登录界面素材优化;改进二:觉得按钮太丑,部分按钮的透明化;改进三:觉得窗口太多,由弹出七个窗口删改为设置三个窗口;改进四:界面经常白屏,所以将按钮绑定的事件由点击按钮生成图片/数据改为先生成对应数据/图片,点击按钮则调用显示函数,点击返回调用隐藏函数;改进五:排行榜突然打不开,发现是排行榜格数不够,所以加了五十格。
AI改进思路:1、把得到的13张牌转化为13×4的二维矩阵
2、整个算法过程中需要用到的所有变量赋初值0或NULL

6.2展示性能分析图和程序中消耗最大的函数



消耗最多的函数为AllCard函数,该函数是用来对卡牌进行排序的,占用了28.6的运行时间。

7单元测试

7.1展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路

部分单元测试代码:

测试的函数分别是testsuanfa1,testsuanfa2,testsuanfa3,testsuanfa4。
构造数据的思路是先登录UI打了四把,然后根据拿到的牌作为测试数据,根据自己个人所能想到的最佳算法排序成为预期列表并作为预期值,调用ai对取到的牌进行分墩排序并存储进列表,作为测试列表,对两者进行单元测试,覆盖率为百分百。

8贴出Github的代码签入记录






9遇到的代码模块异常或结对困难及解决方法

9.1问题描述

UI部分:不会调用接口-->不会设置背景图-->背景图会掩盖文本或输入框-->不会在一个窗口中切换页面-->不会设置透明按钮-->没有52张扑克素材
AI部分:1、一开始不知道怎么把不同花色和不同牌面的牌进行解析
2、AI第一个版本循环出牌的时候一旦遇到双葫芦,后面的所有牌都会出现BUG,就出千了。

9.2 尝试解决

UI部分:有问题上百度,CSDN和博客园有很多教程,就是很多复制黏贴或没有帮助。几乎所有问题都是从百度上找到解决的。从什么都不会到搞出一个像样的ui,绕了很多弯路也在很多地方停滞不前。做完之后帮助提点别人的感觉蛮不错的。
AI部分:1、我想到了之前看过的一本书,用C语言实现象棋博弈,把一局里面剩下的棋子转化为二维矩阵,所以我一开始也这样试了,发现还不错。
2、这一般是循环过程中某些变量未初始化为0或空的问题,所以把代码从头到尾看一遍,把变量都输出,就能找到不正常的变量。

9.3是否解决

全部解决

9.4有何收获

算法方面,因为没有参与ai的设计,所以算法没有什么实践和进步;UI方面进步还是挺大的,包括之前学的pygame,接下来可以学爬虫了;现实生活方面,学到了团结合作的重要性,沟通的重要性,信任的重要性,1+1有时是大于2的。

10评价你的队友

10.1值得学习的地方

我队友平常话不多,一旦做起事情来特别认真,对自己要求也足够高,发现问题了尽管以为时间要不够了也还是尽自己能力去修改代码,是一个非常靠谱值得信任的人,是个值得深交的朋友。我想我需要学习他的认真,能干。

10.2需要改进的地方

讲道理我没觉得我队友有啥需要改进的地方,这次结对作业我们都早早的开始做自己该做的部分(UI与AI),尽管作业过程中有些磕磕绊绊,UI没有好看的素材,AI第一次老出千,但也很快就解决了。相处下来非常愉快。

11、学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 870 870 48 48 学会了wxPython
1 1014 1884 64 132 提高AI算法的编程思想,对以后的编程提供更大的信心
原文地址:https://www.cnblogs.com/qingke1314/p/11741775.html