第二次结对编程作业

1、链接

陈佳雯
王思婷
UI视频
github
fork

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(start, end): # 暴力枚举
    for i in range(start, 14):
        temp[end] = poker[i] # 抽取 
     flag[i] = 1 # 防止重复
        if end == r1: #完成尾墩抽取,r1=5
            init_1() # 初始化dfs()函数
            dfss(1, 1) #进行中墩抽取,结构与dfs()类似
        else:
            dfs(i + 1, end + 1)
        flag[i] = 0

6、性能分析与改进

  • 改进的思路

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

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

以上为内存使用情况。

以上为代码覆盖率。

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

7、单元测试

测试了中墩的权值算法。前墩和尾墩单元测试函数类似。该代码验证的是给与中墩五张同花色的顺子手牌,zhong()函数应返回的是同花顺的权值也就是10。运行代码得出结果与预期一致。

import unittest
from shisanshui import *

class MyTestCase(unittest.TestCase):
    def test_tou(self):
        ans_3=[Card(2,3),Card(2,4),Card(2,5),Card(2,6),Card(2,7)]
        self.assertEqual(zhong(ans_3), 10)

if __name__ == '__main__':
    unittest.main()

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界面完成接口的调用
       |
原文地址:https://www.cnblogs.com/ztzd/p/11674176.html