第二次结对编程作业

牧云@^-^@ 提交于 2019-12-01 10:16:57

1、链接

陈佳雯
王思婷
github

2、具体分工

  • 我们组的分工是这样的:第一周两个人一起探讨怎样实现代码以及设计的原型,确定任务的方向,决定以小程序模式实现UI设计,同时确定任务分工,一人主要负责AI算法的实现,一人则负责前端UI和接口的实现;第二周分别做自己的任务,在边学习边探讨的环境中完成任务的60%;第三周改进算法以及连接接口,分写博客,上传代码等。

3、PSP表格

PSP4.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
·Planning · 计划 120 20
· Estimate · 估计这个任务需要多少时间 10 20
·Development · 开发 2590 3870
· Analysis · 需求分析 (包括学习新技术) 500 820
· Design Spec · 生成设计文档 120 150
· Design Review · 设计复审 60 60
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 100 120
· Design · 具体设计 250 350
· Coding · 具体编码 1200 1650
· Code Review · 代码复审 100 160
· Test · 测试(自我测试,修改代码,提交修改) 100 340
·Reporting · 报告 60 100
· Test Repor · 测试报告 30 45
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 40 45
  · 合计 2600 3890

4、解题思路与设计说明

  • 网络接口的使用

    基本使用格式为:

    >>> r = requests.get('url')

    相当于requests,request(method='get', 'url')

    >>> r = requests.post('url', data = {'key':'value'})

    相当于requests,request(method='post', 'url', data = {'key':'value'})

    在本次作业中,出牌算法需要先进行用户和用户密码的注册的请求,具体代码如下:

    url = "https://api.shisanshui.rtxux.xyz/auth/register"
    
    payload = "{\"username\":\"test8\",\"password\":\"test8\"}"
    headers = {'content-type': 'application/json'}
    
    response = requests.request("POST", url, data=payload, headers=headers)

    登录和注册类似就不具体描述,需要从登录返回的json格式的数据中提取token值来开启战局。需要注意的是返回的json数据需要用json.loads()函数转为python可识别的对象。获得开启战局请求代码为:

    url = "https://api.shisanshui.rtxux.xyz/game/open"
    
    headers = {'x-auth-token': token}
    
    response = requests.request("POST", url, headers=headers)

    开启战局请求成功后,会返回战局id以及分配到的十三张牌。在算法进行处理后,将前中尾墩的字符串装入payload,再对出牌进行请求。代码如下:

    url = "https://api.shisanshui.rtxux.xyz/game/submit"
    
    payload = "{\"id\":"+id+",\"card\":[\""+qiandun+"\",\""+zhongdun+"\",\""+weidun+"\"]}"
    headers = {
        'content-type': "application/json",
        'x-auth-token': token
        }
    
    response = requests.request("POST", url, data=payload, headers=headers)

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

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

    代码最关键的部分就是确定前墩中墩尾墩的牌型,根据牌型设定权值,暴力枚举所有组合,比较权值大小。本次算法采用深度广度搜索来枚举所有组合。

  •  

     

5、关键代码解释

def dfs_1(d, index_1): # 暴力枚举
    for i in range(d, 14):
        s1[i] = 1 # 防止重复
        temp_1[index_1] = poker_1[i] #抽取
        if index_1 == r1: #完成尾墩抽取
            init_1() # 初始化dfs_2()函数
            dfs_2(1, 1) #进行中墩抽取,结构与dfs_1()类似
        else:
            dfs_1(i + 1, index_1 + 1)
        s1[i] = 0

 

6、性能分析与改进

  • 改进的思路

    python的整体运行时间要5-8s。在对于牌的排序时,优化了桶排序,减少了桶排序时间。以及尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层。例子:将长度计算提到循环外等。

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

     

     上图为内存使用情况。

     从运行时间可看出程序中消耗最大的函数是dfs_1(),因为是暴力枚举所有组合,所以用时较长。

7、单元测试

 

8、贴出Github的代码签入记录

 

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

  • 问题描述

    ①前端的图形界面完全一窍不通

    ②不会接口的调用

    ③算法对权值的确定

  • 做过哪些尝试

    在网上搜了很多教程,还好前端的小程序设计的案例超级多。好多部分的源码都是从网上借鉴的。

  • 是否解决

    解决了。面向百度编程真好,遇到问题即使百度是最好的学习方法。

  • 有何收获

    现在对软件的编程有个大概的了解。后端可以很难,但前端一定恶心你。也学到了好多东西,做好一个app实在是不容易。

10、评价你的队友

①值得学习的地方:对待设计很认真,在假期之余也不忘记任务,保持高效率实现过程,认真负责,有理有序,不慌不忙。

​ 需要改进的地方:在分别任务过程中缺少更多的交流,需要更好的配合合作,培养更好的默契。

②值得学习的地方:队友完成了前端的设计。在完成自己的任务同时,还帮我解决了许多问题。

​ 需要改进的地方:有这么强的队友,我觉得不需要改进。

11、学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 15 15 学会使用原型设计软件
2 120 120 10 10 算法简单实现牌的分类及 判断墩类的牌型
3 210 340 34 44 学习深度优先搜索算法。前端开始学习微信小程序的开发,设计了ui界面
4 530 540 43 87 完成出牌算法及优化,学习使用接口调用。ui界面完成接口的调用
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!