1、链接
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界面完成接口的调用 |
|