第二次结对编程作业

ε祈祈猫儿з 提交于 2019-12-03 00:14:50

1.博客

队友
GitHub链接

2.具体分工

唐怡:负责AI算法
陈心怡:负责UI界面设计,接口

3.PSP(估计耗费时间)

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

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

4.1网络接口的使用

定义每个功能对应的函数,使用requests模块的post和get函数,得到所需要的数据,再用json模块处理得到所需要的数据。
登录模块具体代码示例:

def login(a,b):#登录账号
    url = 'http://api.revth.com/auth/login'
    headers = {
        "Content-Type": 'application/json',
    }
    form_data = {
        "username":a,
        "password":b,
    }
    response = requests.post(url=url, headers=headers, data=json.dumps(form_data), verify=False);
    print(response.text)
    if response.json()['status']==0:
        mytoken=response.json()['data']['token']
        start(mytoken)
    elif response.json()['status']==1005:
        messagebox.askokcancel('WARNING', '用户名或密码错误', icon='warning')

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

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

5.关键代码解释

ser1和ser2层级进行牌的分墩,这样迭代可以避免要对列表元素进行前移操作的麻烦,判断前一种牌型和现在牌型哪一种更好可以对每一种牌型进行计数然后再比较,选择更好的哪一种

def charge() :
    global gra,end_gra,ant
    global g1, g2, g3
    global b1, b2, b3
    for i in range(1,4): 
        ans_3[i] = comp_3[i]
    for i in range(1,6): 
        ans_2[i] = comp_2[i]
    for i in range(1,6): 
        ans_1[i] = comp_1[i]
    gra = 0.0
    j1 = qian()
    g1 = gra
    j2 = zhong()
    g2 = gra - g1
    j3 = hou()
    g3 = gra - (g1 + g2)
    if j1 > j2 or j2 > j3 or j1 > j3 :
        gra = 0
    if gra>end_gra :
        end_ans = gra
        a1 = g1; a2 = g2; a3 = g3
        for i in range(1,4):
            fin_3[i] = ans_3[i]
        for i in range(1,6):
            fin_2[i] = ans_2[i]
        for i in range(1,6): 
            fin_1[i] = ans_1[i]
    ant+=1

def ser2(d,index_2) :
    for i in range(d,9):
        comp_2[index_2] = two[i]
        f2[i] = 1
        if index_2 == c2 :
            index_3 = 0
            for j in range(1,9):
                if f2[j] == 0 :
                    index_3+=1
                    comp_3[index_3] = two[j]
            charge()
        else :
            ser2(i + 1, index_2 + 1)
        f2[i] = 0

def ser1(d, index_1): 
    for i in range(d,14):
        f1[i] = 1
        comp_1[index_1] = one[i]
        if index_1 == c1 :
            index = 0
            for j in range(1,14):
                if f1[j] == 0:
                    index+=1
                    two[index] = one[j]
            ser2(1, 1)
        else:
            ser1(i + 1, index_1 + 1)
        f1[i] = 0

6.性能分析与改进

6.1描述你改进的思路

加入特殊牌型的判断,对特殊牌型做特殊判断,在分堆前先进行特殊牌型判断

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

def hou():
    global gra
    for i in range(0, 16):
        hua[i] = 0
        number[i] = 0

    for i in range(0, 5):
        compp3[i] = ans_1[i + 1]

    compp3.sort(key=findnum)  
    for i in range(1, 6):
        ans_1[i] = compp3[i - 1]

    
    for i in range(1,6):
        hua[ans_1[i].flower] +=1
        number[ans_1[i].num]+=1

    k=1
    for i in range(1,5):
        if hua[i] == 5:
            for m in range(ans_1[1].num,ans_1[1].num+5):
                if number[m] < 1:
                    flag_3=0
                else:
                    flag_3=1
            if flag_3 == 1:
                k=(9.0 + 0.9 / 9 * (ans_1[1].num - 1)) * 1.0
                gra += k
                return k 

    k=1
    for i in range(5,0,-1):
        if number[ans_1[i].num] == 1:
            x = ans_1[i].num
        if number[ans_1[i].num] == 4:
            k=(8.0+ 0.9/(130+13)*((ans_1[i].num - 1)*10))*1.0
            gra += k
            return k

    k=1
    for i in range(5,0,-1):
        if number[ans_1[i].num] == 3:
            x = ans_1[i].num
            for j in range(5,0,-1):
                if number[ans_1[j].num] == 2:
                    k=(7.0 + 0.9 / (130 + 13)*((k - 1) * 10 + ans_1[j].num - 1))*1.0
                    gra += k
                    return k
    k=1
    for i in range(1,4+1):
        if hua[i] == 5:
            k=(6.0 + 0.9 / (130000 + 13000 + 1300+130+13)*((ans_1[5].num-1)*10000+(ans_1[4].num - 1)*1000 + (ans_1[3].num - 1) * 100 + (ans_1[2].num - 1) * 10 + (ans_1[1].num - 1)))*1.0
            gra +=k
            return k 

    k=1
    for i in range(ans_1[1].num,ans_1[1].num+5):
            if number[i] < 1:
                flag_3=0
            else:
                flag_3=1
    if flag_3 == 1 :
        k=(5.0 + 0.9/9*(ans_1[1].num - 1)*1.0)
        gra += k
        return k

    k=1
    for i in range(5,0,-1):
        if number[ans_1[i].num] == 3:
            x = ans_1[i].num
            for j in range(5,0,-1):
                if number[ans_1[j].num] == 1:
                    k=(4.0 + 0.9 / (1300+130+13) * ((k-1) * 100))
                    gra += k
                    return k

    k=1
    for i in range(5,0,-1):
        if number[ans_1[i].num] == 2:
            for j in range(5,0,-1):
                if (ans_1[i].num != ans_1[j].num) and number[ans_1[j].num] == 2 and abs(ans_1[i].num - ans_1[j].num) == 1 :
                    k= (3.0+ 0.9 / 10 * (ans_1[j].num-1-1)) * 1.0
                    gra +=k
                    return k # 

    k=1
    for i in range(5,0,-1):
        if number[ans_1[i].num] == 2:
            for j in range(5,0,-1):
                if (ans_1[i].num != ans_1[j].num) and number[ans_1[j].num] == 2 :
                    k=(2.0 +0.9 / (130+13) * ((ans_1[i].num - 1) * 10+ans_1[j].num-1)) * 1.0
                    gra += k
                    return k 

    k=1
    for i in range(5,0,-1):
        if number[ans_1[i].num] == 1:
            x = ans_1[i].num
        if number[ans_1[i].num] == 2:
            k=(1.0+0.9/(130+13)*((ans_1[i].num-1)*10+k-1))*1.0
            gra += k
            return k 
    k=(0.9 / (130000 + 13000 + 1300 + 130 + 13)*((ans_1[5].num - 1) * 10000 + (ans_1[4].num - 1) * 1000 + (ans_1[3].num - 1) * 100 + (ans_1[2].num - 1) * 10 + ans_1[1].num - 1))*1.0
    gra += k
    return  k

7.单元测试


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

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

9.1 问题描述

  • 如何进行前一次牌型和现一次牌型的优劣比较,如何列出可能出现每一种牌型
  • python界面设计不清楚
  • 不知如何使用接口

9.2 做过哪些尝试

  • 最开始尝试过用选择排序来进行每一种牌型的列出,但还是放弃了
  • 通过网络视频学习了python的tkinter
  • 问身边同学,看文档摸索

    9.3 是否解决

  • 并不算全部解决,虽然有所好转但时间依旧长,并没用大幅度改进
  • 掌握了tkinter插件的使用
  • 学会用requests模块的post、get函数从接口获取相关数据

    9.4 有何收获

  • 学习了如何精修了各种排序方法
  • 学会了如何使用python进行页面设计

    10.评价你的队友

    10.1值得学习的地方

  • 队友小天使,UI界面简雅大方,按键清晰一目了然,工作能力极强,值得我学习

    11、学习进度条

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 12 12 学习操作Axure RP
    2 300 300 10 22 学习python的tkinter模块,从服务器获取信息
    3 300 600 12 34 实现最优出牌
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!