第二次结对编程作业
==========
1、组队情况
181700140 吴超望 博客链接 Github项目地址
181700413 黄智 博客链接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库,学会了用网络接口 |