第二次结对编程作业

第二次结对编程作业

==========
1、组队情况

181700140 吴超望 博客链接 Github项目地址
181700413 黄智[ 博客链接](https://www.cnblogs.com/181700413huangzhi/p/11768473.html
/)Github项目地址
181700144 张诗栋 博客链接Github项目地址

2、具体分工

吴超望:进行图形界面设计,讨论AI和UI代码实现
黄智:进行代码算法的设计编写
张诗栋:撰写博客,测试例子,测试AI的算法,以便于改进AI的算法

3、PSP表格

| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟)|
| -------- | -------- | -------- |
| Planning |计划 | 30|20
|Estimate |估计这个任务需要多少时间| 1200|1500
|Development |开发 |0|0
|Analysis |需求分析 (包括学习新技术) |100|100
|Design Spec |生成设计文档 |0|0
|Design Review |设计复审 |0|0
|Coding Standard|代码规范|0|0
|Design |具体设计|0|0
|Coding |具体编码|1000|1200
|Code Review |代码复审|0|0
|Test |测试|20|30
|Reporting |报告|35|50
|Test Repor |测试报告 |0|0
|Test Repor |计算工作量|15|20
|Postmortem & Process Improvement Plan|事后总结, 并提出过程改进计划|20|30
| |合计|265|1570

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

(1)网络接口的使用
注册接口:
import requests
import json
def regiseterAndBind(account,jwc):
url='http://www.revth.com:12300/auth/register2'
form_data={
"username": account["username"],
"password": account["password"],
"student_number":jwc["student_number"],
"student_password":jwc["student_password"]
}
headers={
"Content-Type":'application/json',
}
response=requests.post(url=url,headers=headers,data=json.dumps(form_data),verify=False);
print(response.text)
account=dict()
jwc=dict()
account["username"]=""
account["password"]=""
jwc["student_number"]=""
jwc["student_password"]=""
regiseterAndBind(account,jwc)

登入接口:
import requests
import json
def login(account):
url='http://www.revth.com:12300/auth/login'
form_data={
"username": account["username"],
"password": account["password"],
}
headers={
"Content-Type":'application/json',
}
response=requests.post(url=url,headers=headers,data=json.dumps(form_data),verify=False);
print(response.text)
account=dict()
account["username"]=""
account["password"]=""
login(account)

开始游戏接口:
import http.client
import json
import re
import requests
def game_open(token):
url='http://www.revth.com:12300/game/open'
headers={
"X-Auth-Token":token
}
response=requests.post(url=url,headers=headers,verify=False);
return response.text
tt=game_open(token)

(2代码组织与内部实现设计(类图)
说明算法的关键与关键实现部分流程图
UI和AI

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

5、关键代码解释

def dfs(list0):

    list1 = list0.copy()
    iter1 = itertools.combinations(list1, 5)
    start=time.clock()
    while 1:
        try:
            tup0 = next(iter1)
            listc = list(tup0)
            list1 = list0.copy()
            for i in range(5):
                list1.remove(listc[i])
            iter2 = itertools.combinations(list1, 5)
            while 1:
                try:
                    tup1 = next(iter2)
                    liste = list(tup1)
                    list2 = list0.copy()
                    for i in range(5):
                        list2.remove(listc[i])
                    for i in range(5):
                        list2.remove(liste[i])
                    a = getscore(listc, 5)
                    b = getscore(liste, 5)
                    c = getscore(list2, 3)
                    if a > b and b > c:
                        listsum[1] = a + 2 * b + 3 * c
                        if listsum[1] > listsum[0]:
                            listsum[0] = listsum[1]

                            lians.clear()
                            for k in range(3):
                                lians.append(list2[k])
                            for k in range(5):
                                lians.append(liste[k])
                            for k in range(5):
                                lians.append(listc[k])
                except StopIteration:
                    break

        except StopIteration:
            return

这个是核心部分,我用的是python自带的迭代器中的combination(其实我一开始是自己写排列组合的,但是发现它的速度和python自带的差不多快,就没用了,后面还考虑过把所有的排列预先放在文件里面,但是读文件很慢,时间反而更长了,也放弃了),进行排列组合,分成3堆牌,每堆牌都会记一个分数,第一次把牌型存下来,后面,如果分数大于上一次排列,就更新并记录下来,最后得到的就是我觉得比较优的牌型组合,当然,这会由于getscore函数而变化,getscore权重取得好,得到的结果就更好了,但是这个我难以分析怎样选取最优,大致设了一个权重

6、性能分析与改进

(1)改进思路
用C++

(2)性能分析

(3)消耗最大的函数
消耗最大的就是关键代码里的那个函数,没想到python这么慢,跑一个C(13,8)*C(8,5)加上牌型分数计算,居然跑了块10秒,这是我这次作业最痛心的地方,时间复杂度没算好,就开始写了,后面跑出来算法太慢了,导致我觉得这次作业做得很失败(早知道用C++了)

7、单元测试

构造思路
先判断是否特殊牌型,如是直接输出。否则调用暴搜函数将最优结果输出
单元测试代码
lians = lista.copy()
dfs(lista)
lans = []
st = ""
for i in range(0, len(lians)):
st = st + lians[i].color + str(lians[i].num) + " "
st = st.replace("10", "T")
st = st.replace("11", "J")
st = st.replace("12", "Q")
st = st.replace("13", "K")
st = st.replace("14", "A")
st1 = ""
st2 = ""
st3 = ""
for x in range(0, 8):
st1 = st1 + st[x]
for x in range(9, 23):
st2 = st2 + st[x]
for x in range(24, 38):
st3 = st3 + st[x]
st1 = st1.replace("T", "10")
st2 = st2.replace("T", "10")
st3 = st3.replace("T", "10")
print(st1)
print(st2)
print(st3)
lans.append(st1)
lans.append(st2)
lans.append(st3)
submit(idd, lans)
show_game()

8、Github的代码签入记录

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

(1)TKINTER库不熟悉
问题描述:TKINTER库不熟悉,需要上网查很多资料
是否解决:是,解决了,通过上网慢慢学习解决了。
(2)对于算法的时间复杂度没有很好预估
问题描述:算法在服务器空闲时不超时,忙时部分超时,不稳定
是否解决:还没解决

10、评价你的队友

吴超望
值得学习的地方:图形界面设计方面很强

需要改进的地方:没有

黄智
值得学习的地方:值得学习的地方太多了,队友很关心我们结对编程的进度,对算法实现能力强,思维活跃。

需要改进的地方:没有,太强了

11、学习进度条

第N周 新增代码 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 12 12 熟悉Axure软件,学会原型设计
2 1000 1000 26 26 学会了TKINTER库,学会了用网络接口
原文地址:https://www.cnblogs.com/1234a12/p/11768098.html