第二次结对编程作业

链接及地址

翁正凯博客链接
沈鸿骁博客链接
项目GitHub地址


具体分工

  • AI部分由我负责
  • UI部分由我的队友沈鸿骁负责

PSP表格

PSP2.1 Personal Software Process Stages Estimated time(minutes) The actual time consuming(minutes)
Planning 计划 80 80
·Estimate ·估计这个任务需要多少时间 80 80
Development 开发 3080 3495
· Analysis · 需求分析 (包括学习新技术) 850 800
· Design Spec · 生成设计文档 50 60
· Design Review · 设计复审 20 15
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 60 55
· Design · 具体设计 990 1100
· Coding · 具体编码 1000 1350
· Code Review · 代码复审 50 50
· Test · 测试(自我测试,修改代码,提交修改) 60 65
Reporting 报告 90 75
· Test Repor · 测试报告 40 30
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 25
· 合计 430 455

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

网络接口的使用

API的使用是通过调用 requests库中的get/post函数实现get/post请求
下面以登录和登出为例:

def login(usename,password): # 登录
    global token,use
    url = "https://api.shisanshui.rtxux.xyz/auth/login"
    payload = "{\"username\":"+"\""+usename+"\""+","+"\"password\":"+"\""+password+"\""+"}"
    headers = {'content-type': 'application/json'}
    response = requests.post(url, data=payload, headers=headers)
    try:
        message = response.json() 
        token = message["data"]["token"]
        use=message["data"]["user_id"]
        print (response.text)
        return message
    except :
        time().sleep(5)
def logout():	# 登出
    global token
    url = "https://api.shisanshui.rtxux.xyz/auth/logout"
    headers = {"X-Auth-Token":token}
    response = requests.post(url,headers=headers)
    print(response.text)

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

AI部分

  • 代码组织
    首先前中后三墩牌:poker
    临时排列答案存放:ans
    完整排列答案存放:temp
    最终答案:result
    标记:lable
    花色:flower
    牌号:num

  • 这是我们的内部设计(类图)

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

算法的关键

普通牌型判断算法:对手上的牌进行组合,遍历所有情况,按照一定的比牌规则,选取牌型较优者作为当前最佳组合,循环往复,直至遍历完所有的情况,最后得到当前比牌策略下的最优选择。所以算法的关键是对牌型合法的判断和判牌的策略,经过多次测试验证,当前所选择的判牌策略在大多情况下能够实现最优。

关键实现部分流程图

流程图如下:

关键代码解释

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

  • 搜索
def dfs_1(d, index_1):
    for i in range(d,13+1):
        s1[i] = 1
        temp_1[index_1] = poker_1[i]
        if index_1 == 5 :
            if pddi()>=30.0:
                init_1()
                dfs_2(1, 1)
        else:
            dfs_1(i + 1, index_1 + 1)
        s1[i] = 0

def dfs_2(d,index_2) :#/*枚举组合*/
    for i in range(d,9):
        temp_2[index_2] = poker_2[i]
        s2[i] = 1
        if index_2 == 5 :
            init_2()
            contrast_ans()
        else :
            dfs_2(i + 1, index_2 + 1)
        s2[i] = 0

解释:通过暴力搜索从13张牌中选出5张,然后把剩下的8张牌返回组合搜索函数中进行搜索。

  • 权值判断

for i in range(5, 0, -1):
        if number[pddun[i].num] == 1:
            x = pddun[i].num
        if number[pddun[i].num] == 2:
            k = (20.0 + 1.0 / (130 + 13) * ((pddun[i].num - 1) * 10 + x - 1)) * 1.0
            return k 

    k = 10.0+(1.0 / (130000 + 13000 + 1300 + 130 + 13) * ((pddun[5].num - 1) * 10000 + (pddun[4].num - 1) * 1000 + (pddun[3].num - 1) * 100 + (pddun[2].num - 1) * 10 + pddun[1].num - 1)) * 1.0
    return k



for i in range(1,4+1):
        if hua[i] == 3:
            if shunzi3(ans_3[1].num) == 1:
                k=(9.0+0.9 / 11.0 * (ans_3[1].num - 1))
                score += k
                return k 
for i in range(3,0,-1):
        if number[ans_3[i].num] == 1:
            x = ans_3[i].num
        if number[ans_3[i].num] == 2:
            k=(1.0 + 0.9/(130+13)*((ans_3[i].num - 1)*10+x-1)*1.0)
            score += k
            return k
k=0.9 / (1300.0 + 130.0 + 13.0)*((ans_3[3].num - 1) * 100 + (ans_3[2].num - 1) * 10 + (ans_3[1].num - 1))
score += k
return k 

解释:总权值=细化级别*细化权值

性能分析与改进

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

性能分析图如下:

从图中可见消耗最大的函数是_pase(),该函数作用主要是用于解析出前中后三墩牌。

描述你改进的思路

因这一块解析代码是程序中核心代码,代码量大,调用关系复杂,进一步改进可能会影响到其他模块,导致其他模块也需要更改,工程量略大,而且改进空间也不是很大。权衡之下,不进行进一步改进。

单元测试

项目部分单元测试代码

这里选择得到前、中、后三墩的代码进行测试。

class MyTestCase(unittest.TestCase):
def testfirst(self):
    weig0 = 10
    weig1 = 7
    weig2 = 6
    self.assertEqual(shisanshui.first(str0), weig0)
    self.assertEqual(shisanshui.first(str1), weig1)
    self.assertEqual(shisanshui.first(str2), weig2)
def testsecond(self):
    weig0 = 10
    weig1 = 9
    weig2 = 8
    self.assertEqual(shisanshui.second(str0), weig0)
    self.assertEqual(shisanshui.second(str1), weig1)
    self.assertEqual(shisanshui.second(str2), weig2)
def testthird(self):
    weig0 = 10
    weig1 = 9
    weig2 = 8
    self.assertEqual(shisanshui.second(str0), weig0)
    self.assertEqual(shisanshui.second(str1), weig1)
    self.assertEqual(shisanshui.second(str2), weig2)

代码覆盖率:

说明测试的函数,构造测试数据的思路

此处挑出的是得到三墩牌的函数,由于前墩中墩后墩的结果会互相影响,即前墩挑出后要先把前墩的牌剔除再放入中墩函数进行计算,所以中墩的测试数据是在手动剔除前墩的基础上得到的,后墩同理。由此测出的结果也符合预期。

Github的代码签入记录

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

问题描述

  • 对十三水游戏规则的不熟悉
  • 不知道如何调用接口
  • 不知道前端后端是如何部署的
  • 不知道如何使用git提交代码
  • 对后端AI算法毫无头绪

做过哪些尝试

首先对于十三水游戏的熟悉,我们是通过在网站上搜索了一个在线十三水游戏进行实操,经过了几十把的对局,逐步掌握游戏规则。其次接口调用也是很令人头疼的,什么是“接口”,怎么”调用“,”我是谁“,”我怎么这么菜“,经过一番番的灵魂拷问,我们通过网课学习,终于了解了这个东西及其使用。git的使用也是通过网上查阅博客再次拾了起来,毕竟没有经常用,一段时间就忘光了。最后后端的AI算法可谓是”搞死人“,经过千辛万苦,在死皮赖脸抱大佬腿,我们勉勉强强搞了出来。

是否解决

解决。

有何收获

收获颇丰,学习到了许多新的知识,锻炼了编程能力,更多的是学会了如何与队友进行有效沟通,完成项目。

评价你的队友

评价人:沈鸿骁
值得学习的地方
翁同学在本次作业中负责后端,虽然也是第一次做这种项目,没什么经验,但是态度积极端正,还专门跑去图书馆借了项目开发实战的书来看。基本总是熬到很晚,前端有些问题也是在队友的启发下找到了突破点,为其努力钻研的精神点赞
需要改进的地方
无,真的挺好的了
评价人:翁正凯
值得学习的地方
鸿骁在本次作业中主动承担前端的开发设计,花了大量时间地去学习前端开发工具,每天晚上都搞得很晚,我都不知道他几点睡觉的,有点担心他的头发。最后做出来的效果很不错,其乐于探知与刻苦钻研的精神值得学习
需要改进的地方
没有,我觉得沈同学很ok。

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 15 15 学习python游戏开发流程
2 400 400 20 35 学习如何设计后端函数调用
3 600 1000 25 60 学习前端部署,API调用
posted @ 2019-10-30 18:33  Shen_HX  阅读(169)  评论(1编辑  收藏  举报