zoukankan      html  css  js  c++  java
  • 第二次结对编程作业

    链接及地址

    翁正凯博客链接
    沈鸿骁博客链接
    项目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调用
  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/ZKweng/p/11766640.html
Copyright © 2011-2022 走看看