第二次结对编程作业

结对同学博客链接
本作业博客链接
Github项目地址
UI视频演示

具体分工

  • 王玥:前端(UI)和部分博客
  • 马丽华:算法(AI)和部分博客

PSP表格

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

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

  • 网络接口的使用
    前端

    后端
url = 'https://api.shisanshui.rtxux.xyz/auth/login'
data = {
  "username": "031702504",
  "password": "123"
}
r = requests.post(url,json=data)
print(r)
result1 = r.json()
print(result1)
token = result1['data']['token']

headers = {'x-auth-token': token}
url2='https://api.shisanshui.rtxux.xyz/game/open'
r2=requests.post(url2, headers=headers)
result2=r2.json()
print(result2)

id = str(result2["data"]["id"])
print(id)
data = {
  "id": id,
  "card": finalCardstr
}
print(data)
url3='https://api.shisanshui.rtxux.xyz/game/submit'
r3=requests.post(url3,json=data, headers=headers)
result3 = r3.json()
print(result3)
  • 代码组织与内部实现设计(类图)
类名 函数名 功能
Card getValue_Qiandun(Cardlist=[]) 获取前墩权值
- getValue_Zhongdun(Cardlist=[]) 获取中墩权值
- getValue_houdun(Cardlist=[]) 获取后墩权值
- calculateSub(Cardlist1=[], Cardlist2=[]) 差集运算
- findBiggestCard(Cardslist=[]) 找到最大牌值
- getCardlist(json_data) 获取牌
- cardsCombination(Cardlist=[]) 牌型的组合
- judge(Cardlist=[]) 判断牌型
- compare(Cardlist1=[], Cardlist2=[]) 比较大小
  • 算法的关键与流程图
    • 算法的关键在于怎样找出权值最大的牌型并放在合适的墩位
    • 大致流程与总体框架

关键代码解释

  • 部分代码
    • 获取权值
def getValue_Houdun(Cardlist=[]):
    value = 0  # 权值
    flag = Judge(Cardlist)
    if flag == 9:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Tonghuashun_Value_3[number]
    elif flag == 8:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Zhadan_Value_3[number]
    elif flag == 7:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Hulu_Value_3[number]
    elif flag == 6:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Tonghua_Value_3[number]
    elif flag == 5:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Shunzi_Value_3[number]
    elif flag == 4:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Santiao_Value_3[number]
    elif flag == 3:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Liandui_Value_3[number]
    elif flag == 2:
        Cardlist.sort()
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Erdui_Value_3[number]
    elif flag == 1:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Duizi_Value_3[number]
    else:
        print("error")
    return value


# 获取中墩牌的权值
def getValue_Zhongdun(Cardlist=[]):
    value = 0  # 权值
    flag = Judge(Cardlist)
    if flag == 9:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Tonghuashun_Value_2[number]
    elif flag == 8:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Zhadan_Value_2[number]
    elif flag == 7:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Hulu_Value_2[number]
    elif flag == 6:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Tonghua_Value_2[number]
    elif flag == 5:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Shunzi_Value_2[number]
    elif flag == 4:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Santiao_Value_2[number]
    elif flag == 3:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Liandui_Value_2[number]
    elif flag == 2:
        Cardlist.sort()
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Erdui_Value_2[number]
    elif flag == 1:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Duizi_Value_2[number]
    elif flag == 0:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Sanpai_Value_2[number]
    else:
        print("error")
    return value


def getValue_Qiandun(Cardlist=[]):
    value = 0  # 权值
    if len(Cardlist) == 1:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Sanpai_Value_1[number]
    elif len(Cardlist) == 2:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Duizi_Value_1[number]
    elif len(Cardlist) == 3:
        temp_card = FindBiggestCard(Cardlist)
        number = temp_card[0] - 2
        value = Santiao_Value_1[number]
    else:
        print("error")
    return value
  • 注意"J"、"Q"、"K"、"A"的大小

性能分析与改进

改进思路

前端

  • 一开始是各个页面都写一遍各个模块,后来发现有部分模块是重复的不需要写太多次,便把重复部分写入CSS文件,再将一些相关页面引入CSS文件从而起到模板的作用。
    后端
  • 如果后墩存在情况太多(如同花),就先找中墩的情况,然后回过来找剩余手牌中是否有比中墩大的后墩,可降低程序的循环消耗。
    -判断牌型的时候把时间的因素也考虑进去,在追求正确结果的基础上,尽量简化代码,消除不必要的循环的部分,将代码向时间方向进行改进。

性能分析图与消耗最大的函数

  • 消耗最大的函数是PostCards(data)

单元测试

部分单元测试代码

def cardsCombination(Cardlist=[]):
    temp_Cardlist = list.copy(Cardlist)
    AllCardsCombination = []
    temp_list = Common.Tonghuashun(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Zhadan(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Hulu(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Tonghua(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Shunzi(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Santiao(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Liandui(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Erdui(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    temp_list = Common.Duizi(temp_Cardlist)
    if temp_list != []:
        for item in temp_list:
            AllCardsCombination.append(item)
    return AllCardsCombination
  • 对牌进行组合
def CalculateSub(Cardlist1=[], Cardlist2=[]):
    chaji = list.copy(Cardlist1)  # 最后要返回的差集
    for item in Cardlist2:
        if item in Cardlist1:
            chaji.remove(item)
        else:
            print(item)
            print("error in fun CalculateSub")
    return chaji
  • 排除重复出现的牌

Github的代码签入记录

前端

后端

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

问题描述

  • 前端
    • 没有接触过前端
    • 对html等方面了解不多
    • 不懂如何才能使图片在点击时降低透明度
  • 后端
    • 对Python语言的不熟悉
    • 不知道怎样去写一副牌
    • 很多牌型不懂怎样把它表示出来
    • 怎样排列才能使牌的权值最大

做过哪些尝试

  • 前端:从网课开始学,遇到难题后通过百度了解具体细节代码如何实现
  • 后端:在网上找了一些代码作为参考,结合我们这次的作业做一些改动。

是否解决

  • 前端:解决了前端开发中遇到的一些问题,如怎样让图片在点击时降低透明度等。
  • 后端:有些解决了有些没解决,能写出来一写牌型但是组合和排列还是不知道怎么写。

有何收获

  • 前端:通过一系列的学习,基本掌握了html、css和js的用法,并且懂得如何制作出页面,以及学会了对页面进行排列布局。
  • 后端:相比以前写过的一些程序,写一种牌还是第一次,算是一个新鲜的体验,虽然这次体验让人心力交瘁,但是相比以前,我对于python的理解有所提高,更加深刻的认识到了学好一门编程语言刻不容缓。

评价你的队友

  • 值得学习的地方:学习速度很快,一旦开始就能够心无旁骛的学习下去,一边学习一边实践。
  • 需要改进的地方:可以早点开始。

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 20 20 学会使用Axure制作原型
2 0 0 15 15 学习Python的基本用法
3 94 94 23 23 试着用Python写程序
4 354 354 35 35 进一步完善代码
posted @ 2019-10-15 21:46  橘止大方  阅读(168)  评论(1编辑  收藏  举报